From e5714b47c625558ad9ddf1bf23a0958fe5509617 Mon Sep 17 00:00:00 2001 From: pestak Date: Fri, 9 Jan 2026 10:51:56 +0100 Subject: [PATCH] charger une image --- .gitignore | 1 + upLoadImage/composer.json | 18 + upLoadImage/composer.lock | 402 +++++ ...091629_4298_registre_a_decalage_schema.jpg | Bin 0 -> 307233 bytes upLoadImage/img/test.webp | Bin 0 -> 3504 bytes upLoadImage/index.php | 51 +- upLoadImage/vendor/autoload.php | 22 + upLoadImage/vendor/bin/var-dump-server | 119 ++ upLoadImage/vendor/composer/ClassLoader.php | 579 +++++++ .../vendor/composer/InstalledVersions.php | 396 +++++ upLoadImage/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 10 + .../vendor/composer/autoload_files.php | 12 + .../vendor/composer/autoload_namespaces.php | 9 + upLoadImage/vendor/composer/autoload_psr4.php | 14 + upLoadImage/vendor/composer/autoload_real.php | 50 + .../vendor/composer/autoload_static.php | 68 + upLoadImage/vendor/composer/installed.json | 404 +++++ upLoadImage/vendor/composer/installed.php | 68 + .../vendor/composer/platform_check.php | 25 + upLoadImage/vendor/intervention/gif/LICENSE | 21 + upLoadImage/vendor/intervention/gif/README.md | 101 ++ .../vendor/intervention/gif/composer.json | 44 + .../vendor/intervention/gif/phpunit.xml.dist | 13 + .../intervention/gif/src/AbstractEntity.php | 37 + .../gif/src/AbstractExtension.php | 10 + .../gif/src/Blocks/ApplicationExtension.php | 97 ++ .../intervention/gif/src/Blocks/Color.php | 83 + .../gif/src/Blocks/ColorTable.php | 121 ++ .../gif/src/Blocks/CommentExtension.php | 47 + .../gif/src/Blocks/DataSubBlock.php | 41 + .../gif/src/Blocks/FrameBlock.php | 250 +++ .../src/Blocks/GraphicControlExtension.php | 129 ++ .../intervention/gif/src/Blocks/Header.php | 38 + .../intervention/gif/src/Blocks/ImageData.php | 68 + .../gif/src/Blocks/ImageDescriptor.php | 194 +++ .../src/Blocks/LogicalScreenDescriptor.php | 201 +++ .../Blocks/NetscapeApplicationExtension.php | 56 + .../gif/src/Blocks/PlainTextExtension.php | 59 + .../gif/src/Blocks/TableBasedImage.php | 50 + .../intervention/gif/src/Blocks/Trailer.php | 12 + .../vendor/intervention/gif/src/Builder.php | 204 +++ .../vendor/intervention/gif/src/Decoder.php | 47 + .../gif/src/Decoders/AbstractDecoder.php | 159 ++ .../src/Decoders/AbstractPackedBitDecoder.php | 47 + .../Decoders/ApplicationExtensionDecoder.php | 75 + .../gif/src/Decoders/ColorDecoder.php | 42 + .../gif/src/Decoders/ColorTableDecoder.php | 27 + .../src/Decoders/CommentExtensionDecoder.php | 65 + .../gif/src/Decoders/DataSubBlockDecoder.php | 31 + .../gif/src/Decoders/FrameBlockDecoder.php | 52 + .../gif/src/Decoders/GifDataStreamDecoder.php | 58 + .../GraphicControlExtensionDecoder.php | 106 ++ .../gif/src/Decoders/HeaderDecoder.php | 40 + .../gif/src/Decoders/ImageDataDecoder.php | 51 + .../src/Decoders/ImageDescriptorDecoder.php | 93 + .../LogicalScreenDescriptorDecoder.php | 162 ++ .../NetscapeApplicationExtensionDecoder.php | 9 + .../Decoders/PlainTextExtensionDecoder.php | 74 + .../src/Decoders/TableBasedImageDecoder.php | 41 + .../intervention/gif/src/DisposalMethod.php | 13 + .../gif/src/Encoders/AbstractEncoder.php | 21 + .../Encoders/ApplicationExtensionEncoder.php | 37 + .../gif/src/Encoders/ColorEncoder.php | 38 + .../gif/src/Encoders/ColorTableEncoder.php | 33 + .../src/Encoders/CommentExtensionEncoder.php | 41 + .../gif/src/Encoders/DataSubBlockEncoder.php | 26 + .../gif/src/Encoders/FrameBlockEncoder.php | 47 + .../gif/src/Encoders/GifDataStreamEncoder.php | 73 + .../GraphicControlExtensionEncoder.php | 63 + .../gif/src/Encoders/HeaderEncoder.php | 26 + .../gif/src/Encoders/ImageDataEncoder.php | 42 + .../src/Encoders/ImageDescriptorEncoder.php | 95 ++ .../LogicalScreenDescriptorEncoder.php | 93 + .../NetscapeApplicationExtensionEncoder.php | 35 + .../Encoders/PlainTextExtensionEncoder.php | 55 + .../src/Encoders/TableBasedImageEncoder.php | 24 + .../gif/src/Encoders/TrailerEncoder.php | 26 + .../gif/src/Exceptions/DecoderException.php | 10 + .../gif/src/Exceptions/EncoderException.php | 10 + .../gif/src/Exceptions/FormatException.php | 10 + .../src/Exceptions/NotReadableException.php | 10 + .../gif/src/Exceptions/RuntimeException.php | 10 + .../intervention/gif/src/GifDataStream.php | 192 +++ .../vendor/intervention/gif/src/Splitter.php | 281 ++++ .../intervention/gif/src/Traits/CanDecode.php | 43 + .../intervention/gif/src/Traits/CanEncode.php | 43 + .../gif/src/Traits/CanHandleFiles.php | 53 + upLoadImage/vendor/intervention/image/LICENSE | 21 + .../vendor/intervention/image/composer.json | 51 + .../vendor/intervention/image/readme.md | 91 + .../src/Analyzers/ColorspaceAnalyzer.php | 12 + .../image/src/Analyzers/HeightAnalyzer.php | 12 + .../src/Analyzers/PixelColorAnalyzer.php | 18 + .../src/Analyzers/PixelColorsAnalyzer.php | 17 + .../image/src/Analyzers/ProfileAnalyzer.php | 12 + .../src/Analyzers/ResolutionAnalyzer.php | 12 + .../image/src/Analyzers/WidthAnalyzer.php | 12 + .../intervention/image/src/Collection.php | 217 +++ .../image/src/Colors/AbstractColor.php | 116 ++ .../image/src/Colors/AbstractColorChannel.php | 92 + .../image/src/Colors/Cmyk/Channels/Cyan.php | 20 + .../image/src/Colors/Cmyk/Channels/Key.php | 10 + .../src/Colors/Cmyk/Channels/Magenta.php | 10 + .../image/src/Colors/Cmyk/Channels/Yellow.php | 10 + .../image/src/Colors/Cmyk/Color.php | 153 ++ .../image/src/Colors/Cmyk/Colorspace.php | 77 + .../Cmyk/Decoders/StringColorDecoder.php | 36 + .../image/src/Colors/Hsl/Channels/Hue.php | 30 + .../src/Colors/Hsl/Channels/Luminance.php | 30 + .../src/Colors/Hsl/Channels/Saturation.php | 30 + .../image/src/Colors/Hsl/Color.php | 132 ++ .../image/src/Colors/Hsl/Colorspace.php | 137 ++ .../Hsl/Decoders/StringColorDecoder.php | 39 + .../image/src/Colors/Hsv/Channels/Hue.php | 30 + .../src/Colors/Hsv/Channels/Saturation.php | 30 + .../image/src/Colors/Hsv/Channels/Value.php | 30 + .../image/src/Colors/Hsv/Color.php | 132 ++ .../image/src/Colors/Hsv/Colorspace.php | 122 ++ .../Hsv/Decoders/StringColorDecoder.php | 39 + .../intervention/image/src/Colors/Profile.php | 22 + .../image/src/Colors/Rgb/Channels/Alpha.php | 18 + .../image/src/Colors/Rgb/Channels/Blue.php | 10 + .../image/src/Colors/Rgb/Channels/Green.php | 10 + .../image/src/Colors/Rgb/Channels/Red.php | 30 + .../image/src/Colors/Rgb/Color.php | 179 ++ .../image/src/Colors/Rgb/Colorspace.php | 135 ++ .../Colors/Rgb/Decoders/HexColorDecoder.php | 46 + .../Rgb/Decoders/HtmlColornameDecoder.php | 176 ++ .../Rgb/Decoders/StringColorDecoder.php | 49 + .../Rgb/Decoders/TransparentColorDecoder.php | 30 + .../vendor/intervention/image/src/Config.php | 70 + .../image/src/Decoders/Base64ImageDecoder.php | 12 + .../image/src/Decoders/BinaryImageDecoder.php | 12 + .../image/src/Decoders/ColorObjectDecoder.php | 27 + .../src/Decoders/DataUriImageDecoder.php | 12 + .../Decoders/EncodedImageObjectDecoder.php | 12 + .../src/Decoders/FilePathImageDecoder.php | 12 + .../src/Decoders/FilePointerImageDecoder.php | 12 + .../image/src/Decoders/ImageObjectDecoder.php | 27 + .../src/Decoders/NativeObjectDecoder.php | 12 + .../src/Decoders/SplFileInfoImageDecoder.php | 12 + .../image/src/Drivers/AbstractDecoder.php | 146 ++ .../image/src/Drivers/AbstractDriver.php | 127 ++ .../image/src/Drivers/AbstractEncoder.php | 42 + .../src/Drivers/AbstractFontProcessor.php | 172 ++ .../image/src/Drivers/AbstractFrame.php | 25 + .../Gd/Analyzers/ColorspaceAnalyzer.php | 23 + .../Drivers/Gd/Analyzers/HeightAnalyzer.php | 22 + .../Gd/Analyzers/PixelColorAnalyzer.php | 51 + .../Gd/Analyzers/PixelColorsAnalyzer.php | 30 + .../Gd/Analyzers/ResolutionAnalyzer.php | 23 + .../Drivers/Gd/Analyzers/WidthAnalyzer.php | 22 + .../image/src/Drivers/Gd/Cloner.php | 90 + .../image/src/Drivers/Gd/ColorProcessor.php | 148 ++ .../image/src/Drivers/Gd/Core.php | 117 ++ .../Drivers/Gd/Decoders/AbstractDecoder.php | 57 + .../Gd/Decoders/Base64ImageDecoder.php | 27 + .../Gd/Decoders/BinaryImageDecoder.php | 68 + .../Gd/Decoders/DataUriImageDecoder.php | 37 + .../Gd/Decoders/EncodedImageObjectDecoder.php | 27 + .../Gd/Decoders/FilePathImageDecoder.php | 60 + .../Gd/Decoders/FilePointerImageDecoder.php | 32 + .../Gd/Decoders/NativeObjectDecoder.php | 109 ++ .../Gd/Decoders/SplFileInfoImageDecoder.php | 28 + .../image/src/Drivers/Gd/Driver.php | 163 ++ .../src/Drivers/Gd/Encoders/AvifEncoder.php | 25 + .../src/Drivers/Gd/Encoders/BmpEncoder.php | 25 + .../src/Drivers/Gd/Encoders/GifEncoder.php | 64 + .../src/Drivers/Gd/Encoders/JpegEncoder.php | 36 + .../src/Drivers/Gd/Encoders/PngEncoder.php | 52 + .../src/Drivers/Gd/Encoders/WebpEncoder.php | 27 + .../image/src/Drivers/Gd/FontProcessor.php | 107 ++ .../image/src/Drivers/Gd/Frame.php | 193 +++ .../Gd/Modifiers/AlignRotationModifier.php | 52 + .../Modifiers/BlendTransparencyModifier.php | 36 + .../src/Drivers/Gd/Modifiers/BlurModifier.php | 28 + .../Gd/Modifiers/BrightnessModifier.php | 26 + .../Drivers/Gd/Modifiers/ColorizeModifier.php | 31 + .../Gd/Modifiers/ColorspaceModifier.php | 30 + .../Drivers/Gd/Modifiers/ContainModifier.php | 93 + .../Drivers/Gd/Modifiers/ContrastModifier.php | 26 + .../Gd/Modifiers/CoverDownModifier.php | 19 + .../Drivers/Gd/Modifiers/CoverModifier.php | 59 + .../src/Drivers/Gd/Modifiers/CropModifier.php | 78 + .../Gd/Modifiers/DrawBezierModifier.php | 234 +++ .../Gd/Modifiers/DrawEllipseModifier.php | 78 + .../Drivers/Gd/Modifiers/DrawLineModifier.php | 39 + .../Gd/Modifiers/DrawPixelModifier.php | 36 + .../Gd/Modifiers/DrawPolygonModifier.php | 51 + .../Gd/Modifiers/DrawRectangleModifier.php | 61 + .../src/Drivers/Gd/Modifiers/FillModifier.php | 67 + .../src/Drivers/Gd/Modifiers/FlipModifier.php | 26 + .../src/Drivers/Gd/Modifiers/FlopModifier.php | 26 + .../Drivers/Gd/Modifiers/GammaModifier.php | 26 + .../Gd/Modifiers/GreyscaleModifier.php | 26 + .../Drivers/Gd/Modifiers/InvertModifier.php | 26 + .../src/Drivers/Gd/Modifiers/PadModifier.php | 24 + .../Drivers/Gd/Modifiers/PixelateModifier.php | 26 + .../Drivers/Gd/Modifiers/PlaceModifier.php | 111 ++ .../Drivers/Gd/Modifiers/ProfileModifier.php | 25 + .../Gd/Modifiers/ProfileRemovalModifier.php | 24 + .../Gd/Modifiers/QuantizeColorsModifier.php | 65 + .../Gd/Modifiers/RemoveAnimationModifier.php | 26 + .../Gd/Modifiers/ResizeCanvasModifier.php | 32 + .../ResizeCanvasRelativeModifier.php | 16 + .../Gd/Modifiers/ResizeDownModifier.php | 16 + .../Drivers/Gd/Modifiers/ResizeModifier.php | 70 + .../Gd/Modifiers/ResolutionModifier.php | 29 + .../Drivers/Gd/Modifiers/RotateModifier.php | 106 ++ .../Gd/Modifiers/ScaleDownModifier.php | 21 + .../Drivers/Gd/Modifiers/ScaleModifier.php | 16 + .../Drivers/Gd/Modifiers/SharpenModifier.php | 45 + .../Gd/Modifiers/SliceAnimationModifier.php | 29 + .../src/Drivers/Gd/Modifiers/TextModifier.php | 145 ++ .../src/Drivers/Gd/Modifiers/TrimModifier.php | 85 + .../Imagick/Analyzers/ColorspaceAnalyzer.php | 23 + .../Imagick/Analyzers/HeightAnalyzer.php | 17 + .../Imagick/Analyzers/PixelColorAnalyzer.php | 36 + .../Imagick/Analyzers/PixelColorsAnalyzer.php | 25 + .../Imagick/Analyzers/ProfileAnalyzer.php | 25 + .../Imagick/Analyzers/ResolutionAnalyzer.php | 25 + .../Imagick/Analyzers/WidthAnalyzer.php | 17 + .../src/Drivers/Imagick/ColorProcessor.php | 45 + .../image/src/Drivers/Imagick/Core.php | 324 ++++ .../Imagick/Decoders/Base64ImageDecoder.php | 26 + .../Imagick/Decoders/BinaryImageDecoder.php | 47 + .../Imagick/Decoders/DataUriImageDecoder.php | 36 + .../Decoders/EncodedImageObjectDecoder.php | 27 + .../Imagick/Decoders/FilePathImageDecoder.php | 46 + .../Decoders/FilePointerImageDecoder.php | 32 + .../Imagick/Decoders/NativeObjectDecoder.php | 70 + .../Decoders/SplFileInfoImageDecoder.php | 27 + .../image/src/Drivers/Imagick/Driver.php | 175 ++ .../Drivers/Imagick/Encoders/AvifEncoder.php | 37 + .../Drivers/Imagick/Encoders/BmpEncoder.php | 29 + .../Drivers/Imagick/Encoders/GifEncoder.php | 34 + .../Drivers/Imagick/Encoders/HeicEncoder.php | 33 + .../Imagick/Encoders/Jpeg2000Encoder.php | 39 + .../Drivers/Imagick/Encoders/JpegEncoder.php | 57 + .../Drivers/Imagick/Encoders/PngEncoder.php | 46 + .../Drivers/Imagick/Encoders/TiffEncoder.php | 35 + .../Drivers/Imagick/Encoders/WebpEncoder.php | 47 + .../src/Drivers/Imagick/FontProcessor.php | 69 + .../image/src/Drivers/Imagick/Frame.php | 185 ++ .../Modifiers/AlignRotationModifier.php | 54 + .../Modifiers/BlendTransparencyModifier.php | 32 + .../Imagick/Modifiers/BlurModifier.php | 21 + .../Imagick/Modifiers/BrightnessModifier.php | 21 + .../Imagick/Modifiers/ColorizeModifier.php | 34 + .../Imagick/Modifiers/ColorspaceModifier.php | 51 + .../Imagick/Modifiers/ContainModifier.php | 95 ++ .../Imagick/Modifiers/ContrastModifier.php | 21 + .../Imagick/Modifiers/CoverDownModifier.php | 19 + .../Imagick/Modifiers/CoverModifier.php | 36 + .../Imagick/Modifiers/CropModifier.php | 75 + .../Imagick/Modifiers/DrawBezierModifier.php | 77 + .../Imagick/Modifiers/DrawEllipseModifier.php | 51 + .../Imagick/Modifiers/DrawLineModifier.php | 42 + .../Imagick/Modifiers/DrawPixelModifier.php | 30 + .../Imagick/Modifiers/DrawPolygonModifier.php | 64 + .../Modifiers/DrawRectangleModifier.php | 50 + .../Imagick/Modifiers/FillModifier.php | 63 + .../Imagick/Modifiers/FlipModifier.php | 21 + .../Imagick/Modifiers/FlopModifier.php | 21 + .../Imagick/Modifiers/GammaModifier.php | 21 + .../Imagick/Modifiers/GreyscaleModifier.php | 21 + .../Imagick/Modifiers/InvertModifier.php | 21 + .../Drivers/Imagick/Modifiers/PadModifier.php | 24 + .../Imagick/Modifiers/PixelateModifier.php | 34 + .../Imagick/Modifiers/PlaceModifier.php | 40 + .../Imagick/Modifiers/ProfileModifier.php | 25 + .../Modifiers/ProfileRemovalModifier.php | 25 + .../Modifiers/QuantizeColorsModifier.php | 37 + .../Modifiers/RemoveAnimationModifier.php | 26 + .../Modifiers/ResizeCanvasModifier.php | 27 + .../ResizeCanvasRelativeModifier.php | 16 + .../Imagick/Modifiers/ResizeDownModifier.php | 16 + .../Imagick/Modifiers/ResizeModifier.php | 36 + .../Imagick/Modifiers/ResolutionModifier.php | 20 + .../Imagick/Modifiers/RotateModifier.php | 28 + .../Imagick/Modifiers/ScaleDownModifier.php | 16 + .../Imagick/Modifiers/ScaleModifier.php | 16 + .../Imagick/Modifiers/SharpenModifier.php | 21 + .../Modifiers/SliceAnimationModifier.php | 24 + .../Imagick/Modifiers/StripMetaModifier.php | 34 + .../Imagick/Modifiers/TextModifier.php | 139 ++ .../Imagick/Modifiers/TrimModifier.php | 26 + .../image/src/Drivers/Specializable.php | 13 + .../src/Drivers/SpecializableAnalyzer.php | 21 + .../src/Drivers/SpecializableDecoder.php | 26 + .../src/Drivers/SpecializableEncoder.php | 13 + .../src/Drivers/SpecializableModifier.php | 21 + .../intervention/image/src/EncodedImage.php | 65 + .../image/src/Encoders/AutoEncoder.php | 25 + .../image/src/Encoders/AvifEncoder.php | 23 + .../image/src/Encoders/BmpEncoder.php | 15 + .../src/Encoders/FileExtensionEncoder.php | 69 + .../image/src/Encoders/FilePathEncoder.php | 38 + .../image/src/Encoders/GifEncoder.php | 20 + .../image/src/Encoders/HeicEncoder.php | 23 + .../image/src/Encoders/Jpeg2000Encoder.php | 23 + .../image/src/Encoders/JpegEncoder.php | 24 + .../image/src/Encoders/MediaTypeEncoder.php | 64 + .../image/src/Encoders/PngEncoder.php | 20 + .../image/src/Encoders/TiffEncoder.php | 23 + .../image/src/Encoders/WebpEncoder.php | 23 + .../src/Exceptions/AnimationException.php | 10 + .../image/src/Exceptions/ColorException.php | 10 + .../image/src/Exceptions/DecoderException.php | 10 + .../image/src/Exceptions/DriverException.php | 10 + .../image/src/Exceptions/EncoderException.php | 10 + .../image/src/Exceptions/FontException.php | 10 + .../src/Exceptions/GeometryException.php | 10 + .../image/src/Exceptions/InputException.php | 10 + .../src/Exceptions/NotSupportedException.php | 10 + .../src/Exceptions/NotWritableException.php | 10 + .../image/src/Exceptions/RuntimeException.php | 10 + .../vendor/intervention/image/src/File.php | 122 ++ .../intervention/image/src/FileExtension.php | 127 ++ .../vendor/intervention/image/src/Format.php | 165 ++ .../image/src/Geometry/Bezier.php | 202 +++ .../image/src/Geometry/Circle.php | 57 + .../image/src/Geometry/Ellipse.php | 103 ++ .../src/Geometry/Factories/BezierFactory.php | 88 + .../src/Geometry/Factories/CircleFactory.php | 102 ++ .../image/src/Geometry/Factories/Drawable.php | 56 + .../src/Geometry/Factories/EllipseFactory.php | 112 ++ .../src/Geometry/Factories/LineFactory.php | 122 ++ .../src/Geometry/Factories/PolygonFactory.php | 88 + .../Geometry/Factories/RectangleFactory.php | 112 ++ .../intervention/image/src/Geometry/Line.php | 127 ++ .../intervention/image/src/Geometry/Pixel.php | 45 + .../intervention/image/src/Geometry/Point.php | 145 ++ .../image/src/Geometry/Polygon.php | 390 +++++ .../image/src/Geometry/Rectangle.php | 335 ++++ .../src/Geometry/Tools/RectangleResizer.php | 341 ++++ .../Geometry/Traits/HasBackgroundColor.php | 42 + .../image/src/Geometry/Traits/HasBorder.php | 75 + .../vendor/intervention/image/src/Image.php | 1082 ++++++++++++ .../intervention/image/src/ImageManager.php | 143 ++ .../intervention/image/src/InputHandler.php | 132 ++ .../src/Interfaces/AnalyzerInterface.php | 17 + .../src/Interfaces/CollectionInterface.php | 71 + .../src/Interfaces/ColorChannelInterface.php | 57 + .../image/src/Interfaces/ColorInterface.php | 87 + .../Interfaces/ColorProcessorInterface.php | 24 + .../src/Interfaces/ColorspaceInterface.php | 20 + .../image/src/Interfaces/CoreInterface.php | 70 + .../image/src/Interfaces/DecoderInterface.php | 17 + .../Interfaces/DrawableFactoryInterface.php | 35 + .../src/Interfaces/DrawableInterface.php | 63 + .../image/src/Interfaces/DriverInterface.php | 92 + .../src/Interfaces/EncodedImageInterface.php | 23 + .../image/src/Interfaces/EncoderInterface.php | 17 + .../image/src/Interfaces/FileInterface.php | 39 + .../image/src/Interfaces/FontInterface.php | 123 ++ .../src/Interfaces/FontProcessorInterface.php | 52 + .../image/src/Interfaces/FrameInterface.php | 77 + .../image/src/Interfaces/ImageInterface.php | 771 +++++++++ .../src/Interfaces/ImageManagerInterface.php | 63 + .../src/Interfaces/InputHandlerInterface.php | 17 + .../src/Interfaces/ModifierInterface.php | 17 + .../image/src/Interfaces/PointInterface.php | 53 + .../image/src/Interfaces/ProfileInterface.php | 13 + .../src/Interfaces/ResolutionInterface.php | 53 + .../image/src/Interfaces/SizeInterface.php | 123 ++ .../src/Interfaces/SpecializableInterface.php | 30 + .../src/Interfaces/SpecializedInterface.php | 10 + .../intervention/image/src/MediaType.php | 143 ++ .../intervention/image/src/ModifierStack.php | 44 + .../src/Modifiers/AbstractDrawModifier.php | 47 + .../src/Modifiers/AlignRotationModifier.php | 12 + .../Modifiers/BlendTransparencyModifier.php | 54 + .../image/src/Modifiers/BlurModifier.php | 15 + .../src/Modifiers/BrightnessModifier.php | 15 + .../image/src/Modifiers/ColorizeModifier.php | 23 + .../src/Modifiers/ColorspaceModifier.php | 39 + .../image/src/Modifiers/ContainModifier.php | 44 + .../image/src/Modifiers/ContrastModifier.php | 20 + .../image/src/Modifiers/CoverDownModifier.php | 10 + .../image/src/Modifiers/CoverModifier.php | 49 + .../image/src/Modifiers/CropModifier.php | 44 + .../src/Modifiers/DrawBezierModifier.php | 29 + .../src/Modifiers/DrawEllipseModifier.php | 21 + .../image/src/Modifiers/DrawLineModifier.php | 29 + .../image/src/Modifiers/DrawPixelModifier.php | 23 + .../src/Modifiers/DrawPolygonModifier.php | 21 + .../src/Modifiers/DrawRectangleModifier.php | 29 + .../image/src/Modifiers/FillModifier.php | 23 + .../image/src/Modifiers/FlipModifier.php | 12 + .../image/src/Modifiers/FlopModifier.php | 12 + .../image/src/Modifiers/GammaModifier.php | 15 + .../image/src/Modifiers/GreyscaleModifier.php | 12 + .../image/src/Modifiers/InvertModifier.php | 12 + .../image/src/Modifiers/PadModifier.php | 24 + .../image/src/Modifiers/PixelateModifier.php | 15 + .../image/src/Modifiers/PlaceModifier.php | 46 + .../image/src/Modifiers/ProfileModifier.php | 16 + .../src/Modifiers/ProfileRemovalModifier.php | 12 + .../src/Modifiers/QuantizeColorsModifier.php | 22 + .../src/Modifiers/RemoveAnimationModifier.php | 55 + .../src/Modifiers/ResizeCanvasModifier.php | 49 + .../ResizeCanvasRelativeModifier.php | 10 + .../src/Modifiers/ResizeDownModifier.php | 10 + .../image/src/Modifiers/ResizeModifier.php | 20 + .../src/Modifiers/ResolutionModifier.php | 20 + .../image/src/Modifiers/RotateModifier.php | 24 + .../image/src/Modifiers/ScaleDownModifier.php | 10 + .../image/src/Modifiers/ScaleModifier.php | 10 + .../image/src/Modifiers/SharpenModifier.php | 15 + .../src/Modifiers/SliceAnimationModifier.php | 15 + .../image/src/Modifiers/TextModifier.php | 94 ++ .../image/src/Modifiers/TrimModifier.php | 20 + .../vendor/intervention/image/src/Origin.php | 88 + .../intervention/image/src/Resolution.php | 162 ++ .../src/Traits/CanBeDriverSpecialized.php | 77 + .../image/src/Traits/CanBuildFilePointer.php | 42 + .../image/src/Typography/Font.php | 279 +++ .../image/src/Typography/FontFactory.php | 141 ++ .../image/src/Typography/Line.php | 125 ++ .../image/src/Typography/TextBlock.php | 72 + .../deprecation-contracts/CHANGELOG.md | 5 + .../symfony/deprecation-contracts/LICENSE | 19 + .../symfony/deprecation-contracts/README.md | 26 + .../deprecation-contracts/composer.json | 35 + .../deprecation-contracts/function.php | 27 + .../vendor/symfony/polyfill-mbstring/LICENSE | 19 + .../symfony/polyfill-mbstring/Mbstring.php | 1045 ++++++++++++ .../symfony/polyfill-mbstring/README.md | 13 + .../Resources/unidata/caseFolding.php | 119 ++ .../Resources/unidata/lowerCase.php | 1397 ++++++++++++++++ .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1489 +++++++++++++++++ .../symfony/polyfill-mbstring/bootstrap.php | 172 ++ .../symfony/polyfill-mbstring/bootstrap80.php | 167 ++ .../symfony/polyfill-mbstring/composer.json | 39 + .../vendor/symfony/var-dumper/CHANGELOG.md | 122 ++ .../var-dumper/Caster/AddressInfoCaster.php | 82 + .../symfony/var-dumper/Caster/AmqpCaster.php | 214 +++ .../symfony/var-dumper/Caster/ArgsStub.php | 79 + .../symfony/var-dumper/Caster/Caster.php | 203 +++ .../symfony/var-dumper/Caster/ClassStub.php | 104 ++ .../symfony/var-dumper/Caster/ConstStub.php | 52 + .../symfony/var-dumper/Caster/CurlCaster.php | 31 + .../var-dumper/Caster/CutArrayStub.php | 30 + .../symfony/var-dumper/Caster/CutStub.php | 64 + .../symfony/var-dumper/Caster/DOMCaster.php | 209 +++ .../symfony/var-dumper/Caster/DateCaster.php | 129 ++ .../var-dumper/Caster/DoctrineCaster.php | 64 + .../symfony/var-dumper/Caster/DsCaster.php | 70 + .../symfony/var-dumper/Caster/DsPairStub.php | 28 + .../symfony/var-dumper/Caster/EnumStub.php | 29 + .../var-dumper/Caster/ExceptionCaster.php | 397 +++++ .../symfony/var-dumper/Caster/FFICaster.php | 171 ++ .../symfony/var-dumper/Caster/FiberCaster.php | 43 + .../symfony/var-dumper/Caster/FrameStub.php | 28 + .../symfony/var-dumper/Caster/GdCaster.php | 30 + .../symfony/var-dumper/Caster/GmpCaster.php | 34 + .../var-dumper/Caster/ImagineCaster.php | 39 + .../symfony/var-dumper/Caster/ImgStub.php | 26 + .../symfony/var-dumper/Caster/IntlCaster.php | 174 ++ .../symfony/var-dumper/Caster/LinkStub.php | 105 ++ .../var-dumper/Caster/MemcachedCaster.php | 83 + .../var-dumper/Caster/MysqliCaster.php | 33 + .../var-dumper/Caster/OpenSSLCaster.php | 69 + .../symfony/var-dumper/Caster/PdoCaster.php | 124 ++ .../symfony/var-dumper/Caster/PgSqlCaster.php | 158 ++ .../var-dumper/Caster/ProxyManagerCaster.php | 35 + .../var-dumper/Caster/RdKafkaCaster.php | 188 +++ .../symfony/var-dumper/Caster/RedisCaster.php | 152 ++ .../var-dumper/Caster/ReflectionCaster.php | 448 +++++ .../var-dumper/Caster/ResourceCaster.php | 92 + .../symfony/var-dumper/Caster/ScalarStub.php | 27 + .../var-dumper/Caster/SocketCaster.php | 64 + .../symfony/var-dumper/Caster/SplCaster.php | 258 +++ .../var-dumper/Caster/SqliteCaster.php | 32 + .../symfony/var-dumper/Caster/StubCaster.php | 94 ++ .../var-dumper/Caster/SymfonyCaster.php | 125 ++ .../symfony/var-dumper/Caster/TraceStub.php | 32 + .../var-dumper/Caster/UninitializedStub.php | 25 + .../symfony/var-dumper/Caster/UuidCaster.php | 32 + .../symfony/var-dumper/Caster/VirtualStub.php | 21 + .../var-dumper/Caster/XmlReaderCaster.php | 94 ++ .../var-dumper/Caster/XmlResourceCaster.php | 65 + .../var-dumper/Cloner/AbstractCloner.php | 413 +++++ .../var-dumper/Cloner/ClonerInterface.php | 23 + .../symfony/var-dumper/Cloner/Cursor.php | 43 + .../vendor/symfony/var-dumper/Cloner/Data.php | 429 +++++ .../var-dumper/Cloner/DumperInterface.php | 53 + .../vendor/symfony/var-dumper/Cloner/Stub.php | 76 + .../symfony/var-dumper/Cloner/VarCloner.php | 218 +++ .../Command/Descriptor/CliDescriptor.php | 78 + .../Descriptor/DumpDescriptorInterface.php | 23 + .../Command/Descriptor/HtmlDescriptor.php | 118 ++ .../var-dumper/Command/ServerDumpCommand.php | 111 ++ .../var-dumper/Dumper/AbstractDumper.php | 232 +++ .../symfony/var-dumper/Dumper/CliDumper.php | 667 ++++++++ .../ContextProvider/CliContextProvider.php | 32 + .../ContextProviderInterface.php | 22 + .../RequestContextProvider.php | 50 + .../ContextProvider/SourceContextProvider.php | 121 ++ .../Dumper/ContextualizedDumper.php | 40 + .../var-dumper/Dumper/DataDumperInterface.php | 27 + .../symfony/var-dumper/Dumper/HtmlDumper.php | 980 +++++++++++ .../var-dumper/Dumper/ServerDumper.php | 53 + .../Exception/ThrowingCasterException.php | 26 + upLoadImage/vendor/symfony/var-dumper/LICENSE | 19 + .../vendor/symfony/var-dumper/README.md | 15 + .../var-dumper/Resources/bin/var-dump-server | 72 + .../Resources/css/htmlDescriptor.css | 130 ++ .../var-dumper/Resources/functions/dump.php | 68 + .../var-dumper/Resources/js/htmlDescriptor.js | 10 + .../symfony/var-dumper/Server/Connection.php | 97 ++ .../symfony/var-dumper/Server/DumpServer.php | 109 ++ .../var-dumper/Test/VarDumperTestTrait.php | 95 ++ .../vendor/symfony/var-dumper/VarDumper.php | 120 ++ .../vendor/symfony/var-dumper/composer.json | 44 + 518 files changed, 40175 insertions(+), 44 deletions(-) create mode 100644 .gitignore create mode 100644 upLoadImage/composer.json create mode 100644 upLoadImage/composer.lock create mode 100644 upLoadImage/img/20260109091629_4298_registre_a_decalage_schema.jpg create mode 100644 upLoadImage/img/test.webp create mode 100644 upLoadImage/vendor/autoload.php create mode 100755 upLoadImage/vendor/bin/var-dump-server create mode 100644 upLoadImage/vendor/composer/ClassLoader.php create mode 100644 upLoadImage/vendor/composer/InstalledVersions.php create mode 100644 upLoadImage/vendor/composer/LICENSE create mode 100644 upLoadImage/vendor/composer/autoload_classmap.php create mode 100644 upLoadImage/vendor/composer/autoload_files.php create mode 100644 upLoadImage/vendor/composer/autoload_namespaces.php create mode 100644 upLoadImage/vendor/composer/autoload_psr4.php create mode 100644 upLoadImage/vendor/composer/autoload_real.php create mode 100644 upLoadImage/vendor/composer/autoload_static.php create mode 100644 upLoadImage/vendor/composer/installed.json create mode 100644 upLoadImage/vendor/composer/installed.php create mode 100644 upLoadImage/vendor/composer/platform_check.php create mode 100755 upLoadImage/vendor/intervention/gif/LICENSE create mode 100755 upLoadImage/vendor/intervention/gif/README.md create mode 100755 upLoadImage/vendor/intervention/gif/composer.json create mode 100755 upLoadImage/vendor/intervention/gif/phpunit.xml.dist create mode 100644 upLoadImage/vendor/intervention/gif/src/AbstractEntity.php create mode 100644 upLoadImage/vendor/intervention/gif/src/AbstractExtension.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/ApplicationExtension.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/Color.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/ColorTable.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/CommentExtension.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/DataSubBlock.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/FrameBlock.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/Header.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/ImageData.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/ImageDescriptor.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/PlainTextExtension.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/TableBasedImage.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Blocks/Trailer.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Builder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/AbstractDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/ColorDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/HeaderDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/PlainTextExtensionDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/DisposalMethod.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/AbstractEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/ApplicationExtensionEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/ColorEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/HeaderEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Encoders/TrailerEncoder.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Exceptions/DecoderException.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Exceptions/EncoderException.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Exceptions/FormatException.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Exceptions/NotReadableException.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Exceptions/RuntimeException.php create mode 100644 upLoadImage/vendor/intervention/gif/src/GifDataStream.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Splitter.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Traits/CanDecode.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Traits/CanEncode.php create mode 100644 upLoadImage/vendor/intervention/gif/src/Traits/CanHandleFiles.php create mode 100644 upLoadImage/vendor/intervention/image/LICENSE create mode 100644 upLoadImage/vendor/intervention/image/composer.json create mode 100644 upLoadImage/vendor/intervention/image/readme.md create mode 100644 upLoadImage/vendor/intervention/image/src/Analyzers/ColorspaceAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Analyzers/HeightAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Analyzers/PixelColorAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Analyzers/PixelColorsAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Analyzers/ProfileAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Analyzers/ResolutionAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Analyzers/WidthAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Collection.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/AbstractColor.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/AbstractColorChannel.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Channels/Key.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Channels/Magenta.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Channels/Yellow.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Color.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsl/Channels/Luminance.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsl/Channels/Saturation.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsl/Color.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsl/Colorspace.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsv/Channels/Saturation.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsv/Channels/Value.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsv/Color.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsv/Colorspace.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Profile.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Channels/Alpha.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Channels/Green.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Channels/Red.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Color.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Colorspace.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Config.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/BinaryImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/ColorObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/DataUriImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/EncodedImageObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/FilePathImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/FilePointerImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/ImageObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/NativeObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Decoders/SplFileInfoImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/AbstractDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/AbstractDriver.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/AbstractEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/AbstractFrame.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/HeightAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Cloner.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Core.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/Base64ImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/NativeObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Driver.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Frame.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Core.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Driver.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Frame.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/Specializable.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/SpecializableAnalyzer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/SpecializableDecoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/SpecializableEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Drivers/SpecializableModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/EncodedImage.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/AutoEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/AvifEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/BmpEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/FileExtensionEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/FilePathEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/GifEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/HeicEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/Jpeg2000Encoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/JpegEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/MediaTypeEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/PngEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/TiffEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Encoders/WebpEncoder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/AnimationException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/ColorException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/DecoderException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/DriverException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/EncoderException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/FontException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/GeometryException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/InputException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/NotSupportedException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/NotWritableException.php create mode 100644 upLoadImage/vendor/intervention/image/src/Exceptions/RuntimeException.php create mode 100644 upLoadImage/vendor/intervention/image/src/File.php create mode 100644 upLoadImage/vendor/intervention/image/src/FileExtension.php create mode 100644 upLoadImage/vendor/intervention/image/src/Format.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Bezier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Circle.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Ellipse.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Factories/Drawable.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Factories/EllipseFactory.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Factories/LineFactory.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Line.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Pixel.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Point.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Polygon.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Rectangle.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php create mode 100644 upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBorder.php create mode 100644 upLoadImage/vendor/intervention/image/src/Image.php create mode 100644 upLoadImage/vendor/intervention/image/src/ImageManager.php create mode 100644 upLoadImage/vendor/intervention/image/src/InputHandler.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/CollectionInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ColorInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ColorspaceInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/CoreInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/DecoderInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/DrawableFactoryInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/DrawableInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/DriverInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/EncodedImageInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/EncoderInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/FileInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/FontInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/FontProcessorInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/FrameInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ImageInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ImageManagerInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/InputHandlerInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ModifierInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/PointInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ProfileInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/ResolutionInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/SizeInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/SpecializableInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/Interfaces/SpecializedInterface.php create mode 100644 upLoadImage/vendor/intervention/image/src/MediaType.php create mode 100644 upLoadImage/vendor/intervention/image/src/ModifierStack.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/AlignRotationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/BlendTransparencyModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/BlurModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/BrightnessModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ColorizeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ColorspaceModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ContainModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ContrastModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/CoverDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/CoverModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/CropModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/DrawBezierModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/DrawLineModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/DrawPixelModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/DrawPolygonModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/FillModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/FlipModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/FlopModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/GammaModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/GreyscaleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/InvertModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/PadModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/PixelateModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/PlaceModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ProfileModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ProfileRemovalModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/QuantizeColorsModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/RemoveAnimationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ResizeDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ResizeModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ResolutionModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/RotateModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ScaleDownModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/ScaleModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/SharpenModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/SliceAnimationModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/TextModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Modifiers/TrimModifier.php create mode 100644 upLoadImage/vendor/intervention/image/src/Origin.php create mode 100644 upLoadImage/vendor/intervention/image/src/Resolution.php create mode 100644 upLoadImage/vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php create mode 100644 upLoadImage/vendor/intervention/image/src/Traits/CanBuildFilePointer.php create mode 100644 upLoadImage/vendor/intervention/image/src/Typography/Font.php create mode 100644 upLoadImage/vendor/intervention/image/src/Typography/FontFactory.php create mode 100644 upLoadImage/vendor/intervention/image/src/Typography/Line.php create mode 100644 upLoadImage/vendor/intervention/image/src/Typography/TextBlock.php create mode 100644 upLoadImage/vendor/symfony/deprecation-contracts/CHANGELOG.md create mode 100644 upLoadImage/vendor/symfony/deprecation-contracts/LICENSE create mode 100644 upLoadImage/vendor/symfony/deprecation-contracts/README.md create mode 100644 upLoadImage/vendor/symfony/deprecation-contracts/composer.json create mode 100644 upLoadImage/vendor/symfony/deprecation-contracts/function.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/LICENSE create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/README.md create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap80.php create mode 100644 upLoadImage/vendor/symfony/polyfill-mbstring/composer.json create mode 100644 upLoadImage/vendor/symfony/var-dumper/CHANGELOG.md create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/AddressInfoCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/AmqpCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ArgsStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/Caster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ClassStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ConstStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/CurlCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/CutArrayStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/CutStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/DOMCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/DateCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/DoctrineCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/DsCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/DsPairStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/EnumStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ExceptionCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/FFICaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/FiberCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/FrameStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/GdCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/GmpCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ImagineCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ImgStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/IntlCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/LinkStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/MemcachedCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/MysqliCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/OpenSSLCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/PdoCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/PgSqlCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/RedisCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ReflectionCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ResourceCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/ScalarStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/SocketCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/SplCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/SqliteCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/StubCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/SymfonyCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/TraceStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/UninitializedStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/UuidCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/VirtualStub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Cloner/AbstractCloner.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Cloner/ClonerInterface.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Cloner/Cursor.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Cloner/Data.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Cloner/DumperInterface.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Cloner/Stub.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Cloner/VarCloner.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Command/ServerDumpCommand.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/AbstractDumper.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/CliDumper.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/HtmlDumper.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Dumper/ServerDumper.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/LICENSE create mode 100644 upLoadImage/vendor/symfony/var-dumper/README.md create mode 100755 upLoadImage/vendor/symfony/var-dumper/Resources/bin/var-dump-server create mode 100644 upLoadImage/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css create mode 100644 upLoadImage/vendor/symfony/var-dumper/Resources/functions/dump.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js create mode 100644 upLoadImage/vendor/symfony/var-dumper/Server/Connection.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Server/DumpServer.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/VarDumper.php create mode 100644 upLoadImage/vendor/symfony/var-dumper/composer.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7410957 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +upLoadImage/vendor diff --git a/upLoadImage/composer.json b/upLoadImage/composer.json new file mode 100644 index 0000000..4f392ab --- /dev/null +++ b/upLoadImage/composer.json @@ -0,0 +1,18 @@ +{ + "name": "david/up-load-image", + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "authors": [ + { + "name": "pestak", + "email": "wawawaformation@gmail.com" + } + ], + "require": { + "intervention/image": "^3.11", + "symfony/var-dumper": "^7.4" + } +} diff --git a/upLoadImage/composer.lock b/upLoadImage/composer.lock new file mode 100644 index 0000000..118e8a8 --- /dev/null +++ b/upLoadImage/composer.lock @@ -0,0 +1,402 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "96bf757a5ca346a045f7159c18329289", + "packages": [ + { + "name": "intervention/gif", + "version": "4.2.4", + "source": { + "type": "git", + "url": "https://github.com/Intervention/gif.git", + "reference": "c3598a16ebe7690cd55640c44144a9df383ea73c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/gif/zipball/c3598a16ebe7690cd55640c44144a9df383ea73c", + "reference": "c3598a16ebe7690cd55640c44144a9df383ea73c", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Intervention\\Gif\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Native PHP GIF Encoder/Decoder", + "homepage": "https://github.com/intervention/gif", + "keywords": [ + "animation", + "gd", + "gif", + "image" + ], + "support": { + "issues": "https://github.com/Intervention/gif/issues", + "source": "https://github.com/Intervention/gif/tree/4.2.4" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "time": "2026-01-04T09:27:23+00:00" + }, + { + "name": "intervention/image", + "version": "3.11.6", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "intervention/gif": "^4.2", + "php": "^8.1" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "suggest": { + "ext-exif": "Recommended to be able to read EXIF data properly." + }, + "type": "library", + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io" + } + ], + "description": "PHP Image Processing", + "homepage": "https://image.intervention.io", + "keywords": [ + "gd", + "image", + "imagick", + "resize", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/3.11.6" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "time": "2025-12-17T13:38:29+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7e99bebcb3f90d8721890f2963463280848cba92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7e99bebcb3f90d8721890f2963463280848cba92", + "reference": "7e99bebcb3f90d8721890f2963463280848cba92", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-18T07:04:31+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/upLoadImage/img/20260109091629_4298_registre_a_decalage_schema.jpg b/upLoadImage/img/20260109091629_4298_registre_a_decalage_schema.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93bb08c196cee1f4e5a26e849f2cf74562fcee9d GIT binary patch literal 307233 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%0DM1K2F6`+RBA<0md{PPCZVs*s>5aq=(X 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 literal 0 HcmV?d00001 diff --git a/upLoadImage/index.php b/upLoadImage/index.php index a79fb18..db0662d 100644 --- a/upLoadImage/index.php +++ b/upLoadImage/index.php @@ -1,48 +1,11 @@ '; - - print_r($_FILES); - echo ''; +use Intervention\Image\ImageManager; +use Intervention\Image\Drivers\Gd\Driver; +require 'vendor/autoload.php'; - - if(isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) { - $dirUpload = 'img/'; - $tmpName = $_FILES['image']['tmp_name']; - $name = basename($_FILES['image']['name']); - $uploadPath = $dirUpload . $name; - if (move_uploaded_file($tmpName, $uploadPath)) { - echo 'Fichier téléchargé avec succès : ' . htmlspecialchars($name); - } else { - echo 'Erreur lors du déplacement du fichier téléchargé.'; - } - - - } else { - echo 'Erreur lors du téléchargement du fichier. Code d\'erreur : ' . $_FILES['image']['error']; - } -} -?> - - - - - - - Document - - -
-
- - - -
- -
- -
- - \ No newline at end of file +$interventionImage = new ImageManager(new Driver()); +$image = $interventionImage->read('img/registre_a_decalage_schema.jpg'); +$image->resize(300, 200); +$image->save('img/test.webp', 60); diff --git a/upLoadImage/vendor/autoload.php b/upLoadImage/vendor/autoload.php new file mode 100644 index 0000000..a344306 --- /dev/null +++ b/upLoadImage/vendor/autoload.php @@ -0,0 +1,22 @@ +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + return include("phpvfscomposer://" . __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server'); + } +} + +return include __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server'; diff --git a/upLoadImage/vendor/composer/ClassLoader.php b/upLoadImage/vendor/composer/ClassLoader.php new file mode 100644 index 0000000..7824d8f --- /dev/null +++ b/upLoadImage/vendor/composer/ClassLoader.php @@ -0,0 +1,579 @@ + + * 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/upLoadImage/vendor/composer/InstalledVersions.php b/upLoadImage/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..2052022 --- /dev/null +++ b/upLoadImage/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/upLoadImage/vendor/composer/LICENSE b/upLoadImage/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/upLoadImage/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/upLoadImage/vendor/composer/autoload_classmap.php b/upLoadImage/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..0fb0a2c --- /dev/null +++ b/upLoadImage/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $vendorDir . '/composer/InstalledVersions.php', +); diff --git a/upLoadImage/vendor/composer/autoload_files.php b/upLoadImage/vendor/composer/autoload_files.php new file mode 100644 index 0000000..7401525 --- /dev/null +++ b/upLoadImage/vendor/composer/autoload_files.php @@ -0,0 +1,12 @@ + $vendorDir . '/symfony/deprecation-contracts/function.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', + '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', +); diff --git a/upLoadImage/vendor/composer/autoload_namespaces.php b/upLoadImage/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..15a2ff3 --- /dev/null +++ b/upLoadImage/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/symfony/polyfill-mbstring'), + 'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'), + 'Intervention\\Image\\' => array($vendorDir . '/intervention/image/src'), + 'Intervention\\Gif\\' => array($vendorDir . '/intervention/gif/src'), + 'App\\' => array($baseDir . '/src'), +); diff --git a/upLoadImage/vendor/composer/autoload_real.php b/upLoadImage/vendor/composer/autoload_real.php new file mode 100644 index 0000000..de4f101 --- /dev/null +++ b/upLoadImage/vendor/composer/autoload_real.php @@ -0,0 +1,50 @@ +register(true); + + $filesToLoad = \Composer\Autoload\ComposerStaticInit3b209c2e463c36e66e539cfd67f7b941::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); + } + + return $loader; + } +} diff --git a/upLoadImage/vendor/composer/autoload_static.php b/upLoadImage/vendor/composer/autoload_static.php new file mode 100644 index 0000000..f1b5b98 --- /dev/null +++ b/upLoadImage/vendor/composer/autoload_static.php @@ -0,0 +1,68 @@ + __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', + '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'S' => + array ( + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Component\\VarDumper\\' => 28, + ), + 'I' => + array ( + 'Intervention\\Image\\' => 19, + 'Intervention\\Gif\\' => 17, + ), + 'A' => + array ( + 'App\\' => 4, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Component\\VarDumper\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/var-dumper', + ), + 'Intervention\\Image\\' => + array ( + 0 => __DIR__ . '/..' . '/intervention/image/src', + ), + 'Intervention\\Gif\\' => + array ( + 0 => __DIR__ . '/..' . '/intervention/gif/src', + ), + 'App\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit3b209c2e463c36e66e539cfd67f7b941::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit3b209c2e463c36e66e539cfd67f7b941::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit3b209c2e463c36e66e539cfd67f7b941::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/upLoadImage/vendor/composer/installed.json b/upLoadImage/vendor/composer/installed.json new file mode 100644 index 0000000..e61db4b --- /dev/null +++ b/upLoadImage/vendor/composer/installed.json @@ -0,0 +1,404 @@ +{ + "packages": [ + { + "name": "intervention/gif", + "version": "4.2.4", + "version_normalized": "4.2.4.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/gif.git", + "reference": "c3598a16ebe7690cd55640c44144a9df383ea73c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/gif/zipball/c3598a16ebe7690cd55640c44144a9df383ea73c", + "reference": "c3598a16ebe7690cd55640c44144a9df383ea73c", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "time": "2026-01-04T09:27:23+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Intervention\\Gif\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Native PHP GIF Encoder/Decoder", + "homepage": "https://github.com/intervention/gif", + "keywords": [ + "animation", + "gd", + "gif", + "image" + ], + "support": { + "issues": "https://github.com/Intervention/gif/issues", + "source": "https://github.com/Intervention/gif/tree/4.2.4" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "install-path": "../intervention/gif" + }, + { + "name": "intervention/image", + "version": "3.11.6", + "version_normalized": "3.11.6.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "intervention/gif": "^4.2", + "php": "^8.1" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "suggest": { + "ext-exif": "Recommended to be able to read EXIF data properly." + }, + "time": "2025-12-17T13:38:29+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io" + } + ], + "description": "PHP Image Processing", + "homepage": "https://image.intervention.io", + "keywords": [ + "gd", + "image", + "imagick", + "resize", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/3.11.6" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "install-path": "../intervention/image" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "version_normalized": "3.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "time": "2024-09-25T14:21:43+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/deprecation-contracts" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2024-12-23T08:48:59+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-mbstring" + }, + { + "name": "symfony/var-dumper", + "version": "v7.4.3", + "version_normalized": "7.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7e99bebcb3f90d8721890f2963463280848cba92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7e99bebcb3f90d8721890f2963463280848cba92", + "reference": "7e99bebcb3f90d8721890f2963463280848cba92", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "time": "2025-12-18T07:04:31+00:00", + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/var-dumper" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/upLoadImage/vendor/composer/installed.php b/upLoadImage/vendor/composer/installed.php new file mode 100644 index 0000000..893f328 --- /dev/null +++ b/upLoadImage/vendor/composer/installed.php @@ -0,0 +1,68 @@ + array( + 'name' => 'david/up-load-image', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => 'd0f4ed4eb2a09d5a71e5a7ff525514067ef181ae', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + 'david/up-load-image' => array( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => 'd0f4ed4eb2a09d5a71e5a7ff525514067ef181ae', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'intervention/gif' => array( + 'pretty_version' => '4.2.4', + 'version' => '4.2.4.0', + 'reference' => 'c3598a16ebe7690cd55640c44144a9df383ea73c', + 'type' => 'library', + 'install_path' => __DIR__ . '/../intervention/gif', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'intervention/image' => array( + 'pretty_version' => '3.11.6', + 'version' => '3.11.6.0', + 'reference' => '5f6d27d9fd56312c47f347929e7ac15345c605a1', + 'type' => 'library', + 'install_path' => __DIR__ . '/../intervention/image', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/deprecation-contracts' => array( + 'pretty_version' => 'v3.6.0', + 'version' => '3.6.0.0', + 'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-mbstring' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/var-dumper' => array( + 'pretty_version' => 'v7.4.3', + 'version' => '7.4.3.0', + 'reference' => '7e99bebcb3f90d8721890f2963463280848cba92', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/var-dumper', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/upLoadImage/vendor/composer/platform_check.php b/upLoadImage/vendor/composer/platform_check.php new file mode 100644 index 0000000..14bf88d --- /dev/null +++ b/upLoadImage/vendor/composer/platform_check.php @@ -0,0 +1,25 @@ += 80200)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.2.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) + ); +} diff --git a/upLoadImage/vendor/intervention/gif/LICENSE b/upLoadImage/vendor/intervention/gif/LICENSE new file mode 100755 index 0000000..d621d28 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020-present Oliver Vogel + +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/upLoadImage/vendor/intervention/gif/README.md b/upLoadImage/vendor/intervention/gif/README.md new file mode 100755 index 0000000..26a019f --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/README.md @@ -0,0 +1,101 @@ +# Intervention GIF +## Native PHP GIF Encoder/Decoder + +[![Latest Version](https://img.shields.io/packagist/v/intervention/gif.svg)](https://packagist.org/packages/intervention/gif) +![build](https://github.com/Intervention/gif/actions/workflows/build.yml/badge.svg) +[![Monthly Downloads](https://img.shields.io/packagist/dm/intervention/gif.svg)](https://packagist.org/packages/intervention/gif/stats) +[![Support me on Ko-fi](https://raw.githubusercontent.com/Intervention/gif/main/.github/images/support.svg)](https://ko-fi.com/interventionphp) + +Intervention GIF is a PHP encoder and decoder for the GIF image format that +does not depend on any image processing extension. + +Only the special `Splitter::class` class divides the data stream of an animated +GIF into individual `GDImage` objects for each frame and is therefore dependent +on the GD library. + +The library is the main component of [Intervention +Image](https://github.com/Intervention/image) for processing animated GIF files +with the GD library, but also works independently. + +## Installation + +You can easily install this package using [Composer](https://getcomposer.org). +Just request the package with the following command: + +```bash +composer require intervention/gif +``` + +## Code Examples + +### Decoding + +```php +use Intervention\Gif\Decoder; + +// Decode filepath to Intervention\Gif\GifDataStream::class +$gif = Decoder::decode('images/animation.gif'); + +// Decoder can also handle binary content directly +$gif = Decoder::decode($contents); +``` + +### Encoding + +Use the Builder class to create a new GIF image. + +```php +use Intervention\Gif\Builder; + +// create new gif canvas +$gif = Builder::canvas(width: 32, height: 32); + +// add animation frames to canvas +$delay = .25; // delay in seconds after next frame is displayed +$left = 0; // position offset (left) +$top = 0; // position offset (top) + +// add animation frames with optional delay in seconds +// and optional position offset for each frame +$gif->addFrame('images/frame01.gif', $delay, $left, $top); +$gif->addFrame('images/frame02.gif', $delay, $left); +$gif->addFrame('images/frame03.gif', $delay); +$gif->addFrame('images/frame04.gif'); + +// set loop count; 0 for infinite looping +$gif->setLoops(12); + +// encode +$data = $gif->encode(); +``` + + +## Requirements + +- PHP >= 8.1 + +## Development & Testing + +With this package comes a Docker image to build a test suite and analysis +container. To build this container you have to have Docker installed on your +system. You can run all tests with this command. + +```bash +docker-compose run --rm --build tests +``` + +Run the static analyzer on the code base. + +```bash +docker-compose run --rm --build analysis +``` + +## Authors + +This library is developed and maintained by [Oliver Vogel](https://intervention.io) + +Thanks to the community of [contributors](https://github.com/Intervention/gif/graphs/contributors) who have helped to improve this project. + +## License + +Intervention GIF is licensed under the [MIT License](LICENSE). diff --git a/upLoadImage/vendor/intervention/gif/composer.json b/upLoadImage/vendor/intervention/gif/composer.json new file mode 100755 index 0000000..0fd37ab --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/composer.json @@ -0,0 +1,44 @@ +{ + "name": "intervention/gif", + "description": "Native PHP GIF Encoder/Decoder", + "homepage": "https://github.com/intervention/gif", + "keywords": [ + "image", + "gd", + "gif", + "animation" + ], + "license": "MIT", + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "phpstan/phpstan": "^2.1", + "squizlabs/php_codesniffer": "^3.8", + "slevomat/coding-standard": "~8.0" + }, + "autoload": { + "psr-4": { + "Intervention\\Gif\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Intervention\\Gif\\Tests\\": "tests" + } + }, + "minimum-stability": "stable", + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/upLoadImage/vendor/intervention/gif/phpunit.xml.dist b/upLoadImage/vendor/intervention/gif/phpunit.xml.dist new file mode 100755 index 0000000..6a2bf07 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/phpunit.xml.dist @@ -0,0 +1,13 @@ + + + + + ./tests/Unit/ + + + + + src + + + diff --git a/upLoadImage/vendor/intervention/gif/src/AbstractEntity.php b/upLoadImage/vendor/intervention/gif/src/AbstractEntity.php new file mode 100644 index 0000000..3a09f6f --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/AbstractEntity.php @@ -0,0 +1,37 @@ +getShortName(); + } + + /** + * Cast object to string + * + * @throws EncoderException + */ + public function __toString(): string + { + return $this->encode(); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/AbstractExtension.php b/upLoadImage/vendor/intervention/gif/src/AbstractExtension.php new file mode 100644 index 0000000..329ac50 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/AbstractExtension.php @@ -0,0 +1,10 @@ + + */ + protected array $blocks = []; + + /** + * Get size of block + */ + public function getBlockSize(): int + { + return strlen($this->application); + } + + /** + * Set application name + */ + public function setApplication(string $value): self + { + $this->application = $value; + + return $this; + } + + /** + * Get application name + */ + public function getApplication(): string + { + return $this->application; + } + + /** + * Add block to application extension + */ + public function addBlock(DataSubBlock $block): self + { + $this->blocks[] = $block; + + return $this; + } + + /** + * Set data sub blocks of instance + * + * @param array $blocks + */ + public function setBlocks(array $blocks): self + { + $this->blocks = $blocks; + + return $this; + } + + /** + * Get blocks of ApplicationExtension + * + * @return array + */ + public function getBlocks(): array + { + return $this->blocks; + } + + /** + * Get first block of ApplicationExtension + * + * @throws RuntimeException + */ + public function getFirstBlock(): DataSubBlock + { + if (!array_key_exists(0, $this->blocks)) { + throw new RuntimeException('Unable to retrieve data sub block.'); + } + + return $this->blocks[0]; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/Color.php b/upLoadImage/vendor/intervention/gif/src/Blocks/Color.php new file mode 100644 index 0000000..b0eea21 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/Color.php @@ -0,0 +1,83 @@ +r; + } + + /** + * Set red value + */ + public function setRed(int $value): self + { + $this->r = $value; + + return $this; + } + + /** + * Get green value + */ + public function getGreen(): int + { + return $this->g; + } + + /** + * Set green value + */ + public function setGreen(int $value): self + { + $this->g = $value; + + return $this; + } + + /** + * Get blue value + */ + public function getBlue(): int + { + return $this->b; + } + + /** + * Set blue value + */ + public function setBlue(int $value): self + { + $this->b = $value; + + return $this; + } + + /** + * Return hash value of current color + */ + public function getHash(): string + { + return md5($this->r . $this->g . $this->b); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/ColorTable.php b/upLoadImage/vendor/intervention/gif/src/Blocks/ColorTable.php new file mode 100644 index 0000000..1a800cc --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/ColorTable.php @@ -0,0 +1,121 @@ + $colors + * @return void + */ + public function __construct(protected array $colors = []) + { + // + } + + /** + * Return array of current colors + * + * @return array + */ + public function getColors(): array + { + return array_values($this->colors); + } + + /** + * Add color to table + */ + public function addRgb(int $r, int $g, int $b): self + { + $this->addColor(new Color($r, $g, $b)); + + return $this; + } + + /** + * Add color to table + */ + public function addColor(Color $color): self + { + $this->colors[] = $color; + + return $this; + } + + /** + * Reset colors to array of color objects + * + * @param array $colors + */ + public function setColors(array $colors): self + { + $this->empty(); + foreach ($colors as $color) { + $this->addColor($color); + } + + return $this; + } + + /** + * Count colors of current instance + */ + public function countColors(): int + { + return count($this->colors); + } + + /** + * Determine if any colors are present on the current table + */ + public function hasColors(): bool + { + return $this->countColors() >= 1; + } + + /** + * Empty color table + */ + public function empty(): self + { + $this->colors = []; + + return $this; + } + + /** + * Get size of color table in logical screen descriptor + */ + public function getLogicalSize(): int + { + return match ($this->countColors()) { + 4 => 1, + 8 => 2, + 16 => 3, + 32 => 4, + 64 => 5, + 128 => 6, + 256 => 7, + default => 0, + }; + } + + /** + * Calculate the number of bytes contained by the current table + */ + public function getByteSize(): int + { + if (!$this->hasColors()) { + return 0; + } + + return 3 * pow(2, $this->getLogicalSize() + 1); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/CommentExtension.php b/upLoadImage/vendor/intervention/gif/src/Blocks/CommentExtension.php new file mode 100644 index 0000000..082b770 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/CommentExtension.php @@ -0,0 +1,47 @@ + + */ + protected array $comments = []; + + /** + * Get all or one comment + * + * @return array + */ + public function getComments(): array + { + return $this->comments; + } + + /** + * Get one comment by key + */ + public function getComment(int $key): mixed + { + return $this->comments[$key] ?? null; + } + + /** + * Set comment text + */ + public function addComment(string $value): self + { + $this->comments[] = $value; + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/DataSubBlock.php b/upLoadImage/vendor/intervention/gif/src/Blocks/DataSubBlock.php new file mode 100644 index 0000000..0480d20 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/DataSubBlock.php @@ -0,0 +1,41 @@ +getSize() > 255) { + throw new FormatException( + 'Data Sub-Block can not have a block size larger than 255 bytes.' + ); + } + } + + /** + * Return size of current block + */ + public function getSize(): int + { + return strlen($this->value); + } + + /** + * Return block value + */ + public function getValue(): string + { + return $this->value; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/FrameBlock.php b/upLoadImage/vendor/intervention/gif/src/Blocks/FrameBlock.php new file mode 100644 index 0000000..01fcfe2 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/FrameBlock.php @@ -0,0 +1,250 @@ + $applicationExtensions + */ + protected array $applicationExtensions = []; + + /** + * @var array $commentExtensions + */ + protected array $commentExtensions = []; + + public function __construct( + protected ImageDescriptor $imageDescriptor = new ImageDescriptor(), + protected ImageData $imageData = new ImageData() + ) { + // + } + + public function addEntity(AbstractEntity $entity): self + { + return match (true) { + $entity instanceof TableBasedImage => $this->setTableBasedImage($entity), + $entity instanceof GraphicControlExtension => $this->setGraphicControlExtension($entity), + $entity instanceof ImageDescriptor => $this->setImageDescriptor($entity), + $entity instanceof ColorTable => $this->setColorTable($entity), + $entity instanceof ImageData => $this->setImageData($entity), + $entity instanceof PlainTextExtension => $this->setPlainTextExtension($entity), + $entity instanceof NetscapeApplicationExtension, + $entity instanceof ApplicationExtension => $this->addApplicationExtension($entity), + $entity instanceof CommentExtension => $this->addCommentExtension($entity), + default => $this, + }; + } + + /** + * Return application extensions of current frame block + * + * @return array + */ + public function getApplicationExtensions(): array + { + return $this->applicationExtensions; + } + + /** + * Return comment extensions of current frame block + * + * @return array + */ + public function getCommentExtensions(): array + { + return $this->commentExtensions; + } + + /** + * Set the graphic control extension + */ + public function setGraphicControlExtension(GraphicControlExtension $extension): self + { + $this->graphicControlExtension = $extension; + + return $this; + } + + /** + * Get the graphic control extension of the current frame block + */ + public function getGraphicControlExtension(): ?GraphicControlExtension + { + return $this->graphicControlExtension; + } + + /** + * Set the image descriptor + */ + public function setImageDescriptor(ImageDescriptor $descriptor): self + { + $this->imageDescriptor = $descriptor; + return $this; + } + + /** + * Get the image descriptor of the frame block + */ + public function getImageDescriptor(): ImageDescriptor + { + return $this->imageDescriptor; + } + + /** + * Set the color table of the current frame block + */ + public function setColorTable(ColorTable $table): self + { + $this->colorTable = $table; + + return $this; + } + + /** + * Get color table + */ + public function getColorTable(): ?ColorTable + { + return $this->colorTable; + } + + /** + * Determine if frame block has color table + */ + public function hasColorTable(): bool + { + return !is_null($this->colorTable); + } + + /** + * Set image data of frame block + */ + public function setImageData(ImageData $data): self + { + $this->imageData = $data; + + return $this; + } + + /** + * Get image data of current frame block + */ + public function getImageData(): ImageData + { + return $this->imageData; + } + + /** + * Set plain text extension + */ + public function setPlainTextExtension(PlainTextExtension $extension): self + { + $this->plainTextExtension = $extension; + + return $this; + } + + /** + * Get plain text extension + */ + public function getPlainTextExtension(): ?PlainTextExtension + { + return $this->plainTextExtension; + } + + /** + * Add given application extension to the current frame block + */ + public function addApplicationExtension(ApplicationExtension $extension): self + { + $this->applicationExtensions[] = $extension; + + return $this; + } + + /** + * Remove all application extensions from the current frame block. + */ + public function clearApplicationExtensions(): self + { + $this->applicationExtensions = []; + + return $this; + } + + /** + * Add given comment extension to the current frame block + */ + public function addCommentExtension(CommentExtension $extension): self + { + $this->commentExtensions[] = $extension; + + return $this; + } + + /** + * Return netscape extension of the frame block if available + */ + public function getNetscapeExtension(): ?NetscapeApplicationExtension + { + $extensions = array_filter( + $this->applicationExtensions, + fn(ApplicationExtension $extension): bool => $extension instanceof NetscapeApplicationExtension, + ); + + return count($extensions) ? reset($extensions) : null; + } + + /** + * Set the table based image of the current frame block + */ + public function setTableBasedImage(TableBasedImage $tableBasedImage): self + { + $this->setImageDescriptor($tableBasedImage->getImageDescriptor()); + + if ($colorTable = $tableBasedImage->getColorTable()) { + $this->setColorTable($colorTable); + } + + $this->setImageData($tableBasedImage->getImageData()); + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php b/upLoadImage/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php new file mode 100644 index 0000000..30f5640 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php @@ -0,0 +1,129 @@ +delay = $value; + + return $this; + } + + /** + * Return delay time (1/100 second) + */ + public function getDelay(): int + { + return $this->delay; + } + + /** + * Set disposal method + */ + public function setDisposalMethod(DisposalMethod $method): self + { + $this->disposalMethod = $method; + + return $this; + } + + /** + * Get disposal method + */ + public function getDisposalMethod(): DisposalMethod + { + return $this->disposalMethod; + } + + /** + * Get transparent color index + */ + public function getTransparentColorIndex(): int + { + return $this->transparentColorIndex; + } + + /** + * Set transparent color index + */ + public function setTransparentColorIndex(int $index): self + { + $this->transparentColorIndex = $index; + + return $this; + } + + /** + * Get current transparent color existance + */ + public function getTransparentColorExistance(): bool + { + return $this->transparentColorExistance; + } + + /** + * Set existance flag of transparent color + */ + public function setTransparentColorExistance(bool $existance = true): self + { + $this->transparentColorExistance = $existance; + + return $this; + } + + /** + * Get user input flag + */ + public function getUserInput(): bool + { + return $this->userInput; + } + + /** + * Set user input flag + */ + public function setUserInput(bool $value = true): self + { + $this->userInput = $value; + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/Header.php b/upLoadImage/vendor/intervention/gif/src/Blocks/Header.php new file mode 100644 index 0000000..2a9175b --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/Header.php @@ -0,0 +1,38 @@ +version = $value; + + return $this; + } + + /** + * Return current version + */ + public function getVersion(): string + { + return $this->version; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/ImageData.php b/upLoadImage/vendor/intervention/gif/src/Blocks/ImageData.php new file mode 100644 index 0000000..f956485 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/ImageData.php @@ -0,0 +1,68 @@ + + */ + protected array $blocks = []; + + /** + * Get LZW min. code size + */ + public function getLzwMinCodeSize(): int + { + return $this->lzw_min_code_size; + } + + /** + * Set lzw min. code size + */ + public function setLzwMinCodeSize(int $size): self + { + $this->lzw_min_code_size = $size; + + return $this; + } + + /** + * Get current data sub blocks + * + * @return array + */ + public function getBlocks(): array + { + return $this->blocks; + } + + /** + * Addd sub block + */ + public function addBlock(DataSubBlock $block): self + { + $this->blocks[] = $block; + + return $this; + } + + /** + * Determine if data sub blocks are present + */ + public function hasBlocks(): bool + { + return count($this->blocks) >= 1; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/ImageDescriptor.php b/upLoadImage/vendor/intervention/gif/src/Blocks/ImageDescriptor.php new file mode 100644 index 0000000..62ed3ae --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/ImageDescriptor.php @@ -0,0 +1,194 @@ +width); + } + + /** + * Get current width + */ + public function getHeight(): int + { + return intval($this->height); + } + + /** + * Get current Top + */ + public function getTop(): int + { + return intval($this->top); + } + + /** + * Get current Left + */ + public function getLeft(): int + { + return intval($this->left); + } + + /** + * Set size of current instance + */ + public function setSize(int $width, int $height): self + { + $this->width = $width; + $this->height = $height; + + return $this; + } + + /** + * Set position of current instance + */ + public function setPosition(int $left, int $top): self + { + $this->left = $left; + $this->top = $top; + + return $this; + } + + /** + * Determine if frame is interlaced + */ + public function isInterlaced(): bool + { + return $this->interlaced; + } + + /** + * Set or unset interlaced value + */ + public function setInterlaced(bool $value = true): self + { + $this->interlaced = $value; + + return $this; + } + + /** + * Determine if local color table is present + */ + public function getLocalColorTableExistance(): bool + { + return $this->localColorTableExistance; + } + + /** + * Alias for getLocalColorTableExistance + */ + public function hasLocalColorTable(): bool + { + return $this->getLocalColorTableExistance(); + } + + /** + * Set local color table flag + */ + public function setLocalColorTableExistance(bool $existance = true): self + { + $this->localColorTableExistance = $existance; + + return $this; + } + + /** + * Get local color table sorted flag + */ + public function getLocalColorTableSorted(): bool + { + return $this->localColorTableSorted; + } + + /** + * Set local color table sorted flag + */ + public function setLocalColorTableSorted(bool $sorted = true): self + { + $this->localColorTableSorted = $sorted; + + return $this; + } + + /** + * Get size of local color table + */ + public function getLocalColorTableSize(): int + { + return $this->localColorTableSize; + } + + /** + * Get byte size of global color table + */ + public function getLocalColorTableByteSize(): int + { + return 3 * pow(2, $this->getLocalColorTableSize() + 1); + } + + /** + * Set size of local color table + */ + public function setLocalColorTableSize(int $size): self + { + $this->localColorTableSize = $size; + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php b/upLoadImage/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php new file mode 100644 index 0000000..2b1c05c --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php @@ -0,0 +1,201 @@ +width = $width; + $this->height = $height; + + return $this; + } + + /** + * Get width of current instance + */ + public function getWidth(): int + { + return intval($this->width); + } + + /** + * Get height of current instance + */ + public function getHeight(): int + { + return intval($this->height); + } + + /** + * Determine if global color table is present + */ + public function getGlobalColorTableExistance(): bool + { + return $this->globalColorTableExistance; + } + + /** + * Alias of getGlobalColorTableExistance + */ + public function hasGlobalColorTable(): bool + { + return $this->getGlobalColorTableExistance(); + } + + /** + * Set global color table flag + */ + public function setGlobalColorTableExistance(bool $existance = true): self + { + $this->globalColorTableExistance = $existance; + + return $this; + } + + /** + * Get global color table sorted flag + */ + public function getGlobalColorTableSorted(): bool + { + return $this->globalColorTableSorted; + } + + /** + * Set global color table sorted flag + */ + public function setGlobalColorTableSorted(bool $sorted = true): self + { + $this->globalColorTableSorted = $sorted; + + return $this; + } + + /** + * Get size of global color table + */ + public function getGlobalColorTableSize(): int + { + return $this->globalColorTableSize; + } + + /** + * Get byte size of global color table + */ + public function getGlobalColorTableByteSize(): int + { + return 3 * pow(2, $this->getGlobalColorTableSize() + 1); + } + + /** + * Set size of global color table + */ + public function setGlobalColorTableSize(int $size): self + { + $this->globalColorTableSize = $size; + + return $this; + } + + /** + * Get background color index + */ + public function getBackgroundColorIndex(): int + { + return $this->backgroundColorIndex; + } + + /** + * Set background color index + */ + public function setBackgroundColorIndex(int $index): self + { + $this->backgroundColorIndex = $index; + + return $this; + } + + /** + * Get current pixel aspect ration + */ + public function getPixelAspectRatio(): int + { + return $this->pixelAspectRatio; + } + + /** + * Set pixel aspect ratio + */ + public function setPixelAspectRatio(int $ratio): self + { + $this->pixelAspectRatio = $ratio; + + return $this; + } + + /** + * Get color resolution + */ + public function getBitsPerPixel(): int + { + return $this->bitsPerPixel; + } + + /** + * Set color resolution + */ + public function setBitsPerPixel(int $value): self + { + $this->bitsPerPixel = $value; + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php b/upLoadImage/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php new file mode 100644 index 0000000..742346b --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php @@ -0,0 +1,56 @@ +setApplication(self::IDENTIFIER . self::AUTH_CODE); + $this->setBlocks([new DataSubBlock(self::SUB_BLOCK_PREFIX . "\x00\x00")]); + } + + /** + * Get number of loops + * + * @throws RuntimeException + */ + public function getLoops(): int + { + $unpacked = unpack('v*', substr($this->getFirstBlock()->getValue(), 1)); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new RuntimeException('Unable to get loop count.'); + } + + return $unpacked[1]; + } + + /** + * Set number of loops + * + * @throws FormatException + */ + public function setLoops(int $loops): self + { + $this->setBlocks([ + new DataSubBlock(self::SUB_BLOCK_PREFIX . pack('v*', $loops)) + ]); + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/PlainTextExtension.php b/upLoadImage/vendor/intervention/gif/src/Blocks/PlainTextExtension.php new file mode 100644 index 0000000..f21a4ad --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/PlainTextExtension.php @@ -0,0 +1,59 @@ + + */ + protected array $text = []; + + /** + * Get current text + * + * @return array + */ + public function getText(): array + { + return $this->text; + } + + /** + * Add text + */ + public function addText(string $text): self + { + $this->text[] = $text; + + return $this; + } + + /** + * Set text array of extension + * + * @param array $text + */ + public function setText(array $text): self + { + $this->text = $text; + + return $this; + } + + /** + * Determine if any text is present + */ + public function hasText(): bool + { + return $this->text !== []; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/TableBasedImage.php b/upLoadImage/vendor/intervention/gif/src/Blocks/TableBasedImage.php new file mode 100644 index 0000000..cbd447b --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/TableBasedImage.php @@ -0,0 +1,50 @@ +imageDescriptor; + } + + public function setImageDescriptor(ImageDescriptor $descriptor): self + { + $this->imageDescriptor = $descriptor; + + return $this; + } + + public function getImageData(): ImageData + { + return $this->imageData; + } + + public function setImageData(ImageData $data): self + { + $this->imageData = $data; + + return $this; + } + + public function getColorTable(): ?ColorTable + { + return $this->colorTable; + } + + public function setColorTable(ColorTable $table): self + { + $this->colorTable = $table; + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Blocks/Trailer.php b/upLoadImage/vendor/intervention/gif/src/Blocks/Trailer.php new file mode 100644 index 0000000..2c68bc4 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Blocks/Trailer.php @@ -0,0 +1,12 @@ +setSize($width, $height); + } + + /** + * Get GifDataStream object we're currently building + */ + public function getGifDataStream(): GifDataStream + { + return $this->gif; + } + + /** + * Set canvas size of gif + */ + public function setSize(int $width, int $height): self + { + $this->gif->getLogicalScreenDescriptor()->setSize($width, $height); + + return $this; + } + + /** + * Set loop count + * + * @throws Exception + */ + public function setLoops(int $loops): self + { + if ($loops < 0) { + throw new Exception('The loop count must be equal to or greater than 0'); + } + + if ($this->gif->getFrames() === []) { + throw new Exception('Add at least one frame before setting the loop count'); + } + + // with one single loop the netscape extension must be removed otherwise the + // gif is looped twice because the first repetition always takes place + if ($loops === 1) { + $this->gif->getFirstFrame()?->clearApplicationExtensions(); + return $this; + } + + // make sure a netscape extension is present to store the loop count + if (!$this->gif->getFirstFrame()?->getNetscapeExtension()) { + $this->gif->getFirstFrame()?->addApplicationExtension( + new NetscapeApplicationExtension() + ); + } + + // the loop count is reduced by one because what is referred to here as + // the “loop count” actually means repetitions in GIF format, and thus + // the first repetition always takes place. A loop count of 0 howerver + // means infinite repetitions and remains unaltered. + $loops = $loops === 0 ? $loops : $loops - 1; + + // add loop count to netscape extension on first frame + $this->gif->getFirstFrame()?->getNetscapeExtension()?->setLoops($loops); + + return $this; + } + + /** + * Create new animation frame from given source + * which can be path to a file or GIF image data + * + * @throws DecoderException + */ + public function addFrame( + mixed $source, + float $delay = 0, + int $left = 0, + int $top = 0, + bool $interlaced = false + ): self { + $frame = new FrameBlock(); + $source = Decoder::decode($source); + + // store delay + $frame->setGraphicControlExtension( + $this->buildGraphicControlExtension( + $source, + intval($delay * 100) + ) + ); + + // store image + $frame->setTableBasedImage( + $this->buildTableBasedImage($source, $left, $top, $interlaced) + ); + + // add frame + $this->gif->addFrame($frame); + + return $this; + } + + /** + * Build new graphic control extension with given delay & disposal method + */ + protected function buildGraphicControlExtension( + GifDataStream $source, + int $delay, + DisposalMethod $disposalMethod = DisposalMethod::BACKGROUND + ): GraphicControlExtension { + // create extension + $extension = new GraphicControlExtension($delay, $disposalMethod); + + // set transparency index + $control = $source->getFirstFrame()->getGraphicControlExtension(); + if ($control && $control->getTransparentColorExistance()) { + $extension->setTransparentColorExistance(); + $extension->setTransparentColorIndex( + $control->getTransparentColorIndex() + ); + } + + return $extension; + } + + /** + * Build table based image object from given source + */ + protected function buildTableBasedImage( + GifDataStream $source, + int $left, + int $top, + bool $interlaced + ): TableBasedImage { + $block = new TableBasedImage(); + $block->setImageDescriptor(new ImageDescriptor()); + + // set global color table from source as local color table + $block->getImageDescriptor()->setLocalColorTableExistance(); + $block->setColorTable($source->getGlobalColorTable()); + + $block->getImageDescriptor()->setLocalColorTableSorted( + $source->getLogicalScreenDescriptor()->getGlobalColorTableSorted() + ); + + $block->getImageDescriptor()->setLocalColorTableSize( + $source->getLogicalScreenDescriptor()->getGlobalColorTableSize() + ); + + $block->getImageDescriptor()->setSize( + $source->getLogicalScreenDescriptor()->getWidth(), + $source->getLogicalScreenDescriptor()->getHeight() + ); + + // set position + $block->getImageDescriptor()->setPosition($left, $top); + + // set interlaced flag + $block->getImageDescriptor()->setInterlaced($interlaced); + + // add image data from source + $block->setImageData($source->getFirstFrame()->getImageData()); + + return $block; + } + + /** + * Encode the current build + * + * @throws EncoderException + */ + public function encode(): string + { + return $this->gif->encode(); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoder.php b/upLoadImage/vendor/intervention/gif/src/Decoder.php new file mode 100644 index 0000000..873027e --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoder.php @@ -0,0 +1,47 @@ + self::getHandleFromFilePath($input), + is_string($input) => self::getHandleFromData($input), + self::isFileHandle($input) => $input, + default => throw new DecoderException( + 'Decoder input must be either file path, file pointer resource or binary data.' + ) + }; + } catch (RuntimeException $e) { + throw new DecoderException($e->getMessage()); + } + + rewind($handle); + + return GifDataStream::decode($handle); + } + + /** + * Determine if input is file pointer resource + */ + private static function isFileHandle(mixed $input): bool + { + return is_resource($input) && get_resource_type($input) === 'stream'; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/AbstractDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/AbstractDecoder.php new file mode 100644 index 0000000..03c12d1 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/AbstractDecoder.php @@ -0,0 +1,159 @@ +handle = $handle; + + return $this; + } + + /** + * Read given number of bytes and move file pointer + * + * @throws DecoderException + */ + protected function getNextBytesOrFail(int $length): string + { + if ($length < 1) { + throw new DecoderException('The length passed must be at least one byte.'); + } + + $bytes = fread($this->handle, $length); + if ($bytes === false || strlen($bytes) !== $length) { + throw new DecoderException('Unexpected end of file.'); + } + + return $bytes; + } + + /** + * Read given number of bytes and move pointer back to previous position + * + * @throws DecoderException + */ + protected function viewNextBytesOrFail(int $length): string + { + $bytes = $this->getNextBytesOrFail($length); + $this->movePointer($length * -1); + + return $bytes; + } + + /** + * Read next byte and move pointer back to previous position + * + * @throws DecoderException + */ + protected function viewNextByteOrFail(): string + { + return $this->viewNextBytesOrFail(1); + } + + /** + * Read all remaining bytes from file handler + */ + protected function getRemainingBytes(): string + { + $all = ''; + do { + $byte = fread($this->handle, 1); + $all .= $byte; + } while (!feof($this->handle)); + + return $all; + } + + /** + * Get next byte in stream and move file pointer + * + * @throws DecoderException + */ + protected function getNextByteOrFail(): string + { + return $this->getNextBytesOrFail(1); + } + + /** + * Move file pointer on handle by given offset + */ + protected function movePointer(int $offset): self + { + fseek($this->handle, $offset, SEEK_CUR); + + return $this; + } + + /** + * Decode multi byte value + * + * @throws DecoderException + */ + protected function decodeMultiByte(string $bytes): int + { + $unpacked = unpack('v*', $bytes); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode given bytes.'); + } + + return $unpacked[1]; + } + + /** + * Set length + */ + public function setLength(int $length): self + { + $this->length = $length; + + return $this; + } + + /** + * Get length + */ + public function getLength(): ?int + { + return $this->length; + } + + /** + * Get current handle position + * + * @throws DecoderException + */ + public function getPosition(): int + { + $position = ftell($this->handle); + + if ($position === false) { + throw new DecoderException('Unable to read current position from handle.'); + } + + return $position; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php new file mode 100644 index 0000000..cdc50ed --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php @@ -0,0 +1,47 @@ +getPackedBits($byte)[$num]; + } + + /** + * Get packed bits + * + * @throws DecoderException + */ + protected function getPackedBits(string $byte, int $start = 0, int $length = 8): string + { + $bits = str_pad(decbin($this->decodePackedByte($byte)), 8, '0', STR_PAD_LEFT); + + return substr($bits, $start, $length); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php new file mode 100644 index 0000000..0153103 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php @@ -0,0 +1,75 @@ +getNextByteOrFail(); // marker + $this->getNextByteOrFail(); // label + $blocksize = $this->decodeBlockSize($this->getNextByteOrFail()); + $application = $this->getNextBytesOrFail($blocksize); + + if ($application === NetscapeApplicationExtension::IDENTIFIER . NetscapeApplicationExtension::AUTH_CODE) { + $result = new NetscapeApplicationExtension(); + + // skip length + $this->getNextByteOrFail(); + + $result->setBlocks([ + new DataSubBlock( + $this->getNextBytesOrFail(3) + ) + ]); + + // skip terminator + $this->getNextByteOrFail(); + + return $result; + } + + $result->setApplication($application); + + // decode data sub blocks + $blocksize = $this->decodeBlockSize($this->getNextByteOrFail()); + while ($blocksize > 0) { + $result->addBlock(new DataSubBlock($this->getNextBytesOrFail($blocksize))); + $blocksize = $this->decodeBlockSize($this->getNextByteOrFail()); + } + + return $result; + } + + /** + * Decode block size of ApplicationExtension from given byte + * + * @throws DecoderException + */ + protected function decodeBlockSize(string $byte): int + { + $unpacked = @unpack('C', $byte); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode application extension block size.'); + } + + return intval($unpacked[1]); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/ColorDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/ColorDecoder.php new file mode 100644 index 0000000..2c4752c --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/ColorDecoder.php @@ -0,0 +1,42 @@ +setRed($this->decodeColorValue($this->getNextByteOrFail())); + $color->setGreen($this->decodeColorValue($this->getNextByteOrFail())); + $color->setBlue($this->decodeColorValue($this->getNextByteOrFail())); + + return $color; + } + + /** + * Decode red value from source + * + * @throws DecoderException + */ + protected function decodeColorValue(string $byte): int + { + $unpacked = unpack('C', $byte); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode color value.'); + } + + return $unpacked[1]; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php new file mode 100644 index 0000000..c820df0 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php @@ -0,0 +1,27 @@ +getLength() / 3); $i++) { + $table->addColor(Color::decode($this->handle)); + } + + return $table; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php new file mode 100644 index 0000000..69ec51f --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php @@ -0,0 +1,65 @@ +getNextBytesOrFail(2); // skip marker & label + + $extension = new CommentExtension(); + foreach ($this->decodeComments() as $comment) { + $extension->addComment($comment); + } + + return $extension; + } + + /** + * Decode comment from current source + * + * @throws DecoderException + * @return array + */ + protected function decodeComments(): array + { + $comments = []; + + do { + $byte = $this->getNextByteOrFail(); + $size = $this->decodeBlocksize($byte); + if ($size > 0) { + $comments[] = $this->getNextBytesOrFail($size); + } + } while ($byte !== CommentExtension::TERMINATOR); + + return $comments; + } + + /** + * Decode blocksize of following comment + * + * @throws DecoderException + */ + protected function decodeBlocksize(string $byte): int + { + $unpacked = @unpack('C', $byte); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode comment extension block size.'); + } + + return intval($unpacked[1]); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php new file mode 100644 index 0000000..6d407be --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php @@ -0,0 +1,31 @@ +getNextByteOrFail(); + $unpacked = unpack('C', $char); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode data sub block.'); + } + + $size = (int) $unpacked[1]; + + return new DataSubBlock($this->getNextBytesOrFail($size)); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php new file mode 100644 index 0000000..30480e5 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php @@ -0,0 +1,52 @@ +viewNextBytesOrFail(2)) { + AbstractExtension::MARKER . GraphicControlExtension::LABEL + => GraphicControlExtension::decode($this->handle), + AbstractExtension::MARKER . NetscapeApplicationExtension::LABEL + => NetscapeApplicationExtension::decode($this->handle), + AbstractExtension::MARKER . ApplicationExtension::LABEL + => ApplicationExtension::decode($this->handle), + AbstractExtension::MARKER . PlainTextExtension::LABEL + => PlainTextExtension::decode($this->handle), + AbstractExtension::MARKER . CommentExtension::LABEL + => CommentExtension::decode($this->handle), + default => match ($this->viewNextByteOrFail()) { + ImageDescriptor::SEPARATOR => TableBasedImage::decode($this->handle), + default => throw new DecoderException('Unable to decode Data Block'), + } + }; + + $frame->addEntity($block); + } while (!($block instanceof TableBasedImage)); + + return $frame; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php new file mode 100644 index 0000000..3f5c9dc --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php @@ -0,0 +1,58 @@ +setHeader( + Header::decode($this->handle), + ); + + $gif->setLogicalScreenDescriptor( + LogicalScreenDescriptor::decode($this->handle), + ); + + if ($gif->getLogicalScreenDescriptor()->hasGlobalColorTable()) { + $length = $gif->getLogicalScreenDescriptor()->getGlobalColorTableByteSize(); + $gif->setGlobalColorTable( + ColorTable::decode($this->handle, $length) + ); + } + + while ($this->viewNextByteOrFail() !== Trailer::MARKER) { + match ($this->viewNextBytesOrFail(2)) { + // trailing "global" comment blocks which are not part of "FrameBlock" + AbstractExtension::MARKER . CommentExtension::LABEL + => $gif->addComment( + CommentExtension::decode($this->handle) + ), + default => $gif->addFrame( + FrameBlock::decode($this->handle) + ), + }; + } + + return $gif; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php new file mode 100644 index 0000000..278d226 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php @@ -0,0 +1,106 @@ +getNextBytesOrFail(3); // skip marker, label & bytesize + + // byte #4 + $packedField = $this->getNextByteOrFail(); + $result->setDisposalMethod($this->decodeDisposalMethod($packedField)); + $result->setUserInput($this->decodeUserInput($packedField)); + $result->setTransparentColorExistance($this->decodeTransparentColorExistance($packedField)); + + // bytes 5-6 + $result->setDelay($this->decodeDelay($this->getNextBytesOrFail(2))); + + // byte #7 + $result->setTransparentColorIndex($this->decodeTransparentColorIndex( + $this->getNextByteOrFail() + )); + + // byte #8 (terminator) + $this->getNextByteOrFail(); + + return $result; + } + + /** + * Decode disposal method + * + * @throws DecoderException + */ + protected function decodeDisposalMethod(string $byte): DisposalMethod + { + return DisposalMethod::from( + intval(bindec($this->getPackedBits($byte, 3, 3))) + ); + } + + /** + * Decode user input flag + * + * @throws DecoderException + */ + protected function decodeUserInput(string $byte): bool + { + return $this->hasPackedBit($byte, 6); + } + + /** + * Decode transparent color existance + * + * @throws DecoderException + */ + protected function decodeTransparentColorExistance(string $byte): bool + { + return $this->hasPackedBit($byte, 7); + } + + /** + * Decode delay value + * + * @throws DecoderException + */ + protected function decodeDelay(string $bytes): int + { + $unpacked = unpack('v*', $bytes); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode animation delay.'); + } + + return $unpacked[1]; + } + + /** + * Decode transparent color index + * + * @throws DecoderException + */ + protected function decodeTransparentColorIndex(string $byte): int + { + $unpacked = unpack('C', $byte); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode transparent color index.'); + } + + return $unpacked[1]; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/HeaderDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/HeaderDecoder.php new file mode 100644 index 0000000..d687f05 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/HeaderDecoder.php @@ -0,0 +1,40 @@ +setVersion($this->decodeVersion()); + + return $header; + } + + /** + * Decode version string + * + * @throws DecoderException + */ + protected function decodeVersion(): string + { + $parsed = (bool) preg_match("/^GIF(?P[0-9]{2}[a-z])$/", $this->getNextBytesOrFail(6), $matches); + + if ($parsed === false) { + throw new DecoderException('Unable to parse file header.'); + } + + return $matches['version']; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php new file mode 100644 index 0000000..914c6f6 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php @@ -0,0 +1,51 @@ +getNextByteOrFail(); + $unpacked = unpack('C', $char); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode lzw min. code size.'); + } + + $data->setLzwMinCodeSize(intval($unpacked[1])); + + do { + // decode sub blocks + $char = $this->getNextByteOrFail(); + $unpacked = unpack('C', $char); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode image data sub block.'); + } + + $size = intval($unpacked[1]); + + if ($size > 0) { + $data->addBlock(new DataSubBlock($this->getNextBytesOrFail($size))); + } + } while ($char !== AbstractEntity::TERMINATOR); + + return $data; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php new file mode 100644 index 0000000..a387ec7 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php @@ -0,0 +1,93 @@ +getNextByteOrFail(); // skip separator + + $descriptor->setPosition( + $this->decodeMultiByte($this->getNextBytesOrFail(2)), + $this->decodeMultiByte($this->getNextBytesOrFail(2)) + ); + + $descriptor->setSize( + $this->decodeMultiByte($this->getNextBytesOrFail(2)), + $this->decodeMultiByte($this->getNextBytesOrFail(2)) + ); + + $packedField = $this->getNextByteOrFail(); + + $descriptor->setLocalColorTableExistance( + $this->decodeLocalColorTableExistance($packedField) + ); + + $descriptor->setLocalColorTableSorted( + $this->decodeLocalColorTableSorted($packedField) + ); + + $descriptor->setLocalColorTableSize( + $this->decodeLocalColorTableSize($packedField) + ); + + $descriptor->setInterlaced( + $this->decodeInterlaced($packedField) + ); + + return $descriptor; + } + + /** + * Decode local color table existance + * + * @throws DecoderException + */ + protected function decodeLocalColorTableExistance(string $byte): bool + { + return $this->hasPackedBit($byte, 0); + } + + /** + * Decode local color table sort method + * + * @throws DecoderException + */ + protected function decodeLocalColorTableSorted(string $byte): bool + { + return $this->hasPackedBit($byte, 2); + } + + /** + * Decode local color table size + * + * @throws DecoderException + */ + protected function decodeLocalColorTableSize(string $byte): int + { + return (int) bindec($this->getPackedBits($byte, 5, 3)); + } + + /** + * Decode interlaced flag + * + * @throws DecoderException + */ + protected function decodeInterlaced(string $byte): bool + { + return $this->hasPackedBit($byte, 1); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php new file mode 100644 index 0000000..73c8ddc --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php @@ -0,0 +1,162 @@ +setSize( + $this->decodeWidth($this->getNextBytesOrFail(2)), + $this->decodeHeight($this->getNextBytesOrFail(2)) + ); + + // byte 5 + $packedField = $this->getNextByteOrFail(); + + $logicalScreenDescriptor->setGlobalColorTableExistance( + $this->decodeGlobalColorTableExistance($packedField) + ); + + $logicalScreenDescriptor->setBitsPerPixel( + $this->decodeBitsPerPixel($packedField) + ); + + $logicalScreenDescriptor->setGlobalColorTableSorted( + $this->decodeGlobalColorTableSorted($packedField) + ); + + $logicalScreenDescriptor->setGlobalColorTableSize( + $this->decodeGlobalColorTableSize($packedField) + ); + + // byte 6 + $logicalScreenDescriptor->setBackgroundColorIndex( + $this->decodeBackgroundColorIndex($this->getNextByteOrFail()) + ); + + // byte 7 + $logicalScreenDescriptor->setPixelAspectRatio( + $this->decodePixelAspectRatio($this->getNextByteOrFail()) + ); + + return $logicalScreenDescriptor; + } + + /** + * Decode width + * + * @throws DecoderException + */ + protected function decodeWidth(string $source): int + { + $unpacked = unpack('v*', $source); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode width.'); + } + + return $unpacked[1]; + } + + /** + * Decode height + * + * @throws DecoderException + */ + protected function decodeHeight(string $source): int + { + $unpacked = unpack('v*', $source); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode height.'); + } + + return $unpacked[1]; + } + + /** + * Decode existance of global color table + * + * @throws DecoderException + */ + protected function decodeGlobalColorTableExistance(string $byte): bool + { + return $this->hasPackedBit($byte, 0); + } + + /** + * Decode color resolution in bits per pixel + * + * @throws DecoderException + */ + protected function decodeBitsPerPixel(string $byte): int + { + return intval(bindec($this->getPackedBits($byte, 1, 3))) + 1; + } + + /** + * Decode global color table sorted status + * + * @throws DecoderException + */ + protected function decodeGlobalColorTableSorted(string $byte): bool + { + return $this->hasPackedBit($byte, 4); + } + + /** + * Decode size of global color table + * + * @throws DecoderException + */ + protected function decodeGlobalColorTableSize(string $byte): int + { + return intval(bindec($this->getPackedBits($byte, 5, 3))); + } + + /** + * Decode background color index + * + * @throws DecoderException + */ + protected function decodeBackgroundColorIndex(string $source): int + { + $unpacked = unpack('C', $source); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode background color index.'); + } + + return $unpacked[1]; + } + + /** + * Decode pixel aspect ratio + * + * @throws DecoderException + */ + protected function decodePixelAspectRatio(string $source): int + { + $unpacked = unpack('C', $source); + + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode pixel aspect ratio.'); + } + + return $unpacked[1]; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php new file mode 100644 index 0000000..3074f89 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php @@ -0,0 +1,9 @@ +getNextBytesOrFail(2); + + // skip info block + $this->getNextBytesOrFail($this->getInfoBlockSize()); + + // text blocks + $extension->setText($this->decodeTextBlocks()); + + return $extension; + } + + /** + * Get number of bytes in header block + * + * @throws DecoderException + */ + protected function getInfoBlockSize(): int + { + $unpacked = unpack('C', $this->getNextByteOrFail()); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode info block size.'); + } + + return $unpacked[1]; + } + + /** + * Decode text sub blocks + * + * @throws DecoderException + * @return array + */ + protected function decodeTextBlocks(): array + { + $blocks = []; + + do { + $char = $this->getNextByteOrFail(); + $unpacked = unpack('C', $char); + if ($unpacked === false || !array_key_exists(1, $unpacked)) { + throw new DecoderException('Unable to decode text block.'); + } + + $size = (int) $unpacked[1]; + + if ($size > 0) { + $blocks[] = $this->getNextBytesOrFail($size); + } + } while ($char !== PlainTextExtension::TERMINATOR); + + return $blocks; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php b/upLoadImage/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php new file mode 100644 index 0000000..3e10576 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php @@ -0,0 +1,41 @@ +setImageDescriptor(ImageDescriptor::decode($this->handle)); + + if ($block->getImageDescriptor()->hasLocalColorTable()) { + $block->setColorTable( + ColorTable::decode( + $this->handle, + $block->getImageDescriptor()->getLocalColorTableByteSize() + ) + ); + } + + $block->setImageData( + ImageData::decode($this->handle) + ); + + return $block; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/DisposalMethod.php b/upLoadImage/vendor/intervention/gif/src/DisposalMethod.php new file mode 100644 index 0000000..7b05044 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/DisposalMethod.php @@ -0,0 +1,13 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + */ + public function encode(): string + { + return implode('', [ + ApplicationExtension::MARKER, + ApplicationExtension::LABEL, + pack('C', $this->source->getBlockSize()), + $this->source->getApplication(), + implode('', array_map(fn(DataSubBlock $block): string => $block->encode(), $this->source->getBlocks())), + ApplicationExtension::TERMINATOR, + ]); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/ColorEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/ColorEncoder.php new file mode 100644 index 0000000..10bf438 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/ColorEncoder.php @@ -0,0 +1,38 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return implode('', [ + $this->encodeColorValue($this->source->getRed()), + $this->encodeColorValue($this->source->getGreen()), + $this->encodeColorValue($this->source->getBlue()), + ]); + } + + /** + * Encode color value + */ + protected function encodeColorValue(int $value): string + { + return pack('C', $value); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php new file mode 100644 index 0000000..f417e1f --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php @@ -0,0 +1,33 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + */ + public function encode(): string + { + return implode('', array_map( + fn(Color $color): string => $color->encode(), + $this->source->getColors(), + )); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php new file mode 100644 index 0000000..51ca0a4 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php @@ -0,0 +1,41 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return implode('', [ + CommentExtension::MARKER, + CommentExtension::LABEL, + $this->encodeComments(), + CommentExtension::TERMINATOR, + ]); + } + + /** + * Encode comment blocks + */ + protected function encodeComments(): string + { + return implode('', array_map(function (string $comment): string { + return pack('C', strlen($comment)) . $comment; + }, $this->source->getComments())); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php new file mode 100644 index 0000000..beb09b3 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php @@ -0,0 +1,26 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return pack('C', $this->source->getSize()) . $this->source->getValue(); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php new file mode 100644 index 0000000..9cf428e --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php @@ -0,0 +1,47 @@ +source = $source; + } + + /** + * @throws EncoderException + */ + public function encode(): string + { + $graphicControlExtension = $this->source->getGraphicControlExtension(); + $colorTable = $this->source->getColorTable(); + $plainTextExtension = $this->source->getPlainTextExtension(); + + return implode('', [ + implode('', array_map( + fn(ApplicationExtension $extension): string => $extension->encode(), + $this->source->getApplicationExtensions(), + )), + implode('', array_map( + fn(CommentExtension $extension): string => $extension->encode(), + $this->source->getCommentExtensions(), + )), + $plainTextExtension ? $plainTextExtension->encode() : '', + $graphicControlExtension ? $graphicControlExtension->encode() : '', + $this->source->getImageDescriptor()->encode(), + $colorTable ? $colorTable->encode() : '', + $this->source->getImageData()->encode(), + ]); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php new file mode 100644 index 0000000..376fa8b --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php @@ -0,0 +1,73 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + */ + public function encode(): string + { + return implode('', [ + $this->source->getHeader()->encode(), + $this->source->getLogicalScreenDescriptor()->encode(), + $this->maybeEncodeGlobalColorTable(), + $this->encodeFrames(), + $this->encodeComments(), + $this->source->getTrailer()->encode(), + ]); + } + + protected function maybeEncodeGlobalColorTable(): string + { + if (!$this->source->hasGlobalColorTable()) { + return ''; + } + + return $this->source->getGlobalColorTable()->encode(); + } + + /** + * Encode data blocks of source + * + * @throws EncoderException + */ + protected function encodeFrames(): string + { + return implode('', array_map( + fn(FrameBlock $frame): string => $frame->encode(), + $this->source->getFrames(), + )); + } + + /** + * Encode comment extension blocks of source + * + * @throws EncoderException + */ + protected function encodeComments(): string + { + return implode('', array_map( + fn(CommentExtension $commentExtension): string => $commentExtension->encode(), + $this->source->getComments() + )); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php new file mode 100644 index 0000000..eb952a8 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php @@ -0,0 +1,63 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return implode('', [ + GraphicControlExtension::MARKER, + GraphicControlExtension::LABEL, + GraphicControlExtension::BLOCKSIZE, + $this->encodePackedField(), + $this->encodeDelay(), + $this->encodeTransparentColorIndex(), + GraphicControlExtension::TERMINATOR, + ]); + } + + /** + * Encode delay time + */ + protected function encodeDelay(): string + { + return pack('v*', $this->source->getDelay()); + } + + /** + * Encode transparent color index + */ + protected function encodeTransparentColorIndex(): string + { + return pack('C', $this->source->getTransparentColorIndex()); + } + + /** + * Encode packed field + */ + protected function encodePackedField(): string + { + return pack('C', bindec(implode('', [ + str_pad('0', 3, '0', STR_PAD_LEFT), + str_pad(decbin($this->source->getDisposalMethod()->value), 3, '0', STR_PAD_LEFT), + (int) $this->source->getUserInput(), + (int) $this->source->getTransparentColorExistance(), + ]))); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/HeaderEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/HeaderEncoder.php new file mode 100644 index 0000000..37ceacf --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/HeaderEncoder.php @@ -0,0 +1,26 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return Header::SIGNATURE . $this->source->getVersion(); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php new file mode 100644 index 0000000..9214626 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php @@ -0,0 +1,42 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + */ + public function encode(): string + { + if (!$this->source->hasBlocks()) { + throw new EncoderException("No data blocks in ImageData."); + } + + return implode('', [ + pack('C', $this->source->getLzwMinCodeSize()), + implode('', array_map( + fn(DataSubBlock $block): string => $block->encode(), + $this->source->getBlocks(), + )), + AbstractEntity::TERMINATOR, + ]); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php new file mode 100644 index 0000000..42814b1 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php @@ -0,0 +1,95 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return implode('', [ + ImageDescriptor::SEPARATOR, + $this->encodeLeft(), + $this->encodeTop(), + $this->encodeWidth(), + $this->encodeHeight(), + $this->encodePackedField(), + ]); + } + + /** + * Encode left value + */ + protected function encodeLeft(): string + { + return pack('v*', $this->source->getLeft()); + } + + /** + * Encode top value + */ + protected function encodeTop(): string + { + return pack('v*', $this->source->getTop()); + } + + /** + * Encode width value + */ + protected function encodeWidth(): string + { + return pack('v*', $this->source->getWidth()); + } + + /** + * Encode height value + */ + protected function encodeHeight(): string + { + return pack('v*', $this->source->getHeight()); + } + + /** + * Encode size of local color table + */ + protected function encodeLocalColorTableSize(): string + { + return str_pad(decbin($this->source->getLocalColorTableSize()), 3, '0', STR_PAD_LEFT); + } + + /** + * Encode reserved field + */ + protected function encodeReservedField(): string + { + return str_pad('0', 2, '0', STR_PAD_LEFT); + } + + /** + * Encode packed field + */ + protected function encodePackedField(): string + { + return pack('C', bindec(implode('', [ + (int) $this->source->getLocalColorTableExistance(), + (int) $this->source->isInterlaced(), + (int) $this->source->getLocalColorTableSorted(), + $this->encodeReservedField(), + $this->encodeLocalColorTableSize(), + ]))); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php new file mode 100644 index 0000000..ff393d8 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php @@ -0,0 +1,93 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return implode('', [ + $this->encodeWidth(), + $this->encodeHeight(), + $this->encodePackedField(), + $this->encodeBackgroundColorIndex(), + $this->encodePixelAspectRatio(), + ]); + } + + /** + * Encode width of current instance + */ + protected function encodeWidth(): string + { + return pack('v*', $this->source->getWidth()); + } + + /** + * Encode height of current instance + */ + protected function encodeHeight(): string + { + return pack('v*', $this->source->getHeight()); + } + + /** + * Encode background color index of global color table + */ + protected function encodeBackgroundColorIndex(): string + { + return pack('C', $this->source->getBackgroundColorIndex()); + } + + /** + * Encode pixel aspect ratio + */ + protected function encodePixelAspectRatio(): string + { + return pack('C', $this->source->getPixelAspectRatio()); + } + + /** + * Return color resolution for encoding + */ + protected function encodeColorResolution(): string + { + return str_pad(decbin($this->source->getBitsPerPixel() - 1), 3, '0', STR_PAD_LEFT); + } + + /** + * Encode size of global color table + */ + protected function encodeGlobalColorTableSize(): string + { + return str_pad(decbin($this->source->getGlobalColorTableSize()), 3, '0', STR_PAD_LEFT); + } + + /** + * Encode packed field of current instance + */ + protected function encodePackedField(): string + { + return pack('C', bindec(implode('', [ + (int) $this->source->getGlobalColorTableExistance(), + $this->encodeColorResolution(), + (int) $this->source->getGlobalColorTableSorted(), + $this->encodeGlobalColorTableSize(), + ]))); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php new file mode 100644 index 0000000..40f97f0 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php @@ -0,0 +1,35 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return implode('', [ + ApplicationExtension::MARKER, + ApplicationExtension::LABEL, + pack('C', $this->source->getBlockSize()), + $this->source->getApplication(), + implode('', array_map(fn(DataSubBlock $block): string => $block->encode(), $this->source->getBlocks())), + ApplicationExtension::TERMINATOR, + ]); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php new file mode 100644 index 0000000..dd1244e --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php @@ -0,0 +1,55 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + if (!$this->source->hasText()) { + return ''; + } + + return implode('', [ + PlainTextExtension::MARKER, + PlainTextExtension::LABEL, + $this->encodeHead(), + $this->encodeTexts(), + PlainTextExtension::TERMINATOR, + ]); + } + + /** + * Encode head block + */ + protected function encodeHead(): string + { + return "\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + /** + * Encode text chunks + */ + protected function encodeTexts(): string + { + return implode('', array_map( + fn(string $text): string => pack('C', strlen($text)) . $text, + $this->source->getText(), + )); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php new file mode 100644 index 0000000..6769866 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php @@ -0,0 +1,24 @@ +source = $source; + } + + public function encode(): string + { + return implode('', [ + $this->source->getImageDescriptor()->encode(), + $this->source->getColorTable() ? $this->source->getColorTable()->encode() : '', + $this->source->getImageData()->encode(), + ]); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Encoders/TrailerEncoder.php b/upLoadImage/vendor/intervention/gif/src/Encoders/TrailerEncoder.php new file mode 100644 index 0000000..36c8367 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Encoders/TrailerEncoder.php @@ -0,0 +1,26 @@ +source = $source; + } + + /** + * Encode current source + */ + public function encode(): string + { + return Trailer::MARKER; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Exceptions/DecoderException.php b/upLoadImage/vendor/intervention/gif/src/Exceptions/DecoderException.php new file mode 100644 index 0000000..f8b8981 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Exceptions/DecoderException.php @@ -0,0 +1,10 @@ + $frames + * @param array $comments + */ + public function __construct( + protected Header $header = new Header(), + protected LogicalScreenDescriptor $logicalScreenDescriptor = new LogicalScreenDescriptor(), + protected ?ColorTable $globalColorTable = null, + protected array $frames = [], + protected array $comments = [] + ) { + // + } + + /** + * Get header + */ + public function getHeader(): Header + { + return $this->header; + } + + /** + * Set header + */ + public function setHeader(Header $header): self + { + $this->header = $header; + + return $this; + } + + /** + * Get logical screen descriptor + */ + public function getLogicalScreenDescriptor(): LogicalScreenDescriptor + { + return $this->logicalScreenDescriptor; + } + + /** + * Set logical screen descriptor + */ + public function setLogicalScreenDescriptor(LogicalScreenDescriptor $descriptor): self + { + $this->logicalScreenDescriptor = $descriptor; + + return $this; + } + + /** + * Return global color table if available else null + */ + public function getGlobalColorTable(): ?ColorTable + { + return $this->globalColorTable; + } + + /** + * Set global color table + */ + public function setGlobalColorTable(ColorTable $table): self + { + $this->globalColorTable = $table; + $this->logicalScreenDescriptor->setGlobalColorTableExistance(true); + $this->logicalScreenDescriptor->setGlobalColorTableSize( + $table->getLogicalSize() + ); + + return $this; + } + + /** + * Get main graphic control extension + */ + public function getMainApplicationExtension(): ?NetscapeApplicationExtension + { + foreach ($this->frames as $frame) { + if ($extension = $frame->getNetscapeExtension()) { + return $extension; + } + } + + return null; + } + + /** + * Get array of frames + * + * @return array + */ + public function getFrames(): array + { + return $this->frames; + } + + /** + * Return array of "global" comments + * + * @return array + */ + public function getComments(): array + { + return $this->comments; + } + + /** + * Return first frame + */ + public function getFirstFrame(): ?FrameBlock + { + if (!array_key_exists(0, $this->frames)) { + return null; + } + + return $this->frames[0]; + } + + /** + * Add frame + */ + public function addFrame(FrameBlock $frame): self + { + $this->frames[] = $frame; + + return $this; + } + + /** + * Add comment extension + */ + public function addComment(CommentExtension $comment): self + { + $this->comments[] = $comment; + + return $this; + } + + /** + * Set the current data + * + * @param array $frames + */ + public function setFrames(array $frames): self + { + $this->frames = $frames; + + return $this; + } + + /** + * Get trailer + */ + public function getTrailer(): Trailer + { + return new Trailer(); + } + + /** + * Determine if gif is animated + */ + public function isAnimated(): bool + { + return count($this->getFrames()) > 1; + } + + /** + * Determine if global color table is set + */ + public function hasGlobalColorTable(): bool + { + return !is_null($this->globalColorTable); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Splitter.php b/upLoadImage/vendor/intervention/gif/src/Splitter.php new file mode 100644 index 0000000..c0bdfe2 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Splitter.php @@ -0,0 +1,281 @@ + + */ +class Splitter implements IteratorAggregate +{ + /** + * Single frames resolved to GifDataStream + * + * @var array + */ + protected array $frames = []; + + /** + * Delays of each frame + * + * @var array + */ + protected array $delays = []; + + /** + * Create new instance + */ + public function __construct(protected GifDataStream $stream) + { + // + } + + /** + * Static constructor method + */ + public static function create(GifDataStream $stream): self + { + return new self($stream); + } + + /** + * Iterator + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->frames); + } + + /** + * Get frames + * + * @return array + */ + public function getFrames(): array + { + return $this->frames; + } + + /** + * Get delays + * + * @return array + */ + public function getDelays(): array + { + return $this->delays; + } + + /** + * Set stream of instance + */ + public function setStream(GifDataStream $stream): self + { + $this->stream = $stream; + + return $this; + } + + /** + * Split current stream into array of seperate streams for each frame + */ + public function split(): self + { + $this->frames = []; + + foreach ($this->stream->getFrames() as $frame) { + // create separate stream for each frame + $gif = Builder::canvas( + $this->stream->getLogicalScreenDescriptor()->getWidth(), + $this->stream->getLogicalScreenDescriptor()->getHeight() + )->getGifDataStream(); + + // check if working stream has global color table + if ($this->stream->hasGlobalColorTable()) { + $gif->setGlobalColorTable($this->stream->getGlobalColorTable()); + $gif->getLogicalScreenDescriptor()->setGlobalColorTableExistance(true); + + $gif->getLogicalScreenDescriptor()->setGlobalColorTableSorted( + $this->stream->getLogicalScreenDescriptor()->getGlobalColorTableSorted() + ); + + $gif->getLogicalScreenDescriptor()->setGlobalColorTableSize( + $this->stream->getLogicalScreenDescriptor()->getGlobalColorTableSize() + ); + + $gif->getLogicalScreenDescriptor()->setBackgroundColorIndex( + $this->stream->getLogicalScreenDescriptor()->getBackgroundColorIndex() + ); + + $gif->getLogicalScreenDescriptor()->setPixelAspectRatio( + $this->stream->getLogicalScreenDescriptor()->getPixelAspectRatio() + ); + + $gif->getLogicalScreenDescriptor()->setBitsPerPixel( + $this->stream->getLogicalScreenDescriptor()->getBitsPerPixel() + ); + } + + // copy original frame + $gif->addFrame($frame); + + $this->frames[] = $gif; + $this->delays[] = match (is_object($frame->getGraphicControlExtension())) { + true => $frame->getGraphicControlExtension()->getDelay(), + default => 0, + }; + } + + return $this; + } + + /** + * Return array of GD library resources for each frame + * + * @throws EncoderException + * @return array + */ + public function toResources(): array + { + $resources = []; + + foreach ($this->frames as $frame) { + $resource = imagecreatefromstring($frame->encode()); + if ($resource === false) { + throw new EncoderException('Unable to extract animation frames.'); + } + + imagepalettetotruecolor($resource); + imagesavealpha($resource, true); + $resources[] = $resource; + } + + return $resources; + } + + /** + * Return array of coalesced GD library resources for each frame + * + * @throws EncoderException + * @return array + */ + public function coalesceToResources(): array + { + $resources = $this->toResources(); + + // static gif files don't need to be coalesced + if (count($resources) === 1) { + return $resources; + } + + $width = imagesx($resources[0]); + $height = imagesy($resources[0]); + $transparent = imagecolortransparent($resources[0]); + + foreach ($resources as $key => $resource) { + // get meta data + $gif = $this->frames[$key]; + $descriptor = $gif->getFirstFrame()->getImageDescriptor(); + $offset_x = $descriptor->getLeft(); + $offset_y = $descriptor->getTop(); + $w = $descriptor->getWidth(); + $h = $descriptor->getHeight(); + + if (in_array($this->getDisposalMethod($gif), [DisposalMethod::NONE, DisposalMethod::PREVIOUS])) { + if ($key >= 1) { + // create normalized gd image + $canvas = imagecreatetruecolor($width, $height); + if (imagecolortransparent($resource) != -1) { + $transparent = imagecolortransparent($resource); + } else { + $transparent = imagecolorallocatealpha($resource, 255, 0, 255, 127); + } + + if (!is_int($transparent)) { + throw new EncoderException('Animation frames cannot be converted into resources.'); + } + + // fill with transparent + imagefill($canvas, 0, 0, $transparent); + imagecolortransparent($canvas, $transparent); + imagealphablending($canvas, true); + + // insert last as base + imagecopy( + $canvas, + $resources[$key - 1], + 0, + 0, + 0, + 0, + $width, + $height + ); + + // insert resource + imagecopy( + $canvas, + $resource, + $offset_x, + $offset_y, + 0, + 0, + $w, + $h + ); + } else { + imagealphablending($resource, true); + $canvas = $resource; + } + } else { + // create normalized gd image + $canvas = imagecreatetruecolor($width, $height); + if (imagecolortransparent($resource) != -1) { + $transparent = imagecolortransparent($resource); + } else { + $transparent = imagecolorallocatealpha($resource, 255, 0, 255, 127); + } + + if (!is_int($transparent)) { + throw new EncoderException('Animation frames cannot be converted into resources.'); + } + + // fill with transparent + imagefill($canvas, 0, 0, $transparent); + imagecolortransparent($canvas, $transparent); + imagealphablending($canvas, true); + + // insert frame resource + imagecopy( + $canvas, + $resource, + $offset_x, + $offset_y, + 0, + 0, + $w, + $h + ); + } + + $resources[$key] = $canvas; + } + + return $resources; + } + + /** + * Find and return disposal method of given gif data stream + */ + private function getDisposalMethod(GifDataStream $gif): DisposalMethod + { + return $gif->getFirstFrame()->getGraphicControlExtension()->getDisposalMethod(); + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Traits/CanDecode.php b/upLoadImage/vendor/intervention/gif/src/Traits/CanDecode.php new file mode 100644 index 0000000..56304d8 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Traits/CanDecode.php @@ -0,0 +1,43 @@ +decode(); + } + + /** + * Get decoder for current instance + * + * @throws DecoderException + */ + protected static function getDecoder(mixed $source, ?int $length = null): AbstractDecoder + { + $classname = sprintf('Intervention\Gif\Decoders\%sDecoder', self::getShortClassname()); + + if (!class_exists($classname)) { + throw new DecoderException("Decoder for '" . static::class . "' not found."); + } + + $decoder = new $classname($source, $length); + + if (!($decoder instanceof AbstractDecoder)) { + throw new DecoderException("Decoder for '" . static::class . "' not found."); + } + + return $decoder; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Traits/CanEncode.php b/upLoadImage/vendor/intervention/gif/src/Traits/CanEncode.php new file mode 100644 index 0000000..6d117b0 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Traits/CanEncode.php @@ -0,0 +1,43 @@ +getEncoder()->encode(); + } + + /** + * Get encoder object for current entity + * + * @throws EncoderException + */ + protected function getEncoder(): AbstractEncoder + { + $classname = sprintf('Intervention\Gif\Encoders\%sEncoder', $this->getShortClassname()); + + if (!class_exists($classname)) { + throw new EncoderException("Encoder for '" . $this::class . "' not found."); + } + + $encoder = new $classname($this); + + if (!($encoder instanceof AbstractEncoder)) { + throw new EncoderException("Encoder for '" . $this::class . "' not found."); + } + + return $encoder; + } +} diff --git a/upLoadImage/vendor/intervention/gif/src/Traits/CanHandleFiles.php b/upLoadImage/vendor/intervention/gif/src/Traits/CanHandleFiles.php new file mode 100644 index 0000000..5c96678 --- /dev/null +++ b/upLoadImage/vendor/intervention/gif/src/Traits/CanHandleFiles.php @@ -0,0 +1,53 @@ +read('images/example.gif'); + +// resize image instance +$image->resize(height: 300); + +// insert a watermark +$image->place('images/watermark.png'); + +// encode edited image +$encoded = $image->toJpg(); + +// save encoded image +$encoded->save('images/example.jpg'); +``` + +## Requirements + +Before you begin with the installation make sure that your server environment +supports the following requirements. + +- PHP >= 8.1 +- Mbstring PHP Extension +- Image Processing PHP Extension + +## Supported Image Libraries + +Depending on your environment Intervention Image lets you choose between +different image processing extensions. + +- GD Library +- Imagick PHP extension +- [libvips](https://github.com/Intervention/image-driver-vips) + +## Security + +If you discover any security related issues, please email oliver@intervention.io directly. + +## Authors + +This library is developed and maintained by [Oliver Vogel](https://intervention.io) + +Thanks to the community of [contributors](https://github.com/Intervention/image/graphs/contributors) who have helped to improve this project. + +## License + +Intervention Image is licensed under the [MIT License](LICENSE). diff --git a/upLoadImage/vendor/intervention/image/src/Analyzers/ColorspaceAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Analyzers/ColorspaceAnalyzer.php new file mode 100644 index 0000000..e3cd1c1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Analyzers/ColorspaceAnalyzer.php @@ -0,0 +1,12 @@ + + */ +class Collection implements CollectionInterface, IteratorAggregate, Countable +{ + /** + * Create new collection object + * + * @param array $items + * @return void + */ + public function __construct(protected array $items = []) + { + // + } + + /** + * Static constructor + * + * @param array $items + * @return self + */ + public static function create(array $items = []): self + { + return new self($items); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::has() + */ + public function has(int|string $key): bool + { + return array_key_exists($key, $this->items); + } + + /** + * Returns Iterator + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->items); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::toArray() + */ + public function toArray(): array + { + return $this->items; + } + + /** + * Count items in collection + */ + public function count(): int + { + return count($this->items); + } + + /** + * Append new item to collection + * + * @return CollectionInterface + */ + public function push(mixed $item): CollectionInterface + { + $this->items[] = $item; + + return $this; + } + + /** + * Return first item in collection + */ + public function first(): mixed + { + if ($item = reset($this->items)) { + return $item; + } + + return null; + } + + /** + * Returns last item in collection + */ + public function last(): mixed + { + if ($item = end($this->items)) { + return $item; + } + + return null; + } + + /** + * Return item at given position starting at 0 + */ + public function getAtPosition(int $key = 0, mixed $default = null): mixed + { + if ($this->count() == 0) { + return $default; + } + + $positions = array_values($this->items); + if (!array_key_exists($key, $positions)) { + return $default; + } + + return $positions[$key]; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::get() + */ + public function get(int|string $query, mixed $default = null): mixed + { + if ($this->count() == 0) { + return $default; + } + + if (is_int($query) && array_key_exists($query, $this->items)) { + return $this->items[$query]; + } + + if (is_string($query) && !str_contains($query, '.')) { + return array_key_exists($query, $this->items) ? $this->items[$query] : $default; + } + + $query = explode('.', (string) $query); + + $result = $default; + $items = $this->items; + foreach ($query as $key) { + if (!is_array($items) || !array_key_exists($key, $items)) { + $result = $default; + break; + } + + $result = $items[$key]; + $items = $result; + } + + return $result; + } + + /** + * Map each item of collection by given callback + */ + public function map(callable $callback): self + { + + return new self( + array_map( + fn(mixed $item) => $callback($item), + $this->items, + ) + ); + } + + /** + * Run callback on each item of the collection an remove it if it does not return true + */ + public function filter(callable $callback): self + { + return new self( + array_filter( + $this->items, + fn(mixed $item) => $callback($item), + ) + ); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::empty() + */ + public function empty(): CollectionInterface + { + $this->items = []; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::slice() + */ + public function slice(int $offset, ?int $length = null): CollectionInterface + { + $this->items = array_slice($this->items, $offset, $length); + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/AbstractColor.php b/upLoadImage/vendor/intervention/image/src/Colors/AbstractColor.php new file mode 100644 index 0000000..9628795 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/AbstractColor.php @@ -0,0 +1,116 @@ + + */ + protected array $channels; + + /** + * {@inheritdoc} + * + * @see ColorInterface::channels() + */ + public function channels(): array + { + return $this->channels; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::channel() + */ + public function channel(string $classname): ColorChannelInterface + { + $channels = array_filter( + $this->channels(), + fn(ColorChannelInterface $channel): bool => $channel::class === $classname, + ); + + if (count($channels) == 0) { + throw new ColorException('Color channel ' . $classname . ' could not be found.'); + } + + return reset($channels); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::normalize() + */ + public function normalize(): array + { + return array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $this->channels(), + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toArray() + */ + public function toArray(): array + { + return array_map( + fn(ColorChannelInterface $channel): int => $channel->value(), + $this->channels() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::convertTo() + */ + public function convertTo(string|ColorspaceInterface $colorspace): ColorInterface + { + $colorspace = match (true) { + is_object($colorspace) => $colorspace, + default => new $colorspace(), + }; + + return $colorspace->importColor($this); + } + + /** + * Show debug info for the current color + * + * @return array + */ + public function __debugInfo(): array + { + return array_reduce($this->channels(), function (array $result, ColorChannelInterface $item) { + $key = strtolower((new ReflectionClass($item))->getShortName()); + $result[$key] = $item->value(); + return $result; + }, []); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/AbstractColorChannel.php b/upLoadImage/vendor/intervention/image/src/Colors/AbstractColorChannel.php new file mode 100644 index 0000000..5c52909 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/AbstractColorChannel.php @@ -0,0 +1,92 @@ +value = $this->validate( + match (true) { + is_null($value) && is_numeric($normalized) => intval(round($normalized * $this->max())), + is_numeric($value) && is_null($normalized) => $value, + default => throw new ColorException('Color channels must either have a value or a normalized value') + } + ); + } + + /** + * Alias of value() + */ + public function toInt(): int + { + return $this->value; + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::value() + */ + public function value(): int + { + return $this->value; + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::normalize() + */ + public function normalize(int $precision = 32): float + { + return round(($this->value() - $this->min()) / ($this->max() - $this->min()), $precision); + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::validate() + */ + public function validate(mixed $value): mixed + { + if ($value < $this->min() || $value > $this->max()) { + throw new ColorException('Color channel value must be in range ' . $this->min() . ' to ' . $this->max()); + } + + return $value; + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::toString() + */ + public function toString(): string + { + return (string) $this->value(); + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php b/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php new file mode 100644 index 0000000..f56b095 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php @@ -0,0 +1,20 @@ +channels = [ + new Cyan($c), + new Magenta($m), + new Yellow($y), + new Key($k), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\StringColorDecoder::class, + ])->handle($input); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toHex() + */ + public function toHex(string $prefix = ''): string + { + return $this->convertTo(RgbColorspace::class)->toHex($prefix); + } + + /** + * Return the CMYK cyan channel + */ + public function cyan(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Cyan::class); + } + + /** + * Return the CMYK magenta channel + */ + public function magenta(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Magenta::class); + } + + /** + * Return the CMYK yellow channel + */ + public function yellow(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Yellow::class); + } + + /** + * Return the CMYK key channel + */ + public function key(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Key::class); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + return sprintf( + 'cmyk(%d%%, %d%%, %d%%, %d%%)', + $this->cyan()->value(), + $this->magenta()->value(), + $this->yellow()->value(), + $this->key()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + return 0 === array_sum([ + $this->cyan()->value(), + $this->magenta()->value(), + $this->yellow()->value(), + ]); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return false; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return false; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php b/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php new file mode 100644 index 0000000..4484ef7 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php @@ -0,0 +1,77 @@ + + */ + public static array $channels = [ + Channels\Cyan::class, + Channels\Magenta::class, + Channels\Yellow::class, + Channels\Key::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::createColor() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized, + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + RgbColor::class => $this->importRgbColor($color), + HsvColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + HslColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importRgbColor(ColorInterface $color): CmykColor + { + if (!($color instanceof RgbColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + $c = (255 - $color->red()->value()) / 255.0 * 100; + $m = (255 - $color->green()->value()) / 255.0 * 100; + $y = (255 - $color->blue()->value()) / 255.0 * 100; + $k = intval(round(min([$c, $m, $y]))); + + $c = intval(round($c - $k)); + $m = intval(round($m - $k)); + $y = intval(round($y - $k)); + + return new CmykColor($c, $m, $y, $k); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php b/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php new file mode 100644 index 0000000..e160f2e --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php @@ -0,0 +1,36 @@ +[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = array_map(function (string $value): int { + return intval(round(floatval(trim(str_replace('%', '', $value))))); + }, [$matches['c'], $matches['m'], $matches['y'], $matches['k']]); + + return new Color(...$values); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php b/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php new file mode 100644 index 0000000..049a849 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php @@ -0,0 +1,30 @@ +channels = [ + new Hue($h), + new Saturation($s), + new Luminance($l), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\StringColorDecoder::class, + ])->handle($input); + } + + /** + * Return the Hue channel + */ + public function hue(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Hue::class); + } + + /** + * Return the Saturation channel + */ + public function saturation(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Saturation::class); + } + + /** + * Return the Luminance channel + */ + public function luminance(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Luminance::class); + } + + public function toHex(string $prefix = ''): string + { + return $this->convertTo(RgbColorspace::class)->toHex($prefix); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + return sprintf( + 'hsl(%d, %d%%, %d%%)', + $this->hue()->value(), + $this->saturation()->value(), + $this->luminance()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + return $this->saturation()->value() == 0; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return false; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return false; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Colorspace.php b/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Colorspace.php new file mode 100644 index 0000000..de4c2cf --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Colorspace.php @@ -0,0 +1,137 @@ + + */ + public static array $channels = [ + Channels\Hue::class, + Channels\Saturation::class, + Channels\Luminance::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::colorFromNormalized() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + CmykColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + RgbColor::class => $this->importRgbColor($color), + HsvColor::class => $this->importHsvColor($color), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importRgbColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof RgbColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of rgb channels + $values = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels(), + ); + + // take only RGB + $values = array_slice($values, 0, 3); + + // calculate Luminance + $min = min(...$values); + $max = max(...$values); + $luminance = ($max + $min) / 2; + $delta = $max - $min; + + // calculate saturation + $saturation = match (true) { + $delta == 0 => 0, + default => $delta / (1 - abs(2 * $luminance - 1)), + }; + + // calculate hue + [$r, $g, $b] = $values; + $hue = match (true) { + ($delta == 0) => 0, + ($max == $r) => 60 * fmod((($g - $b) / $delta), 6), + ($max == $g) => 60 * ((($b - $r) / $delta) + 2), + ($max == $b) => 60 * ((($r - $g) / $delta) + 4), + default => 0, + }; + + $hue = ($hue + 360) % 360; // normalize hue + + return new Color( + intval(round($hue)), + intval(round($saturation * 100)), + intval(round($luminance * 100)), + ); + } + + /** + * @throws ColorException + */ + protected function importHsvColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HsvColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of hsv channels + [$h, $s, $v] = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels(), + ); + + // calculate Luminance + $luminance = (2 - $s) * $v / 2; + + // calculate Saturation + $saturation = match (true) { + $luminance == 0 => $s, + $luminance == 1 => 0, + $luminance < .5 => $s * $v / ($luminance * 2), + default => $s * $v / (2 - $luminance * 2), + }; + + return new Color( + intval(round($h * 360)), + intval(round($saturation * 100)), + intval(round($luminance * 100)), + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php b/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php new file mode 100644 index 0000000..8ea7ed9 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php @@ -0,0 +1,39 @@ +[0-9\.]+), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = array_map(function (string $value): int { + return match (strpos($value, '%')) { + false => intval(trim($value)), + default => intval(trim(str_replace('%', '', $value))), + }; + }, [$matches['h'], $matches['s'], $matches['l']]); + + return new Color(...$values); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php b/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php new file mode 100644 index 0000000..bbfc1fe --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php @@ -0,0 +1,30 @@ +channels = [ + new Hue($h), + new Saturation($s), + new Value($v), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\StringColorDecoder::class, + ])->handle($input); + } + + /** + * Return the Hue channel + */ + public function hue(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Hue::class); + } + + /** + * Return the Saturation channel + */ + public function saturation(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Saturation::class); + } + + /** + * Return the Value channel + */ + public function value(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Value::class); + } + + public function toHex(string $prefix = ''): string + { + return $this->convertTo(RgbColorspace::class)->toHex($prefix); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + return sprintf( + 'hsv(%d, %d%%, %d%%)', + $this->hue()->value(), + $this->saturation()->value(), + $this->value()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + return $this->saturation()->value() == 0; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return false; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return false; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Colorspace.php b/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Colorspace.php new file mode 100644 index 0000000..5cf08e2 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Colorspace.php @@ -0,0 +1,122 @@ + + */ + public static array $channels = [ + Channels\Hue::class, + Channels\Saturation::class, + Channels\Value::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::colorFromNormalized() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + CmykColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + RgbColor::class => $this->importRgbColor($color), + HslColor::class => $this->importHslColor($color), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importRgbColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof RgbColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of rgb channels + $values = array_map(fn(ColorChannelInterface $channel): float => $channel->normalize(), $color->channels()); + + // take only RGB + $values = array_slice($values, 0, 3); + + // calculate chroma + $min = min(...$values); + $max = max(...$values); + $chroma = $max - $min; + + // calculate value + $v = 100 * $max; + + if ($chroma == 0) { + // greyscale color + return new Color(0, 0, intval(round($v))); + } + + // calculate saturation + $s = 100 * ($chroma / $max); + + // calculate hue + [$r, $g, $b] = $values; + $h = match (true) { + ($r == $min) => 3 - (($g - $b) / $chroma), + ($b == $min) => 1 - (($r - $g) / $chroma), + default => 5 - (($b - $r) / $chroma), + } * 60; + + return new Color( + intval(round($h)), + intval(round($s)), + intval(round($v)) + ); + } + + /** + * @throws ColorException + */ + protected function importHslColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HslColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of hsl channels + [$h, $s, $l] = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels() + ); + + $v = $l + $s * min($l, 1 - $l); + $s = ($v == 0) ? 0 : 2 * (1 - $l / $v); + + return $this->colorFromNormalized([$h, $s, $v]); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php b/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php new file mode 100644 index 0000000..0f1ada3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php @@ -0,0 +1,39 @@ +[0-9\.]+), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = array_map(function (string $value): int { + return match (strpos($value, '%')) { + false => intval(trim($value)), + default => intval(trim(str_replace('%', '', $value))), + }; + }, [$matches['h'], $matches['s'], $matches['v']]); + + return new Color(...$values); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Profile.php b/upLoadImage/vendor/intervention/image/src/Colors/Profile.php new file mode 100644 index 0000000..b6aa0e9 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Profile.php @@ -0,0 +1,22 @@ +normalize(), 6)); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php new file mode 100644 index 0000000..c5f9ed7 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php @@ -0,0 +1,10 @@ +channels = [ + new Red($r), + new Green($g), + new Blue($b), + new Alpha($a), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\HexColorDecoder::class, + Decoders\StringColorDecoder::class, + Decoders\TransparentColorDecoder::class, + Decoders\HtmlColornameDecoder::class, + ])->handle($input); + } + + /** + * Return the RGB red color channel + */ + public function red(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Red::class); + } + + /** + * Return the RGB green color channel + */ + public function green(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Green::class); + } + + /** + * Return the RGB blue color channel + */ + public function blue(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Blue::class); + } + + /** + * Return the colors alpha channel + */ + public function alpha(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Alpha::class); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toHex() + */ + public function toHex(string $prefix = ''): string + { + if ($this->isTransparent()) { + return sprintf( + '%s%02x%02x%02x%02x', + $prefix, + $this->red()->value(), + $this->green()->value(), + $this->blue()->value(), + $this->alpha()->value() + ); + } + + return sprintf( + '%s%02x%02x%02x', + $prefix, + $this->red()->value(), + $this->green()->value(), + $this->blue()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + if ($this->isTransparent()) { + return sprintf( + 'rgba(%d, %d, %d, %.1F)', + $this->red()->value(), + $this->green()->value(), + $this->blue()->value(), + $this->alpha()->normalize(), + ); + } + + return sprintf( + 'rgb(%d, %d, %d)', + $this->red()->value(), + $this->green()->value(), + $this->blue()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + $values = [$this->red()->value(), $this->green()->value(), $this->blue()->value()]; + + return count(array_unique($values, SORT_REGULAR)) === 1; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return $this->alpha()->value() < $this->alpha()->max(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return $this->alpha()->value() == 0; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Colorspace.php b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Colorspace.php new file mode 100644 index 0000000..dfeaef6 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Colorspace.php @@ -0,0 +1,135 @@ + + */ + public static array $channels = [ + Channels\Red::class, + Channels\Green::class, + Channels\Blue::class, + Channels\Alpha::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::colorFromNormalized() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn($classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized, + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + CmykColor::class => $this->importCmykColor($color), + HsvColor::class => $this->importHsvColor($color), + HslColor::class => $this->importHslColor($color), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importCmykColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof CmykColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + return new Color( + (int) (255 * (1 - $color->cyan()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->magenta()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->yellow()->normalize()) * (1 - $color->key()->normalize())), + ); + } + + /** + * @throws ColorException + */ + protected function importHsvColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HsvColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + $chroma = $color->value()->normalize() * $color->saturation()->normalize(); + $hue = $color->hue()->normalize() * 6; + $x = $chroma * (1 - abs(fmod($hue, 2) - 1)); + + // connect channel values + $values = match (true) { + $hue < 1 => [$chroma, $x, 0], + $hue < 2 => [$x, $chroma, 0], + $hue < 3 => [0, $chroma, $x], + $hue < 4 => [0, $x, $chroma], + $hue < 5 => [$x, 0, $chroma], + default => [$chroma, 0, $x], + }; + + // add to each value + $values = array_map(fn(float|int $value): float => $value + $color->value()->normalize() - $chroma, $values); + $values[] = 1; // append alpha channel value + + return $this->colorFromNormalized($values); + } + + /** + * @throws ColorException + */ + protected function importHslColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HslColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of hsl channels + [$h, $s, $l] = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels() + ); + + $c = (1 - abs(2 * $l - 1)) * $s; + $x = $c * (1 - abs(fmod($h * 6, 2) - 1)); + $m = $l - $c / 2; + + $values = match (true) { + $h < 1 / 6 => [$c, $x, 0], + $h < 2 / 6 => [$x, $c, 0], + $h < 3 / 6 => [0, $c, $x], + $h < 4 / 6 => [0, $x, $c], + $h < 5 / 6 => [$x, 0, $c], + default => [$c, 0, $x], + }; + + $values = array_map(fn(float|int $value): float => $value + $m, $values); + $values[] = 1; // append alpha channel value + + return $this->colorFromNormalized($values); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php new file mode 100644 index 0000000..b19eee2 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php @@ -0,0 +1,46 @@ +[a-f\d]{3}(?:[a-f\d]?|(?:[a-f\d]{3}(?:[a-f\d]{2})?)?)\b)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = match (strlen($matches['hex'])) { + 3, 4 => str_split($matches['hex']), + 6, 8 => str_split($matches['hex'], 2), + default => throw new DecoderException('Unable to decode input'), + }; + + $values = array_map(function (string $value): float|int { + return match (strlen($value)) { + 1 => hexdec($value . $value), + 2 => hexdec($value), + default => throw new DecoderException('Unable to decode input'), + }; + }, $values); + + return new Color(...$values); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php new file mode 100644 index 0000000..8fc8e70 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php @@ -0,0 +1,176 @@ + + */ + protected static array $names = [ + 'lightsalmon' => '#ffa07a', + 'salmon' => '#fa8072', + 'darksalmon' => '#e9967a', + 'lightcoral' => '#f08080', + 'indianred' => '#cd5c5c', + 'crimson' => '#dc143c', + 'firebrick' => '#b22222', + 'red' => '#ff0000', + 'darkred' => '#8b0000', + 'coral' => '#ff7f50', + 'tomato' => '#ff6347', + 'orangered' => '#ff4500', + 'gold' => '#ffd700', + 'orange' => '#ffa500', + 'darkorange' => '#ff8c00', + 'lightyellow' => '#ffffe0', + 'lemonchiffon' => '#fffacd', + 'lightgoldenrodyellow' => '#fafad2', + 'papayawhip' => '#ffefd5', + 'moccasin' => '#ffe4b5', + 'peachpuff' => '#ffdab9', + 'palegoldenrod' => '#eee8aa', + 'khaki' => '#f0e68c', + 'darkkhaki' => '#bdb76b', + 'yellow' => '#ffff00', + 'lawngreen' => '#7cfc00', + 'chartreuse' => '#7fff00', + 'limegreen' => '#32cd32', + 'lime' => '#00ff00', + 'forestgreen' => '#228b22', + 'green' => '#008000', + 'darkgreen' => '#006400', + 'greenyellow' => '#adff2f', + 'yellowgreen' => '#9acd32', + 'springgreen' => '#00ff7f', + 'mediumspringgreen' => '#00fa9a', + 'lightgreen' => '#90ee90', + 'palegreen' => '#98fb98', + 'darkseagreen' => '#8fbc8f', + 'mediumseagre' => 'en #3cb371', + 'seagreen' => '#2e8b57', + 'olive' => '#808000', + 'darkolivegreen' => '#556b2f', + 'olivedrab' => '#6b8e23', + 'lightcyan' => '#e0ffff', + 'cyan' => '#00ffff', + 'aqua' => '#00ffff', + 'aquamarine' => '#7fffd4', + 'mediumaquamarine' => '#66cdaa', + 'paleturquoise' => '#afeeee', + 'turquoise' => '#40e0d0', + 'mediumturquoise' => '#48d1cc', + 'darkturquoise' => '#00ced1', + 'lightseagreen' => '#20b2aa', + 'cadetblue' => '#5f9ea0', + 'darkcyan' => '#008b8b', + 'teal' => '#008080', + 'powderblue' => '#b0e0e6', + 'lightblue' => '#add8e6', + 'lightskyblue' => '#87cefa', + 'skyblue' => '#87ceeb', + 'deepskyblue' => '#00bfff', + 'lightsteelblue' => '#b0c4de', + 'dodgerblue' => '#1e90ff', + 'cornflowerblue' => '#6495ed', + 'steelblue' => '#4682b4', + 'royalblue' => '#4169e1', + 'blue' => '#0000ff', + 'mediumblue' => '#0000cd', + 'darkblue' => '#00008b', + 'navy' => '#000080', + 'midnightblue' => '#191970', + 'mediumslateblue' => '#7b68ee', + 'slateblue' => '#6a5acd', + 'darkslateblue' => '#483d8b', + 'lavender' => '#e6e6fa', + 'thistle' => '#d8bfd8', + 'plum' => '#dda0dd', + 'violet' => '#ee82ee', + 'orchid' => '#da70d6', + 'fuchsia' => '#ff00ff', + 'magenta' => '#ff00ff', + 'mediumorchid' => '#ba55d3', + 'mediumpurple' => '#9370db', + 'blueviolet' => '#8a2be2', + 'darkviolet' => '#9400d3', + 'darkorchid' => '#9932cc', + 'darkmagenta' => '#8b008b', + 'purple' => '#800080', + 'indigo' => '#4b0082', + 'pink' => '#ffc0cb', + 'lightpink' => '#ffb6c1', + 'hotpink' => '#ff69b4', + 'deeppink' => '#ff1493', + 'palevioletred' => '#db7093', + 'mediumvioletred' => '#c71585', + 'white' => '#ffffff', + 'snow' => '#fffafa', + 'honeydew' => '#f0fff0', + 'mintcream' => '#f5fffa', + 'azure' => '#f0ffff', + 'aliceblue' => '#f0f8ff', + 'ghostwhite' => '#f8f8ff', + 'whitesmoke' => '#f5f5f5', + 'seashell' => '#fff5ee', + 'beige' => '#f5f5dc', + 'oldlace' => '#fdf5e6', + 'floralwhite' => '#fffaf0', + 'ivory' => '#fffff0', + 'antiquewhite' => '#faebd7', + 'linen' => '#faf0e6', + 'lavenderblush' => '#fff0f5', + 'mistyrose' => '#ffe4e1', + 'gainsboro' => '#dcdcdc', + 'lightgray' => '#d3d3d3', + 'silver' => '#c0c0c0', + 'darkgray' => '#a9a9a9', + 'gray' => '#808080', + 'dimgray' => '#696969', + 'lightslategray' => '#778899', + 'slategray' => '#708090', + 'darkslategray' => '#2f4f4f', + 'black' => '#000000', + 'cornsilk' => '#fff8dc', + 'blanchedalmond' => '#ffebcd', + 'bisque' => '#ffe4c4', + 'navajowhite' => '#ffdead', + 'wheat' => '#f5deb3', + 'burlywood' => '#deb887', + 'tan' => '#d2b48c', + 'rosybrown' => '#bc8f8f', + 'sandybrown' => '#f4a460', + 'goldenrod' => '#daa520', + 'peru' => '#cd853f', + 'chocolate' => '#d2691e', + 'saddlebrown' => '#8b4513', + 'sienna' => '#a0522d', + 'brown' => '#a52a2a', + 'maroon' => '#800000', + ]; + + /** + * Decode html color names + */ + public function decode(mixed $input): ImageInterface|ColorInterface + { + if (!is_string($input)) { + throw new DecoderException('Unable to decode input'); + } + + if (!array_key_exists(strtolower($input), static::$names)) { + throw new DecoderException('Unable to decode input'); + } + + return parent::decode(static::$names[strtolower($input)]); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php new file mode 100644 index 0000000..a2ddb6c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php @@ -0,0 +1,49 @@ +[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)' . + '(?:, ?(?P
(?:1)|(?:1\.0*)|(?:0)|(?:0?\.\d+%?)|(?:\d{1,3}%)))?\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + // rgb values + $values = array_map(function (string $value): int { + return match (strpos($value, '%')) { + false => intval(trim($value)), + default => intval(round(floatval(trim(str_replace('%', '', $value))) / 100 * 255)), + }; + }, [$matches['r'], $matches['g'], $matches['b']]); + + // alpha value + if (array_key_exists('a', $matches)) { + $values[] = match (true) { + strpos($matches['a'], '%') => round(intval(trim(str_replace('%', '', $matches['a']))) / 2.55), + default => intval(round(floatval(trim($matches['a'])) * 255)), + }; + } + + return new Color(...$values); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php new file mode 100644 index 0000000..8d968a6 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php @@ -0,0 +1,30 @@ +prepareOptions($options) as $name => $value) { + if (!property_exists($this, $name)) { + throw new InputException('Property ' . $name . ' does not exists for ' . $this::class . '.'); + } + + $this->{$name} = $value; + } + + return $this; + } + + /** + * This method makes it possible to call self::setOptions() with a single + * array instead of named parameters + * + * @param array $options + * @return array + */ + private function prepareOptions(array $options): array + { + if ($options === []) { + return $options; + } + + if (count($options) > 1) { + return $options; + } + + if (!array_key_exists(0, $options)) { + return $options; + } + + if (!is_array($options[0])) { + return $options; + } + + return $options[0]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php new file mode 100644 index 0000000..6dffb2b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php @@ -0,0 +1,12 @@ + PHP_MAXPATHLEN) { + return false; + } + + try { + if (!@is_file($input)) { + return false; + } + } catch (Exception) { + return false; + } + + return true; + } + + /** + * Extract and return EXIF data from given input which can be binary image + * data or a file path. + * + * @return CollectionInterface + */ + protected function extractExifData(string $path_or_data): CollectionInterface + { + if (!function_exists('exif_read_data')) { + return new Collection(); + } + + try { + $source = match (true) { + $this->isFile($path_or_data) => $path_or_data, // path + default => $this->buildFilePointer($path_or_data), // data + }; + + // extract exif data + $data = @exif_read_data($source, null, true); + if (is_resource($source)) { + fclose($source); + } + } catch (Exception) { + $data = []; + } + + return new Collection(is_array($data) ? $data : []); + } + + /** + * Determine if given input is base64 encoded data + */ + protected function isValidBase64(mixed $input): bool + { + if (!is_string($input)) { + return false; + } + + return base64_encode(base64_decode($input)) === str_replace(["\n", "\r"], '', $input); + } + + /** + * Parse data uri + */ + protected function parseDataUri(mixed $input): object + { + $pattern = "/^data:(?P\w+\/[-+.\w]+)?" . + "(?P(;[-\w]+=[-\w]+)*)(?P;base64)?,(?P.*)/"; + + $result = preg_match($pattern, (string) $input, $matches); + + return new class ($matches, $result) + { + /** + * @param array $matches + * @return void + */ + public function __construct(private array $matches, private int|false $result) + { + // + } + + public function isValid(): bool + { + return (bool) $this->result; + } + + public function mediaType(): ?string + { + if (isset($this->matches['mediatype']) && !empty($this->matches['mediatype'])) { + return $this->matches['mediatype']; + } + + return null; + } + + public function hasMediaType(): bool + { + return !empty($this->mediaType()); + } + + public function isBase64Encoded(): bool + { + return isset($this->matches['base64']) && $this->matches['base64'] === ';base64'; + } + + public function data(): ?string + { + if (isset($this->matches['data']) && !empty($this->matches['data'])) { + return $this->matches['data']; + } + + return null; + } + }; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/AbstractDriver.php b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractDriver.php new file mode 100644 index 0000000..f5d7024 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractDriver.php @@ -0,0 +1,127 @@ +config = new Config(); + $this->checkHealth(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::config() + */ + public function config(): Config + { + return $this->config; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::handleInput() + */ + public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface + { + return InputHandler::withDecoders($decoders, $this)->handle($input); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::specialize() + */ + public function specialize( + ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface $object + ): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface { + // return object directly if no specializing is possible + if (!($object instanceof SpecializableInterface)) { + return $object; + } + + // return directly and only attach driver if object is already specialized + if ($object instanceof SpecializedInterface) { + $object->setDriver($this); + + return $object; + } + + // resolve classname for specializable object + $specialized_classname = implode("\\", [ + (new ReflectionClass($this))->getNamespaceName(), // driver's namespace + match (true) { + $object instanceof ModifierInterface => 'Modifiers', + $object instanceof AnalyzerInterface => 'Analyzers', + $object instanceof EncoderInterface => 'Encoders', + $object instanceof DecoderInterface => 'Decoders', + }, + $object_shortname = (new ReflectionClass($object))->getShortName(), + ]); + + // fail if driver specialized classname does not exists + if (!class_exists($specialized_classname)) { + throw new NotSupportedException( + "Class '" . $object_shortname . "' is not supported by " . $this->id() . " driver." + ); + } + + // create a driver specialized object with the specializable properties of generic object + $specialized = new $specialized_classname(...$object->specializable()); + + // attach driver + return $specialized->setDriver($this); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::specializeMultiple() + * + * @throws NotSupportedException + * @throws DriverException + */ + public function specializeMultiple(array $objects): array + { + return array_map( + function (string|object $object): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface { + return $this->specialize( + match (true) { + is_string($object) => new $object(), + is_object($object) => $object, + } + ); + }, + $objects + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/AbstractEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractEncoder.php new file mode 100644 index 0000000..747cdcb --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractEncoder.php @@ -0,0 +1,42 @@ +encode($this); + } + + /** + * Build new file pointer, run callback with it and return result as encoded image + * + * @throws RuntimeException + */ + protected function createEncodedImage(callable $callback, ?string $mediaType = null): EncodedImage + { + $pointer = $this->buildFilePointer(); + $callback($pointer); + + return is_string($mediaType) ? new EncodedImage($pointer, $mediaType) : new EncodedImage($pointer); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php new file mode 100644 index 0000000..6d0ae66 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php @@ -0,0 +1,172 @@ +wrapTextBlock(new TextBlock($text), $font); + $pivot = $this->buildPivot($lines, $font, $position); + + $leading = $this->leading($font); + $blockWidth = $this->boxSize((string) $lines->longestLine(), $font)->width(); + + $x = $pivot->x(); + $y = $font->hasFilename() ? $pivot->y() + $this->capHeight($font) : $pivot->y(); + $xAdjustment = 0; + + // adjust line positions according to alignment + foreach ($lines as $line) { + $lineBoxSize = $this->boxSize((string) $line, $font); + $lineWidth = $lineBoxSize->width() + $lineBoxSize->pivot()->x(); + $xAdjustment = $font->alignment() === 'left' ? 0 : $blockWidth - $lineWidth; + $xAdjustment = $font->alignment() === 'right' ? intval(round($xAdjustment)) : $xAdjustment; + $xAdjustment = $font->alignment() === 'center' ? intval(round($xAdjustment / 2)) : $xAdjustment; + $position = new Point($x + $xAdjustment, $y); + $position->rotate($font->angle(), $pivot); + $line->setPosition($position); + $y += $leading; + } + + return $lines; + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::nativeFontSize() + */ + public function nativeFontSize(FontInterface $font): float + { + return $font->size(); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::typographicalSize() + */ + public function typographicalSize(FontInterface $font): int + { + return $this->boxSize('Hy', $font)->height(); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::capHeight() + */ + public function capHeight(FontInterface $font): int + { + return $this->boxSize('T', $font)->height(); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::leading() + */ + public function leading(FontInterface $font): int + { + return intval(round($this->typographicalSize($font) * $font->lineHeight())); + } + + /** + * Reformat a text block by wrapping each line before the given maximum width + * + * @throws FontException + */ + protected function wrapTextBlock(TextBlock $block, FontInterface $font): TextBlock + { + $newLines = []; + foreach ($block as $line) { + foreach ($this->wrapLine($line, $font) as $newLine) { + $newLines[] = $newLine; + } + } + + return $block->setLines($newLines); + } + + /** + * Check if a line exceeds the given maximum width and wrap it if necessary. + * The output will be an array of formatted lines that are all within the + * maximum width. + * + * @throws FontException + * @return array + */ + protected function wrapLine(Line $line, FontInterface $font): array + { + // no wrap width - no wrapping + if (is_null($font->wrapWidth())) { + return [$line]; + } + + $wrapped = []; + $formattedLine = new Line(); + + foreach ($line as $word) { + // calculate width of newly formatted line + $lineWidth = $this->boxSize(match ($formattedLine->count()) { + 0 => $word, + default => $formattedLine . ' ' . $word, + }, $font)->width(); + + // decide if word fits on current line or a new line must be created + if ($line->count() === 1 || $lineWidth <= $font->wrapWidth()) { + $formattedLine->add($word); + } else { + if ($formattedLine->count() !== 0) { + $wrapped[] = $formattedLine; + } + $formattedLine = new Line($word); + } + } + + $wrapped[] = $formattedLine; + + return $wrapped; + } + + /** + * Build pivot point of textblock according to the font settings and based on given position + * + * @throws FontException + */ + protected function buildPivot(TextBlock $block, FontInterface $font, PointInterface $position): PointInterface + { + // bounding box + $box = new Rectangle( + $this->boxSize((string) $block->longestLine(), $font)->width(), + $this->leading($font) * ($block->count() - 1) + $this->capHeight($font) + ); + + // set position + $box->setPivot($position); + + // alignment + $box->align($font->alignment()); + $box->valign($font->valignment()); + $box->rotate($font->angle()); + + return $box->last(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/AbstractFrame.php b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractFrame.php new file mode 100644 index 0000000..706ddf5 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/AbstractFrame.php @@ -0,0 +1,25 @@ + + */ + public function __debugInfo(): array + { + return [ + 'delay' => $this->delay(), + 'left' => $this->offsetLeft(), + 'top' => $this->offsetTop(), + 'dispose' => $this->dispose(), + ]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php new file mode 100644 index 0000000..73057f7 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php @@ -0,0 +1,23 @@ +core()->native()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php new file mode 100644 index 0000000..80542f3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php @@ -0,0 +1,51 @@ +colorAt( + $image->colorspace(), + $image->core()->frame($this->frame_key)->native() + ); + } + + /** + * @throws GeometryException + * @throws ColorException + */ + protected function colorAt(ColorspaceInterface $colorspace, GdImage $gd): ColorInterface + { + $index = @imagecolorat($gd, $this->x, $this->y); + + if (!imageistruecolor($gd)) { + $index = imagecolorsforindex($gd, $index); + } + + if ($index === false) { + throw new GeometryException( + 'The specified position is not in the valid image area.' + ); + } + + return $this->driver()->colorProcessor($colorspace)->nativeToColor($index); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php new file mode 100644 index 0000000..862d41e --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php @@ -0,0 +1,30 @@ +colorspace(); + + foreach ($image as $frame) { + $colors->push( + parent::colorAt($colorspace, $frame->native()) + ); + } + + return $colors; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php new file mode 100644 index 0000000..93d37f2 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php @@ -0,0 +1,23 @@ +core()->native())); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php new file mode 100644 index 0000000..9c6b793 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php @@ -0,0 +1,22 @@ +core()->native()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Cloner.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Cloner.php new file mode 100644 index 0000000..e871996 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Cloner.php @@ -0,0 +1,90 @@ +width(), $size->height()); + + // copy resolution to clone + $resolution = imageresolution($gd); + if (is_array($resolution) && array_key_exists(0, $resolution) && array_key_exists(1, $resolution)) { + imageresolution($clone, $resolution[0], $resolution[1]); + } + + // fill with background + $processor = new ColorProcessor(); + imagefill($clone, 0, 0, $processor->colorToNative($background)); + imagealphablending($clone, true); + imagesavealpha($clone, true); + + // set background image as transparent if alpha channel value if color is below .5 + // comes into effect when the end format only supports binary transparency (like GIF) + if ($background->channel(Alpha::class)->value() < 128) { + imagecolortransparent($clone, $processor->colorToNative($background)); + } + + return $clone; + } + + /** + * Create a clone of an GdImage that is positioned on the specified background color. + * Possible transparent areas are mixed with this color. + * + * @throws ColorException + */ + public static function cloneBlended(GdImage $gd, ColorInterface $background): GdImage + { + // create empty canvas with same size + $clone = static::cloneEmpty($gd, background: $background); + + // transfer actual image to clone + imagecopy($clone, $gd, 0, 0, 0, 0, imagesx($gd), imagesy($gd)); + + return $clone; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php new file mode 100644 index 0000000..6d738a4 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php @@ -0,0 +1,148 @@ +convertTo($this->colorspace); + + // gd only supports rgb so the channels can be accessed directly + $r = $color->channel(Red::class)->value(); + $g = $color->channel(Green::class)->value(); + $b = $color->channel(Blue::class)->value(); + $a = $color->channel(Alpha::class)->value(); + + // convert alpha value to gd alpha + // ([opaque]255-0[transparent]) to ([opaque]0-127[transparent]) + $a = (int) $this->convertRange($a, 0, 255, 127, 0); + + return ($a << 24) + ($r << 16) + ($g << 8) + $b; + } + + /** + * {@inheritdoc} + * + * @see ColorProcessorInterface::nativeToColor() + */ + public function nativeToColor(mixed $value): ColorInterface + { + if (!is_int($value) && !is_array($value)) { + throw new ColorException('GD driver can only decode colors in integer and array format.'); + } + + if (is_array($value)) { + // array conversion + if (!$this->isValidArrayColor($value)) { + throw new ColorException( + 'GD driver can only decode array color format array{red: int, green: int, blue: int, alpha: int}.', + ); + } + + $r = $value['red']; + $g = $value['green']; + $b = $value['blue']; + $a = $value['alpha']; + } else { + // integer conversion + $a = ($value >> 24) & 0xFF; + $r = ($value >> 16) & 0xFF; + $g = ($value >> 8) & 0xFF; + $b = $value & 0xFF; + } + + // convert gd apha integer to intervention alpha integer + // ([opaque]0-127[transparent]) to ([opaque]255-0[transparent]) + $a = (int) static::convertRange($a, 127, 0, 0, 255); + + return new Color($r, $g, $b, $a); + } + + /** + * Convert input in range (min) to (max) to the corresponding value + * in target range (targetMin) to (targetMax). + */ + protected function convertRange( + float|int $input, + float|int $min, + float|int $max, + float|int $targetMin, + float|int $targetMax + ): float|int { + return ceil(((($input - $min) * ($targetMax - $targetMin)) / ($max - $min)) + $targetMin); + } + + /** + * Check if given array is valid color format + * array{red: int, green: int, blue: int, alpha: int} + * i.e. result of imagecolorsforindex() + * + * @param array $color + */ + private function isValidArrayColor(array $color): bool + { + if (!array_key_exists('red', $color)) { + return false; + } + + if (!array_key_exists('green', $color)) { + return false; + } + + if (!array_key_exists('blue', $color)) { + return false; + } + + if (!array_key_exists('alpha', $color)) { + return false; + } + + if (!is_int($color['red'])) { + return false; + } + + if (!is_int($color['green'])) { + return false; + } + + if (!is_int($color['blue'])) { + return false; + } + + if (!is_int($color['alpha'])) { + return false; + } + + return true; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Core.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Core.php new file mode 100644 index 0000000..66424ad --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Core.php @@ -0,0 +1,117 @@ +push($frame); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::native() + */ + public function native(): mixed + { + return $this->first()->native(); + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setNative() + */ + public function setNative(mixed $native): self + { + $this->empty()->push(new Frame($native)); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::frame() + */ + public function frame(int $position): FrameInterface + { + $frame = $this->getAtPosition($position); + + if (!($frame instanceof FrameInterface)) { + throw new AnimationException('Frame #' . $position . ' could not be found in the image.'); + } + + return $frame; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::loops() + */ + public function loops(): int + { + return $this->loops; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setLoops() + */ + public function setLoops(int $loops): self + { + $this->loops = $loops; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::first() + */ + public function first(): FrameInterface + { + return parent::first(); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::last() + */ + public function last(): FrameInterface + { + return parent::last(); + } + + /** + * Clone instance + */ + public function __clone(): void + { + foreach ($this->items as $key => $frame) { + $this->items[$key] = clone $frame; + } + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php new file mode 100644 index 0000000..17e2559 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php @@ -0,0 +1,57 @@ +isValidBase64($input)) { + throw new DecoderException('Unable to decode input'); + } + + return parent::decode(base64_decode((string) $input)); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php new file mode 100644 index 0000000..ea19958 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php @@ -0,0 +1,68 @@ +isGifFormat($input)) { + true => $this->decodeGif($input), + default => $this->decodeBinary($input), + }; + } + + /** + * Decode image from given binary data + * + * @throws RuntimeException + */ + private function decodeBinary(string $input): ImageInterface + { + $gd = @imagecreatefromstring($input); + + if ($gd === false) { + throw new DecoderException('Unable to decode input'); + } + + // create image instance + $image = parent::decode($gd); + + // get media type + $mediaType = $this->getMediaTypeByBinary($input); + + // extract & set exif data for appropriate formats + if (in_array($mediaType->format(), [Format::JPEG, Format::TIFF])) { + $image->setExif($this->extractExifData($input)); + } + + // set mediaType on origin + $image->origin()->setMediaType($mediaType); + + // adjust image orientation + if ($this->driver()->config()->autoOrientation) { + $image->modify(new AlignRotationModifier()); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php new file mode 100644 index 0000000..fe3abe6 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php @@ -0,0 +1,37 @@ +parseDataUri($input); + + if (!$uri->isValid()) { + throw new DecoderException('Unable to decode input'); + } + + if ($uri->isBase64Encoded()) { + return parent::decode(base64_decode($uri->data())); + } + + return parent::decode(urldecode($uri->data())); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php new file mode 100644 index 0000000..f65d0a5 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php @@ -0,0 +1,27 @@ +toString()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php new file mode 100644 index 0000000..bb6ddd5 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php @@ -0,0 +1,60 @@ +isFile($input)) { + throw new DecoderException('Unable to decode input'); + } + + // detect media (mime) type + $mediaType = $this->getMediaTypeByFilePath($input); + + $image = match ($mediaType->format()) { + // gif files might be animated and therefore cannot + // be handled by the standard GD decoder. + Format::GIF => $this->decodeGif($input), + default => parent::decode(match ($mediaType->format()) { + Format::JPEG => @imagecreatefromjpeg($input), + Format::WEBP => @imagecreatefromwebp($input), + Format::PNG => @imagecreatefrompng($input), + Format::AVIF => @imagecreatefromavif($input), + Format::BMP => @imagecreatefrombmp($input), + default => throw new DecoderException('Unable to decode input'), + }), + }; + + // set file path & mediaType on origin + $image->origin()->setFilePath($input); + $image->origin()->setMediaType($mediaType); + + // extract exif for the appropriate formats + if ($mediaType->format() === Format::JPEG) { + $image->setExif($this->extractExifData($input)); + } + + // adjust image orientation + if ($this->driver()->config()->autoOrientation) { + $image->modify(new AlignRotationModifier()); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php new file mode 100644 index 0000000..0bf649d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php @@ -0,0 +1,32 @@ +driver(), + new Core([ + new Frame($input) + ]) + ); + } + + /** + * Decode image from given GIF source which can be either a file path or binary data + * + * Depending on the configuration, this is taken over by the native GD function + * or, if animations are required, by our own extended decoder. + * + * @throws RuntimeException + */ + protected function decodeGif(mixed $input): ImageInterface + { + // create non-animated image depending on config + if (!$this->driver()->config()->decodeAnimation) { + $native = match (true) { + $this->isGifFormat($input) => @imagecreatefromstring($input), + default => @imagecreatefromgif($input), + }; + + if ($native === false) { + throw new DecoderException('Unable to decode input.'); + } + + $image = self::decode($native); + $image->origin()->setMediaType('image/gif'); + + return $image; + } + + try { + // create empty core + $core = new Core(); + + $gif = GifDecoder::decode($input); + $splitter = GifSplitter::create($gif)->split(); + $delays = $splitter->getDelays(); + + // set loops on core + if ($loops = $gif->getMainApplicationExtension()?->getLoops()) { + $core->setLoops($loops); + } + + // add GDImage instances to core + foreach ($splitter->coalesceToResources() as $key => $native) { + $core->push( + new Frame($native, $delays[$key] / 100) + ); + } + } catch (Exception $e) { + throw new DecoderException($e->getMessage(), $e->getCode(), $e); + } + + // create (possibly) animated image + $image = new Image($this->driver(), $core); + + // set media type + $image->origin()->setMediaType('image/gif'); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php new file mode 100644 index 0000000..7aee8f5 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php @@ -0,0 +1,28 @@ +getRealPath()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Driver.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Driver.php new file mode 100644 index 0000000..a0202e1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Driver.php @@ -0,0 +1,163 @@ +core->add( + $this->driver->handleInput($source)->core()->first()->setDelay($delay) + ); + + return $this; + } + + /** + * @throws RuntimeException + */ + public function __invoke(): ImageInterface + { + return new Image( + $this->driver, + $this->core + ); + } + }; + + $init($animation); + + return call_user_func($animation); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::colorProcessor() + */ + public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface + { + return new ColorProcessor($colorspace); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::fontProcessor() + */ + public function fontProcessor(): FontProcessorInterface + { + return new FontProcessor(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::supports() + */ + public function supports(string|Format|FileExtension|MediaType $identifier): bool + { + return match (Format::tryCreate($identifier)) { + Format::JPEG => boolval(imagetypes() & IMG_JPEG), + Format::WEBP => boolval(imagetypes() & IMG_WEBP), + Format::GIF => boolval(imagetypes() & IMG_GIF), + Format::PNG => boolval(imagetypes() & IMG_PNG), + Format::AVIF => boolval(imagetypes() & IMG_AVIF), + Format::BMP => boolval(imagetypes() & IMG_BMP), + default => false, + }; + } + + /** + * Return version of GD library + */ + public static function version(): string + { + return gd_info()['GD Version']; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php new file mode 100644 index 0000000..8b64271 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php @@ -0,0 +1,25 @@ +createEncodedImage(function ($pointer) use ($image): void { + imageavif($image->core()->native(), $pointer, $this->quality); + }, 'image/avif'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php new file mode 100644 index 0000000..1bb34c2 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php @@ -0,0 +1,25 @@ +createEncodedImage(function ($pointer) use ($image): void { + imagebmp($image->core()->native(), $pointer, false); + }, 'image/bmp'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php new file mode 100644 index 0000000..29d97ec --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php @@ -0,0 +1,64 @@ +isAnimated()) { + return $this->encodeAnimated($image); + } + + $gd = Cloner::clone($image->core()->native()); + + return $this->createEncodedImage(function ($pointer) use ($gd): void { + imageinterlace($gd, $this->interlaced); + imagegif($gd, $pointer); + }, 'image/gif'); + } + + /** + * @throws RuntimeException + */ + protected function encodeAnimated(ImageInterface $image): EncodedImage + { + try { + $builder = GifBuilder::canvas( + $image->width(), + $image->height() + ); + + foreach ($image as $frame) { + $builder->addFrame( + source: $this->encode($frame->toImage($image->driver()))->toFilePointer(), + delay: $frame->delay(), + interlaced: $this->interlaced + ); + } + + $builder->setLoops($image->loops()); + + return new EncodedImage($builder->encode(), 'image/gif'); + } catch (Exception $e) { + throw new EncoderException($e->getMessage(), $e->getCode(), $e); + } + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php new file mode 100644 index 0000000..0e3ecb8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php @@ -0,0 +1,36 @@ +driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + $output = Cloner::cloneBlended( + $image->core()->native(), + background: $blendingColor + ); + + return $this->createEncodedImage(function ($pointer) use ($output): void { + imageinterlace($output, $this->progressive); + imagejpeg($output, $pointer, $this->quality); + }, 'image/jpeg'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php new file mode 100644 index 0000000..fc58e9f --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php @@ -0,0 +1,52 @@ +prepareOutput($image); + + return $this->createEncodedImage(function ($pointer) use ($output): void { + imageinterlace($output, $this->interlaced); + imagepng($output, $pointer, -1); + }, 'image/png'); + } + + /** + * Prepare given image instance for PNG format output according to encoder settings + * + * @throws RuntimeException + * @throws ColorException + * @throws AnimationException + */ + private function prepareOutput(ImageInterface $image): GdImage + { + if ($this->indexed) { + $output = clone $image; + $output->reduceColors(255); + + return $output->core()->native(); + } + + return Cloner::clone($image->core()->native()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php new file mode 100644 index 0000000..076c915 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php @@ -0,0 +1,27 @@ +quality === 100 && defined('IMG_WEBP_LOSSLESS') ? IMG_WEBP_LOSSLESS : $this->quality; + + return $this->createEncodedImage(function ($pointer) use ($image, $quality): void { + imagewebp($image->core()->native(), $pointer, $quality); + }, 'image/webp'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php new file mode 100644 index 0000000..cedad43 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php @@ -0,0 +1,107 @@ +hasFilename()) { + // calculate box size from gd font + $box = new Rectangle(0, 0); + $chars = mb_strlen($text); + if ($chars > 0) { + $box->setWidth( + $chars * $this->gdCharacterWidth((int) $font->filename()) + ); + $box->setHeight( + $this->gdCharacterHeight((int) $font->filename()) + ); + } + return $box; + } + + // build full path to font file to make sure to pass absolute path to imageftbbox() + // because of issues with different GD version behaving differently when passing + // relative paths to imageftbbox() + $fontPath = realpath($font->filename()); + if ($fontPath === false) { + throw new FontException('Font file ' . $font->filename() . ' does not exist.'); + } + + // calculate box size from ttf font file with angle 0 + $box = imageftbbox( + size: $this->nativeFontSize($font), + angle: 0, + font_filename: $fontPath, + string: $text, + ); + + if ($box === false) { + throw new FontException('Unable to calculate box size of font ' . $font->filename() . '.'); + } + + // build size from points + return new Rectangle( + width: intval(abs($box[6] - $box[4])), // difference of upper-left-x and upper-right-x + height: intval(abs($box[7] - $box[1])), // difference if upper-left-y and lower-left-y + pivot: new Point($box[6], $box[7]), // position of upper-left corner + ); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::nativeFontSize() + */ + public function nativeFontSize(FontInterface $font): float + { + return floatval(round($font->size() * .76, 6)); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::leading() + */ + public function leading(FontInterface $font): int + { + return (int) round(parent::leading($font) * .8); + } + + /** + * Return width of a single character + */ + protected function gdCharacterWidth(int $gdfont): int + { + return $gdfont + 4; + } + + /** + * Return height of a single character + */ + protected function gdCharacterHeight(int $gdfont): int + { + return match ($gdfont) { + 2, 3 => 14, + 4, 5 => 16, + default => 8, + }; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Frame.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Frame.php new file mode 100644 index 0000000..e344f53 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Frame.php @@ -0,0 +1,193 @@ +native = $native; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::native() + */ + public function native(): GdImage + { + return $this->native; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::size() + */ + public function size(): SizeInterface + { + return new Rectangle(imagesx($this->native), imagesy($this->native)); + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::delay() + */ + public function delay(): float + { + return $this->delay; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setDelay() + */ + public function setDelay(float $delay): FrameInterface + { + $this->delay = $delay; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::dispose() + */ + public function dispose(): int + { + return $this->dispose; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setDispose() + * + * @throws InputException + */ + public function setDispose(int $dispose): FrameInterface + { + if (!in_array($dispose, [0, 1, 2, 3])) { + throw new InputException('Value for argument $dispose must be 0, 1, 2 or 3.'); + } + + $this->dispose = $dispose; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setOffset() + */ + public function setOffset(int $left, int $top): FrameInterface + { + $this->offset_left = $left; + $this->offset_top = $top; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::offsetLeft() + */ + public function offsetLeft(): int + { + return $this->offset_left; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setOffsetLeft() + */ + public function setOffsetLeft(int $offset): FrameInterface + { + $this->offset_left = $offset; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::offsetTop() + */ + public function offsetTop(): int + { + return $this->offset_top; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setOffsetTop() + */ + public function setOffsetTop(int $offset): FrameInterface + { + $this->offset_top = $offset; + + return $this; + } + + /** + * This workaround helps cloning GdImages which is currently not possible. + * + * @throws ColorException + */ + public function __clone(): void + { + $this->native = Cloner::clone($this->native); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php new file mode 100644 index 0000000..4e45337 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php @@ -0,0 +1,52 @@ +exif('IFD0.Orientation')) { + 2 => $image->flop(), + 3 => $image->rotate(180), + 4 => $image->rotate(180)->flop(), + 5 => $image->rotate(270)->flop(), + 6 => $image->rotate(270), + 7 => $image->rotate(90)->flop(), + 8 => $image->rotate(90), + default => $image + }; + + return $this->markAligned($image); + } + + /** + * Set exif data of image to top-left orientation, marking the image as + * aligned and making sure the rotation correction process is not + * performed again. + */ + private function markAligned(ImageInterface $image): ImageInterface + { + $exif = $image->exif()->map(function ($item) { + if (is_array($item) && array_key_exists('Orientation', $item)) { + $item['Orientation'] = 1; + return $item; + } + + return $item; + }); + + return $image->setExif($exif); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php new file mode 100644 index 0000000..861d11c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php @@ -0,0 +1,36 @@ +blendingColor($this->driver()); + + foreach ($image as $frame) { + // create new canvas with blending color as background + $modified = Cloner::cloneBlended( + $frame->native(), + background: $blendingColor + ); + + // set new gd image + $frame->setNative($modified); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php new file mode 100644 index 0000000..14fe41a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php @@ -0,0 +1,28 @@ +amount; $i++) { + imagefilter($frame->native(), IMG_FILTER_GAUSSIAN_BLUR); + } + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php new file mode 100644 index 0000000..022c679 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_BRIGHTNESS, intval($this->level * 2.55)); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php new file mode 100644 index 0000000..c753e43 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php @@ -0,0 +1,31 @@ +red * 2.55); + $green = (int) round($this->green * 2.55); + $blue = (int) round($this->blue * 2.55); + + foreach ($image as $frame) { + imagefilter($frame->native(), IMG_FILTER_COLORIZE, $red, $green, $blue); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php new file mode 100644 index 0000000..2065a15 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php @@ -0,0 +1,30 @@ +targetColorspace() instanceof RgbColorspace)) { + throw new NotSupportedException( + 'Only RGB colorspace is supported by GD driver.' + ); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php new file mode 100644 index 0000000..8462e8e --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php @@ -0,0 +1,93 @@ +getCropSize($image); + $resize = $this->getResizeSize($image); + $background = $this->driver()->handleInput($this->background); + $blendingColor = $this->driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + foreach ($image as $frame) { + $this->modify($frame, $crop, $resize, $background, $blendingColor); + } + + return $image; + } + + /** + * @throws ColorException + */ + protected function modify( + FrameInterface $frame, + SizeInterface $crop, + SizeInterface $resize, + ColorInterface $background, + ColorInterface $blendingColor + ): void { + // create new gd image + $modified = Cloner::cloneEmpty($frame->native(), $resize, $background); + + // make image area transparent to keep transparency + // even if background-color is set + $transparent = imagecolorallocatealpha( + $modified, + $blendingColor->channel(Red::class)->value(), + $blendingColor->channel(Green::class)->value(), + $blendingColor->channel(Blue::class)->value(), + 127, + ); + imagealphablending($modified, false); // do not blend / just overwrite + imagecolortransparent($modified, $transparent); + imagefilledrectangle( + $modified, + $crop->pivot()->x(), + $crop->pivot()->y(), + $crop->pivot()->x() + $crop->width() - 1, + $crop->pivot()->y() + $crop->height() - 1, + $transparent + ); + + // copy image from original with blending alpha + imagealphablending($modified, true); + imagecopyresampled( + $modified, + $frame->native(), + $crop->pivot()->x(), + $crop->pivot()->y(), + 0, + 0, + $crop->width(), + $crop->height(), + $frame->size()->width(), + $frame->size()->height() + ); + + // set new content as resource + $frame->setNative($modified); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php new file mode 100644 index 0000000..7a0ac6b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_CONTRAST, ($this->level * -1)); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php new file mode 100644 index 0000000..ac1cec1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php @@ -0,0 +1,19 @@ +resizeDown($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php new file mode 100644 index 0000000..e676e66 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php @@ -0,0 +1,59 @@ +getCropSize($image); + $resize = $this->getResizeSize($crop); + + foreach ($image as $frame) { + $this->modifyFrame($frame, $crop, $resize); + } + + return $image; + } + + /** + * @throws ColorException + */ + protected function modifyFrame(FrameInterface $frame, SizeInterface $crop, SizeInterface $resize): void + { + // create new image + $modified = Cloner::cloneEmpty($frame->native(), $resize); + + // copy content from resource + imagecopyresampled( + $modified, + $frame->native(), + 0, + 0, + $crop->pivot()->x(), + $crop->pivot()->y(), + $resize->width(), + $resize->height(), + $crop->width(), + $crop->height() + ); + + // set new content as resource + $frame->setNative($modified); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php new file mode 100644 index 0000000..c1ea482 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php @@ -0,0 +1,78 @@ +size(); + $crop = $this->crop($image); + $background = $this->driver()->handleInput($this->background); + + foreach ($image as $frame) { + $this->cropFrame($frame, $originalSize, $crop, $background); + } + + return $image; + } + + /** + * @throws ColorException + */ + protected function cropFrame( + FrameInterface $frame, + SizeInterface $originalSize, + SizeInterface $resizeTo, + ColorInterface $background + ): void { + // create new image with transparent background + $modified = Cloner::cloneEmpty($frame->native(), $resizeTo, $background); + + // define offset + $offset_x = $resizeTo->pivot()->x() + $this->offset_x; + $offset_y = $resizeTo->pivot()->y() + $this->offset_y; + + // define target width & height + $targetWidth = min($resizeTo->width(), $originalSize->width()); + $targetHeight = min($resizeTo->height(), $originalSize->height()); + $targetWidth = $targetWidth < $originalSize->width() ? $targetWidth + $offset_x : $targetWidth; + $targetHeight = $targetHeight < $originalSize->height() ? $targetHeight + $offset_y : $targetHeight; + + // don't alpha blend for copy operation to keep transparent areas of original image + imagealphablending($modified, false); + + // copy content from resource + imagecopyresampled( + $modified, + $frame->native(), + $offset_x * -1, + $offset_y * -1, + 0, + 0, + $targetWidth, + $targetHeight, + $targetWidth, + $targetHeight + ); + + // set new content as resource + $frame->setNative($modified); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php new file mode 100644 index 0000000..768d6f8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php @@ -0,0 +1,234 @@ +drawable->count() !== 3 && $this->drawable->count() !== 4) { + throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve'); + } + + [$polygon, $polygon_border_segments] = $this->calculateBezierPoints(); + + if ($this->drawable->hasBackgroundColor() || $this->drawable->hasBorder()) { + imagealphablending($frame->native(), true); + imageantialias($frame->native(), true); + } + + if ($this->drawable->hasBackgroundColor()) { + $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + imagesetthickness($frame->native(), 0); + imagefilledpolygon( + $frame->native(), + $polygon, + $background_color + ); + } + + if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 0) { + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + if ($this->drawable->borderSize() === 1) { + imagesetthickness($frame->native(), $this->drawable->borderSize()); + + $count = count($polygon); + for ($i = 0; $i < $count; $i += 2) { + if (array_key_exists($i + 2, $polygon) && array_key_exists($i + 3, $polygon)) { + imageline( + $frame->native(), + $polygon[$i], + $polygon[$i + 1], + $polygon[$i + 2], + $polygon[$i + 3], + $border_color + ); + } + } + } else { + $polygon_border_segments_total = count($polygon_border_segments); + + for ($i = 0; $i < $polygon_border_segments_total; $i += 1) { + imagefilledpolygon( + $frame->native(), + $polygon_border_segments[$i], + $border_color + ); + } + } + } + } + + return $image; + } + + /** + * Calculate interpolation points for quadratic beziers using the Bernstein polynomial form + * + * @return array{'x': float, 'y': float} + */ + private function calculateQuadraticBezierInterpolationPoint(float $t = 0.05): array + { + $remainder = 1 - $t; + $control_point_1_multiplier = $remainder * $remainder; + $control_point_2_multiplier = $remainder * $t * 2; + $control_point_3_multiplier = $t * $t; + + $x = ( + $this->drawable->first()->x() * $control_point_1_multiplier + + $this->drawable->second()->x() * $control_point_2_multiplier + + $this->drawable->last()->x() * $control_point_3_multiplier + ); + $y = ( + $this->drawable->first()->y() * $control_point_1_multiplier + + $this->drawable->second()->y() * $control_point_2_multiplier + + $this->drawable->last()->y() * $control_point_3_multiplier + ); + + return ['x' => $x, 'y' => $y]; + } + + /** + * Calculate interpolation points for cubic beziers using the Bernstein polynomial form + * + * @return array{'x': float, 'y': float} + */ + private function calculateCubicBezierInterpolationPoint(float $t = 0.05): array + { + $remainder = 1 - $t; + $t_squared = $t * $t; + $remainder_squared = $remainder * $remainder; + $control_point_1_multiplier = $remainder_squared * $remainder; + $control_point_2_multiplier = $remainder_squared * $t * 3; + $control_point_3_multiplier = $t_squared * $remainder * 3; + $control_point_4_multiplier = $t_squared * $t; + + $x = ( + $this->drawable->first()->x() * $control_point_1_multiplier + + $this->drawable->second()->x() * $control_point_2_multiplier + + $this->drawable->third()->x() * $control_point_3_multiplier + + $this->drawable->last()->x() * $control_point_4_multiplier + ); + $y = ( + $this->drawable->first()->y() * $control_point_1_multiplier + + $this->drawable->second()->y() * $control_point_2_multiplier + + $this->drawable->third()->y() * $control_point_3_multiplier + + $this->drawable->last()->y() * $control_point_4_multiplier + ); + + return ['x' => $x, 'y' => $y]; + } + + /** + * Calculate the points needed to draw a quadratic or cubic bezier with optional border/stroke + * + * @throws GeometryException + * @return array{0: array, 1: array} + */ + private function calculateBezierPoints(): array + { + if ($this->drawable->count() !== 3 && $this->drawable->count() !== 4) { + throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve'); + } + + $polygon = []; + $inner_polygon = []; + $outer_polygon = []; + $polygon_border_segments = []; + + // define ratio t; equivalent to 5 percent distance along edge + $t = 0.05; + + $polygon[] = $this->drawable->first()->x(); + $polygon[] = $this->drawable->first()->y(); + for ($i = $t; $i < 1; $i += $t) { + if ($this->drawable->count() === 3) { + $ip = $this->calculateQuadraticBezierInterpolationPoint($i); + } elseif ($this->drawable->count() === 4) { + $ip = $this->calculateCubicBezierInterpolationPoint($i); + } + $polygon[] = (int) $ip['x']; + $polygon[] = (int) $ip['y']; + } + $polygon[] = $this->drawable->last()->x(); + $polygon[] = $this->drawable->last()->y(); + + if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 1) { + // create the border/stroke effect by calculating two new curves with offset positions + // from the main polygon and then connecting the inner/outer curves to create separate + // 4-point polygon segments + $polygon_total_points = count($polygon); + $offset = ($this->drawable->borderSize() / 2); + + for ($i = 0; $i < $polygon_total_points; $i += 2) { + if (array_key_exists($i + 2, $polygon) && array_key_exists($i + 3, $polygon)) { + $dx = $polygon[$i + 2] - $polygon[$i]; + $dy = $polygon[$i + 3] - $polygon[$i + 1]; + $dxy_sqrt = ($dx * $dx + $dy * $dy) ** 0.5; + + // inner polygon + $scale = $offset / $dxy_sqrt; + $ox = -$dy * $scale; + $oy = $dx * $scale; + + $inner_polygon[] = $ox + $polygon[$i]; + $inner_polygon[] = $oy + $polygon[$i + 1]; + $inner_polygon[] = $ox + $polygon[$i + 2]; + $inner_polygon[] = $oy + $polygon[$i + 3]; + + // outer polygon + $scale = -$offset / $dxy_sqrt; + $ox = -$dy * $scale; + $oy = $dx * $scale; + + $outer_polygon[] = $ox + $polygon[$i]; + $outer_polygon[] = $oy + $polygon[$i + 1]; + $outer_polygon[] = $ox + $polygon[$i + 2]; + $outer_polygon[] = $oy + $polygon[$i + 3]; + } + } + + $inner_polygon_total_points = count($inner_polygon); + + for ($i = 0; $i < $inner_polygon_total_points; $i += 2) { + if (array_key_exists($i + 2, $inner_polygon) && array_key_exists($i + 3, $inner_polygon)) { + $polygon_border_segments[] = [ + $inner_polygon[$i], + $inner_polygon[$i + 1], + $outer_polygon[$i], + $outer_polygon[$i + 1], + $outer_polygon[$i + 2], + $outer_polygon[$i + 3], + $inner_polygon[$i + 2], + $inner_polygon[$i + 3], + ]; + } + } + } + + return [$polygon, $polygon_border_segments]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php new file mode 100644 index 0000000..4c4f669 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php @@ -0,0 +1,78 @@ +drawable->hasBorder()) { + imagealphablending($frame->native(), true); + + // slightly smaller ellipse to keep 1px bordered edges clean + if ($this->drawable->hasBackgroundColor()) { + imagefilledellipse( + $frame->native(), + $this->drawable()->position()->x(), + $this->drawable->position()->y(), + $this->drawable->width() - 1, + $this->drawable->height() - 1, + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + + // gd's imageellipse ignores imagesetthickness + // so i use imagearc with 360 degrees instead. + imagesetthickness( + $frame->native(), + $this->drawable->borderSize(), + ); + + imagearc( + $frame->native(), + $this->drawable()->position()->x(), + $this->drawable()->position()->y(), + $this->drawable->width(), + $this->drawable->height(), + 0, + 360, + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ) + ); + } else { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), 0); + imagefilledellipse( + $frame->native(), + $this->drawable()->position()->x(), + $this->drawable()->position()->y(), + $this->drawable->width(), + $this->drawable->height(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php new file mode 100644 index 0000000..ccf6974 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php @@ -0,0 +1,39 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + imageantialias($frame->native(), true); + imagesetthickness($frame->native(), $this->drawable->width()); + imageline( + $frame->native(), + $this->drawable->start()->x(), + $this->drawable->start()->y(), + $this->drawable->end()->x(), + $this->drawable->end()->y(), + $color + ); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php new file mode 100644 index 0000000..9fc954c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php @@ -0,0 +1,36 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + imagesetpixel( + $frame->native(), + $this->position->x(), + $this->position->y(), + $color + ); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php new file mode 100644 index 0000000..c0cc77b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php @@ -0,0 +1,51 @@ +drawable->hasBackgroundColor()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), 0); + imagefilledpolygon( + $frame->native(), + $this->drawable->toArray(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + + if ($this->drawable->hasBorder()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), $this->drawable->borderSize()); + imagepolygon( + $frame->native(), + $this->drawable->toArray(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ) + ); + } + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php new file mode 100644 index 0000000..f4a2d79 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php @@ -0,0 +1,61 @@ +drawable->position(); + + foreach ($image as $frame) { + // draw background + if ($this->drawable->hasBackgroundColor()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), 0); + imagefilledrectangle( + $frame->native(), + $position->x(), + $position->y(), + $position->x() + $this->drawable->width(), + $position->y() + $this->drawable->height(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + + // draw border + if ($this->drawable->hasBorder()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), $this->drawable->borderSize()); + imagerectangle( + $frame->native(), + $position->x(), + $position->y(), + $position->x() + $this->drawable->width(), + $position->y() + $this->drawable->height(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ) + ); + } + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php new file mode 100644 index 0000000..412f805 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php @@ -0,0 +1,67 @@ +color($image); + + foreach ($image as $frame) { + if ($this->hasPosition()) { + $this->floodFillWithColor($frame, $color); + } else { + $this->fillAllWithColor($frame, $color); + } + } + + return $image; + } + + /** + * @throws RuntimeException + */ + private function color(ImageInterface $image): int + { + return $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + } + + private function floodFillWithColor(FrameInterface $frame, int $color): void + { + imagefill( + $frame->native(), + $this->position->x(), + $this->position->y(), + $color + ); + } + + private function fillAllWithColor(FrameInterface $frame, int $color): void + { + imagealphablending($frame->native(), true); + imagefilledrectangle( + $frame->native(), + 0, + 0, + $frame->size()->width() - 1, + $frame->size()->height() - 1, + $color + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php new file mode 100644 index 0000000..0107200 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FLIP_VERTICAL); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php new file mode 100644 index 0000000..7033175 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FLIP_HORIZONTAL); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php new file mode 100644 index 0000000..8da6499 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php @@ -0,0 +1,26 @@ +native(), 1, $this->gamma); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php new file mode 100644 index 0000000..a1cf280 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_GRAYSCALE); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php new file mode 100644 index 0000000..e2c8dc6 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_NEGATE); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php new file mode 100644 index 0000000..52a6acb --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php @@ -0,0 +1,24 @@ +size() + ->containMax( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php new file mode 100644 index 0000000..ecbe3e5 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_PIXELATE, $this->size, true); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php new file mode 100644 index 0000000..44333c7 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php @@ -0,0 +1,111 @@ +driver()->handleInput($this->element); + $position = $this->getPosition($image, $watermark); + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + + if ($this->opacity === 100) { + $this->placeOpaque($frame, $watermark, $position); + } else { + $this->placeTransparent($frame, $watermark, $position); + } + } + + return $image; + } + + /** + * Insert watermark with 100% opacity + * + * @throws RuntimeException + */ + private function placeOpaque(FrameInterface $frame, ImageInterface $watermark, PointInterface $position): void + { + imagecopy( + $frame->native(), + $watermark->core()->native(), + $position->x(), + $position->y(), + 0, + 0, + $watermark->width(), + $watermark->height() + ); + } + + /** + * Insert watermark transparent with current opacity + * + * Unfortunately, the original PHP function imagecopymerge does not work reliably. + * For example, any transparency of the image to be inserted is not applied correctly. + * For this reason, a new GDImage is created into which the original image is inserted + * in the first step and the watermark is inserted with 100% opacity in the second + * step. This combination is then transferred to the original image again with the + * respective opacity. + * + * Please note: Unfortunately, there is still an edge case, when a transparent image + * is placed on a transparent background, the "double" transparent areas appear opaque! + * + * @throws RuntimeException + */ + private function placeTransparent(FrameInterface $frame, ImageInterface $watermark, PointInterface $position): void + { + $cut = imagecreatetruecolor($watermark->width(), $watermark->height()); + + imagecopy( + $cut, + $frame->native(), + 0, + 0, + $position->x(), + $position->y(), + imagesx($cut), + imagesy($cut) + ); + + imagecopy( + $cut, + $watermark->core()->native(), + 0, + 0, + 0, + 0, + imagesx($cut), + imagesy($cut) + ); + + imagecopymerge( + $frame->native(), + $cut, + $position->x(), + $position->y(), + 0, + 0, + $watermark->width(), + $watermark->height(), + $this->opacity + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php new file mode 100644 index 0000000..a862395 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php @@ -0,0 +1,25 @@ +limit <= 0) { + throw new InputException('Quantization limit must be greater than 0.'); + } + + // no color reduction if the limit is higher than the colors in the img + $colorCount = imagecolorstotal($image->core()->native()); + if ($colorCount > 0 && $this->limit > $colorCount) { + return $image; + } + + $width = $image->width(); + $height = $image->height(); + + $background = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + $blendingColor = $this->driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + foreach ($image as $frame) { + // create new image for color quantization + $reduced = Cloner::cloneEmpty($frame->native(), background: $blendingColor); + + // fill with background + imagefill($reduced, 0, 0, $background); + + // set transparency + imagecolortransparent($reduced, $background); + + // copy original image (colors are limited automatically in the copy process) + imagecopy($reduced, $frame->native(), 0, 0, 0, 0, $width, $height); + + // gd library does not support color quantization directly therefore the + // colors are decrease by transforming the image to a palette version + imagetruecolortopalette($reduced, true, $this->limit); + + $frame->setNative($reduced); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php new file mode 100644 index 0000000..2ef1d89 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php @@ -0,0 +1,26 @@ +core()->setNative( + $this->selectedFrame($image)->native() + ); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php new file mode 100644 index 0000000..7f73cc7 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php @@ -0,0 +1,32 @@ +cropSize($image); + + $image->modify(new CropModifier( + $cropSize->width(), + $cropSize->height(), + $cropSize->pivot()->x(), + $cropSize->pivot()->y(), + $this->background, + )); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php new file mode 100644 index 0000000..53e375f --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php @@ -0,0 +1,16 @@ +size()->resizeDown($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php new file mode 100644 index 0000000..cfaa295 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php @@ -0,0 +1,70 @@ +getAdjustedSize($image); + foreach ($image as $frame) { + $this->resizeFrame($frame, $resizeTo); + } + + return $image; + } + + /** + * @throws ColorException + */ + private function resizeFrame(FrameInterface $frame, SizeInterface $resizeTo): void + { + // create empty canvas in target size + $modified = Cloner::cloneEmpty($frame->native(), $resizeTo); + + // copy content from resource + imagecopyresampled( + $modified, + $frame->native(), + $resizeTo->pivot()->x(), + $resizeTo->pivot()->y(), + 0, + 0, + $resizeTo->width(), + $resizeTo->height(), + $frame->size()->width(), + $frame->size()->height() + ); + + // set new content as resource + $frame->setNative($modified); + } + + /** + * Return the size the modifier will resize to + * + * @throws RuntimeException + * @throws GeometryException + */ + protected function getAdjustedSize(ImageInterface $image): SizeInterface + { + return $image->size()->resize($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php new file mode 100644 index 0000000..d6fd504 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php @@ -0,0 +1,29 @@ +x)); + $y = intval(round($this->y)); + + foreach ($image as $frame) { + imageresolution($frame->native(), $x, $y); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php new file mode 100644 index 0000000..4db0750 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php @@ -0,0 +1,106 @@ +driver()->handleInput($this->background); + + foreach ($image as $frame) { + $this->modifyFrame($frame, $background); + } + + return $image; + } + + /** + * Apply rotation modification on given frame, given background + * color is used for newly create image areas + * + * @throws ColorException + */ + protected function modifyFrame(FrameInterface $frame, ColorInterface $background): void + { + // get transparent color from frame core + $transparent = match ($transparent = imagecolortransparent($frame->native())) { + -1 => imagecolorallocatealpha( + $frame->native(), + $background->channel(Red::class)->value(), + $background->channel(Green::class)->value(), + $background->channel(Blue::class)->value(), + 127 + ), + default => $transparent, + }; + + // rotate original image against transparent background + $rotated = imagerotate( + $frame->native(), + $this->rotationAngle(), + $transparent + ); + + // create size from original after rotation + $container = (new Rectangle( + imagesx($rotated), + imagesy($rotated), + ))->movePivot('center'); + + // create size from original and rotate points + $cutout = (new Rectangle( + imagesx($frame->native()), + imagesy($frame->native()), + $container->pivot() + ))->align('center') + ->valign('center') + ->rotate($this->rotationAngle() * -1); + + // create new gd image + $modified = Cloner::cloneEmpty($frame->native(), $container, $background); + + // draw the cutout on new gd image to have a transparent + // background where the rotated image will be placed + imagealphablending($modified, false); + imagefilledpolygon( + $modified, + $cutout->toArray(), + imagecolortransparent($modified) + ); + + // place rotated image on new gd image + imagealphablending($modified, true); + imagecopy( + $modified, + $rotated, + 0, + 0, + 0, + 0, + imagesx($rotated), + imagesy($rotated) + ); + + $frame->setNative($modified); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php new file mode 100644 index 0000000..15287e6 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php @@ -0,0 +1,21 @@ +size()->scaleDown($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php new file mode 100644 index 0000000..2486cbb --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php @@ -0,0 +1,16 @@ +size()->scale($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php new file mode 100644 index 0000000..3943d2c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php @@ -0,0 +1,45 @@ +matrix(); + foreach ($image as $frame) { + imageconvolution($frame->native(), $matrix, 1, 0); + } + + return $image; + } + + /** + * Create matrix to be used by imageconvolution() + * + * @return array> + */ + private function matrix(): array + { + $min = $this->amount >= 10 ? $this->amount * -0.01 : 0; + $max = $this->amount * -0.025; + $abs = ((4 * $min + 4 * $max) * -1) + 1; + + return [ + [$min, $max, $min], + [$max, $abs, $max], + [$min, $max, $min] + ]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php new file mode 100644 index 0000000..8986e7f --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php @@ -0,0 +1,29 @@ +offset >= $image->count()) { + throw new AnimationException('Offset is not in the range of frames.'); + } + + $image->core()->slice($this->offset, $this->length); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php new file mode 100644 index 0000000..074f904 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php @@ -0,0 +1,145 @@ +driver()->fontProcessor(); + $lines = $fontProcessor->textBlock($this->text, $this->font, $this->position); + + // decode text colors + $textColor = $this->gdTextColor($image); + $strokeColor = $this->gdStrokeColor($image); + + // build full path to font file to make sure to pass absolute path to imageftbbox() + // because of issues with different GD version behaving differently when passing + // relative paths to imagettftext() + $fontPath = $this->font->hasFilename() ? realpath($this->font->filename()) : false; + if ($this->font->hasFilename() && $fontPath === false) { + throw new FontException('Font file ' . $this->font->filename() . ' does not exist.'); + } + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + if ($this->font->hasFilename()) { + foreach ($lines as $line) { + foreach ($this->strokeOffsets($this->font) as $offset) { + imagettftext( + image: $frame->native(), + size: $fontProcessor->nativeFontSize($this->font), + angle: $this->font->angle() * -1, + x: $line->position()->x() + $offset->x(), + y: $line->position()->y() + $offset->y(), + color: $strokeColor, + font_filename: $fontPath, + text: (string) $line + ); + } + + imagettftext( + image: $frame->native(), + size: $fontProcessor->nativeFontSize($this->font), + angle: $this->font->angle() * -1, + x: $line->position()->x(), + y: $line->position()->y(), + color: $textColor, + font_filename: $fontPath, + text: (string) $line + ); + } + } else { + foreach ($lines as $line) { + foreach ($this->strokeOffsets($this->font) as $offset) { + imagestring( + $frame->native(), + $this->gdFont(), + $line->position()->x() + $offset->x(), + $line->position()->y() + $offset->y(), + (string) $line, + $strokeColor + ); + } + + imagestring( + $frame->native(), + $this->gdFont(), + $line->position()->x(), + $line->position()->y(), + (string) $line, + $textColor + ); + } + } + } + + return $image; + } + + /** + * Decode text color in GD compatible format + * + * @throws RuntimeException + * @throws ColorException + */ + protected function gdTextColor(ImageInterface $image): int + { + return $this + ->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative(parent::textColor()); + } + + /** + * Decode color for stroke (outline) effect in GD compatible format + * + * @throws RuntimeException + * @throws ColorException + */ + protected function gdStrokeColor(ImageInterface $image): int + { + if (!$this->font->hasStrokeEffect()) { + return 0; + } + + $color = parent::strokeColor(); + + if ($color->isTransparent()) { + throw new ColorException( + 'The stroke color must be fully opaque.' + ); + } + + return $this + ->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative($color); + } + + /** + * Return GD's internal font size (if no ttf file is set) + */ + private function gdFont(): int + { + if (is_numeric($this->font->filename())) { + return intval($this->font->filename()); + } + + return 1; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php new file mode 100644 index 0000000..ff86c8b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php @@ -0,0 +1,85 @@ +isAnimated()) { + throw new NotSupportedException('Trim modifier cannot be applied to animated images.'); + } + + // apply tolerance with a min. value of .5 because the default tolerance of '0' should + // already trim away similar colors which is not the case with imagecropauto. + $trimmed = imagecropauto( + $image->core()->native(), + IMG_CROP_THRESHOLD, + max([.5, $this->tolerance / 10]), + $this->trimColor($image) + ); + + // if the tolerance is very high, it is possible that no image is left. + // imagick returns a 1x1 pixel image in this case. this does the same. + if ($trimmed === false) { + $trimmed = $this->driver()->createImage(1, 1)->core()->native(); + } + + $image->core()->setNative($trimmed); + + return $image; + } + + /** + * Create an average color from the colors of the four corner points of the given image + * + * @throws RuntimeException + * @throws AnimationException + */ + private function trimColor(ImageInterface $image): int + { + // trim color base + $red = 0; + $green = 0; + $blue = 0; + + // corner coordinates + $size = $image->size(); + $cornerPoints = [ + new Point(0, 0), + new Point($size->width() - 1, 0), + new Point(0, $size->height() - 1), + new Point($size->width() - 1, $size->height() - 1), + ]; + + // create an average color to be used in trim operation + foreach ($cornerPoints as $pos) { + $cornerColor = imagecolorat($image->core()->native(), $pos->x(), $pos->y()); + $rgb = imagecolorsforindex($image->core()->native(), $cornerColor); + $red += round(round(($rgb['red'] / 51)) * 51); + $green += round(round(($rgb['green'] / 51)) * 51); + $blue += round(round(($rgb['blue'] / 51)) * 51); + } + + $red = (int) round($red / 4); + $green = (int) round($green / 4); + $blue = (int) round($blue / 4); + + return imagecolorallocate($image->core()->native(), $red, $green, $blue); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php new file mode 100644 index 0000000..181b4e4 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php @@ -0,0 +1,23 @@ +core()->native()->getImageColorspace()) { + Imagick::COLORSPACE_CMYK => new CmykColorspace(), + default => new RgbColorspace(), + }; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php new file mode 100644 index 0000000..b3ab996 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php @@ -0,0 +1,17 @@ +core()->native()->getImageHeight(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php new file mode 100644 index 0000000..d060e34 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php @@ -0,0 +1,36 @@ +colorAt( + $image->colorspace(), + $image->core()->frame($this->frame_key)->native() + ); + } + + /** + * @throws ColorException + */ + protected function colorAt(ColorspaceInterface $colorspace, Imagick $imagick): ColorInterface + { + return $this->driver() + ->colorProcessor($colorspace) + ->nativeToColor( + $imagick->getImagePixelColor($this->x, $this->y) + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php new file mode 100644 index 0000000..577b9c8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php @@ -0,0 +1,25 @@ +colorspace(); + + foreach ($image as $frame) { + $colors->push( + parent::colorAt($colorspace, $frame->native()) + ); + } + + return $colors; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php new file mode 100644 index 0000000..61fef32 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php @@ -0,0 +1,25 @@ +core()->native()->getImageProfiles('icc'); + + if (!array_key_exists('icc', $profiles)) { + throw new ColorException('No ICC profile found in image.'); + } + + return new Profile($profiles['icc']); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php new file mode 100644 index 0000000..1a1b632 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php @@ -0,0 +1,25 @@ +core()->native(); + $imageResolution = $imagick->getImageResolution(); + + return new Resolution( + $imageResolution['x'], + $imageResolution['y'], + $imagick->getImageUnits(), + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php new file mode 100644 index 0000000..77b1d50 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php @@ -0,0 +1,17 @@ +core()->native()->getImageWidth(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php new file mode 100644 index 0000000..4676ab1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php @@ -0,0 +1,45 @@ +convertTo($this->colorspace) + ); + } + + public function nativeToColor(mixed $native): ColorInterface + { + return match ($this->colorspace::class) { + CmykColorspace::class => $this->colorspace->colorFromNormalized([ + $native->getColorValue(Imagick::COLOR_CYAN), + $native->getColorValue(Imagick::COLOR_MAGENTA), + $native->getColorValue(Imagick::COLOR_YELLOW), + $native->getColorValue(Imagick::COLOR_BLACK), + ]), + default => $this->colorspace->colorFromNormalized([ + $native->getColorValue(Imagick::COLOR_RED), + $native->getColorValue(Imagick::COLOR_GREEN), + $native->getColorValue(Imagick::COLOR_BLUE), + $native->getColorValue(Imagick::COLOR_ALPHA), + ]), + }; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Core.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Core.php new file mode 100644 index 0000000..87dcf98 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Core.php @@ -0,0 +1,324 @@ + + */ +class Core implements CoreInterface, Iterator +{ + protected int $iteratorIndex = 0; + + /** + * Create new core instance + * + * @return void + */ + public function __construct(protected Imagick $imagick) + { + // + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::has() + */ + public function has(int|string $key): bool + { + try { + $result = $this->imagick->setIteratorIndex($key); + } catch (ImagickException) { + return false; + } + + return $result; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::push() + */ + public function push(mixed $item): CollectionInterface + { + return $this->add($item); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::get() + */ + public function get(int|string $key, mixed $default = null): mixed + { + try { + $this->imagick->setIteratorIndex($key); + } catch (ImagickException) { + return $default; + } + + return new Frame($this->imagick->current()); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::getAtPosition() + */ + public function getAtPosition(int $key = 0, mixed $default = null): mixed + { + return $this->get($key, $default); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::empty() + */ + public function empty(): CollectionInterface + { + $this->imagick->clear(); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::slice() + */ + public function slice(int $offset, ?int $length = null): CollectionInterface + { + $allowed_indexes = []; + $length = is_null($length) ? $this->count() : $length; + for ($i = $offset; $i < $offset + $length; $i++) { + $allowed_indexes[] = $i; + } + + $sliced = new Imagick(); + foreach ($this->imagick as $key => $native) { + if (in_array($key, $allowed_indexes)) { + $sliced->addImage($native->getImage()); + } + } + + $sliced = $sliced->coalesceImages(); + $sliced->setImageIterations($this->imagick->getImageIterations()); + + $this->imagick = $sliced; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::add() + */ + public function add(FrameInterface $frame): CoreInterface + { + $imagick = $frame->native(); + + $imagick->setImageDelay( + (int) round($frame->delay() * 100) + ); + + $imagick->setImageDispose($frame->dispose()); + + $size = $frame->size(); + $imagick->setImagePage( + $size->width(), + $size->height(), + $frame->offsetLeft(), + $frame->offsetTop() + ); + + $this->imagick->addImage($imagick); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::count() + */ + public function count(): int + { + return $this->imagick->getNumberImages(); + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function current(): mixed + { + $this->imagick->setIteratorIndex($this->iteratorIndex); + + return new Frame($this->imagick->current()); + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function next(): void + { + $this->iteratorIndex += 1; + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function key(): mixed + { + return $this->iteratorIndex; + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function valid(): bool + { + try { + $result = $this->imagick->setIteratorIndex($this->iteratorIndex); + } catch (ImagickException) { + return false; + } + + return $result; + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function rewind(): void + { + $this->iteratorIndex = 0; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::native() + */ + public function native(): mixed + { + return $this->imagick; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setNative() + */ + public function setNative(mixed $native): CoreInterface + { + $this->imagick = $native; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::frame() + */ + public function frame(int $position): FrameInterface + { + foreach ($this->imagick as $core) { + if ($core->getIteratorIndex() === $position) { + return new Frame($core); + } + } + + throw new AnimationException('Frame #' . $position . ' could not be found in the image.'); + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::loops() + */ + public function loops(): int + { + return $this->imagick->getImageIterations(); + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setLoops() + */ + public function setLoops(int $loops): CoreInterface + { + $this->imagick = $this->imagick->coalesceImages(); + $this->imagick->setImageIterations($loops); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::first() + */ + public function first(): FrameInterface + { + return $this->frame(0); + } + + /** + * {@inheritdoc} + * + * @see CollectableInterface::last() + */ + public function last(): FrameInterface + { + return $this->frame($this->count() - 1); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::toArray() + */ + public function toArray(): array + { + $frames = []; + + foreach ($this as $frame) { + $frames[] = $frame; + } + + return $frames; + } + + /** + * Clone instance + */ + public function __clone(): void + { + $this->imagick = clone $this->imagick; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php new file mode 100644 index 0000000..ea15062 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php @@ -0,0 +1,26 @@ +isValidBase64($input)) { + throw new DecoderException('Unable to decode input'); + } + + return parent::decode(base64_decode((string) $input)); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php new file mode 100644 index 0000000..96850b3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php @@ -0,0 +1,47 @@ +readImageBlob($input); + } catch (ImagickException) { + throw new DecoderException('Unable to decode input'); + } + + // decode image + $image = parent::decode($imagick); + + // get media type enum from string media type + $format = Format::tryCreate($image->origin()->mediaType()); + + // extract exif data for appropriate formats + if (in_array($format, [Format::JPEG, Format::TIFF])) { + $image->setExif($this->extractExifData($input)); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php new file mode 100644 index 0000000..f395cb0 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php @@ -0,0 +1,36 @@ +parseDataUri($input); + + if (!$uri->isValid()) { + throw new DecoderException('Unable to decode input'); + } + + if ($uri->isBase64Encoded()) { + return parent::decode(base64_decode($uri->data())); + } + + return parent::decode(urldecode($uri->data())); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php new file mode 100644 index 0000000..2348a6b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php @@ -0,0 +1,27 @@ +toString()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php new file mode 100644 index 0000000..a418099 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php @@ -0,0 +1,46 @@ +isFile($input)) { + throw new DecoderException('Unable to decode input'); + } + + try { + $imagick = new Imagick(); + $imagick->readImage($input); + } catch (ImagickException) { + throw new DecoderException('Unable to decode input'); + } + + // decode image + $image = parent::decode($imagick); + + // set file path on origin + $image->origin()->setFilePath($input); + + // extract exif data for the appropriate formats + if (in_array($imagick->getImageFormat(), ['JPEG', 'TIFF', 'TIF'])) { + $image->setExif($this->extractExifData($input)); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php new file mode 100644 index 0000000..08717e0 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php @@ -0,0 +1,32 @@ +getImageFormat() !== 'JPEG') { + $input = $input->coalesceImages(); + } + + // turn images with colorspace 'GRAY' into 'SRGB' to avoid working on + // greyscale colorspace images as this results images loosing color + // information when placed into this image. + if ($input->getImageColorspace() == Imagick::COLORSPACE_GRAY) { + $input->setImageColorspace(Imagick::COLORSPACE_SRGB); + } + + // create image object + $image = new Image( + $this->driver(), + new Core($input) + ); + + // discard animation depending on config + if (!$this->driver()->config()->decodeAnimation) { + $image->modify(new RemoveAnimationModifier()); + } + + // adjust image rotatation + if ($this->driver()->config()->autoOrientation) { + $image->modify(new AlignRotationModifier()); + } + + // set media type on origin + $image->origin()->setMediaType($input->getImageMimeType()); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php new file mode 100644 index 0000000..8850123 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php @@ -0,0 +1,27 @@ +getRealPath()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Driver.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Driver.php new file mode 100644 index 0000000..61fd05f --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Driver.php @@ -0,0 +1,175 @@ +newImage($width, $height, $background, 'png'); + $imagick->setType(Imagick::IMGTYPE_UNDEFINED); + $imagick->setImageType(Imagick::IMGTYPE_UNDEFINED); + $imagick->setColorspace(Imagick::COLORSPACE_SRGB); + $imagick->setImageResolution(96, 96); + $imagick->setImageBackgroundColor($background); + + return new Image($this, new Core($imagick)); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::createAnimation() + * + * @throws RuntimeException + */ + public function createAnimation(callable $init): ImageInterface + { + $imagick = new Imagick(); + $imagick->setFormat('gif'); + + $animation = new class ($this, $imagick) + { + public function __construct( + protected DriverInterface $driver, + public Imagick $imagick + ) { + // + } + + /** + * @throws RuntimeException + */ + public function add(mixed $source, float $delay = 1): self + { + $native = $this->driver->handleInput($source)->core()->native(); + $native->setImageDelay(intval(round($delay * 100))); + + $this->imagick->addImage($native); + + return $this; + } + + /** + * @throws RuntimeException + */ + public function __invoke(): ImageInterface + { + return new Image( + $this->driver, + new Core($this->imagick) + ); + } + }; + + $init($animation); + + return call_user_func($animation); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::colorProcessor() + */ + public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface + { + return new ColorProcessor($colorspace); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::fontProcessor() + */ + public function fontProcessor(): FontProcessorInterface + { + return new FontProcessor(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::supports() + */ + public function supports(string|Format|FileExtension|MediaType $identifier): bool + { + try { + $format = Format::create($identifier); + } catch (NotSupportedException) { + return false; + } + + return count(Imagick::queryFormats($format->name)) >= 1; + } + + /** + * Return version of ImageMagick library + * + * @throws DriverException + */ + public static function version(): string + { + $pattern = '/^ImageMagick (?P(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)' . + '(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?' . + '(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)/'; + + if (preg_match($pattern, Imagick::getVersion()['versionString'], $matches) !== 1) { + throw new DriverException('Unable to read ImageMagick version number.'); + } + + return $matches['version']; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php new file mode 100644 index 0000000..64cb4ae --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php @@ -0,0 +1,37 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/avif'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php new file mode 100644 index 0000000..eede0f0 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php @@ -0,0 +1,29 @@ +core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + + return new EncodedImage($imagick->getImagesBlob(), 'image/bmp'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php new file mode 100644 index 0000000..f9c98b0 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php @@ -0,0 +1,34 @@ +core()->native(); + + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + + if ($this->interlaced) { + $imagick->setInterlaceScheme(Imagick::INTERLACE_LINE); + } + + return new EncodedImage($imagick->getImagesBlob(), 'image/gif'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php new file mode 100644 index 0000000..471edb1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php @@ -0,0 +1,33 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/heic'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php new file mode 100644 index 0000000..16f6593 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php @@ -0,0 +1,39 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setImageBackgroundColor('white'); + $imagick->setBackgroundColor('white'); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/jp2'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php new file mode 100644 index 0000000..e2365f3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php @@ -0,0 +1,57 @@ +driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + // resolve blending color because jpeg has no transparency + $background = $this->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative($blendingColor); + + // set alpha value to 1 because Imagick renders + // possible full transparent colors as black + $background->setColorValue(Imagick::COLOR_ALPHA, 1); + + // strip meta data + if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + /** @var Imagick $imagick */ + $imagick = $image->core()->native(); + $imagick->setImageBackgroundColor($background); + $imagick->setBackgroundColor($background); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + $imagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); + + if ($this->progressive) { + $imagick->setInterlaceScheme(Imagick::INTERLACE_PLANE); + } + + return new EncodedImage($imagick->getImagesBlob(), 'image/jpeg'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php new file mode 100644 index 0000000..cce49d5 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php @@ -0,0 +1,46 @@ +indexed) { + // reduce colors + $output = clone $image; + $output->reduceColors(256); + + $output = $output->core()->native(); + $output->setFormat('PNG'); + $output->setImageFormat('PNG'); + } else { + $output = clone $image->core()->native(); + $output->setFormat('PNG32'); + $output->setImageFormat('PNG32'); + } + + $output->setCompression(Imagick::COMPRESSION_ZIP); + $output->setImageCompression(Imagick::COMPRESSION_ZIP); + + if ($this->interlaced) { + $output->setInterlaceScheme(Imagick::INTERLACE_LINE); + } + + return new EncodedImage($output->getImagesBlob(), 'image/png'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php new file mode 100644 index 0000000..46e6653 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php @@ -0,0 +1,35 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($imagick->getImageCompression()); + $imagick->setImageCompression($imagick->getImageCompression()); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/tiff'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php new file mode 100644 index 0000000..b65be3b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php @@ -0,0 +1,47 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setImageBackgroundColor(new ImagickPixel('transparent')); + + if (!$image->isAnimated()) { + $imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_MERGE); + } + + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setImageCompressionQuality($this->quality); + + if ($this->quality === 100) { + $imagick->setOption('webp:lossless', 'true'); + } + + return new EncodedImage($imagick->getImagesBlob(), 'image/webp'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php new file mode 100644 index 0000000..16fc4c8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php @@ -0,0 +1,69 @@ +toImagickDraw($font); + $dimensions = (new Imagick())->queryFontMetrics($draw, $text); + + return new Rectangle( + intval(round($dimensions['textWidth'])), + intval(round($dimensions['ascender'] + $dimensions['descender'])), + ); + } + + /** + * Imagick::annotateImage() needs an ImagickDraw object - this method takes + * the font object as the base and adds an optional passed color to the new + * ImagickDraw object. + * + * @throws FontException + * @throws ImagickDrawException + * @throws ImagickException + */ + public function toImagickDraw(FontInterface $font, ?ImagickPixel $color = null): ImagickDraw + { + if (!$font->hasFilename()) { + throw new FontException('No font file specified.'); + } + + $draw = new ImagickDraw(); + $draw->setStrokeAntialias(true); + $draw->setTextAntialias(true); + $draw->setFont($font->filename()); + $draw->setFontSize($this->nativeFontSize($font)); + $draw->setTextAlignment(Imagick::ALIGN_LEFT); + + if ($color instanceof ImagickPixel) { + $draw->setFillColor($color); + } + + return $draw; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Frame.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Frame.php new file mode 100644 index 0000000..269a8db --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Frame.php @@ -0,0 +1,185 @@ +native->setImageBackgroundColor($background); + $this->native->setBackgroundColor($background); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::toImage() + */ + public function toImage(DriverInterface $driver): ImageInterface + { + return new Image($driver, new Core($this->native())); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setNative() + */ + public function setNative(mixed $native): FrameInterface + { + $this->native = $native; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::native() + */ + public function native(): Imagick + { + return $this->native; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::size() + */ + public function size(): SizeInterface + { + return new Rectangle( + $this->native->getImageWidth(), + $this->native->getImageHeight() + ); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::delay() + */ + public function delay(): float + { + return $this->native->getImageDelay() / 100; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setDelay() + */ + public function setDelay(float $delay): FrameInterface + { + $this->native->setImageDelay(intval(round($delay * 100))); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::dispose() + */ + public function dispose(): int + { + return $this->native->getImageDispose(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setDispose() + * + * @throws InputException + */ + public function setDispose(int $dispose): FrameInterface + { + if (!in_array($dispose, [0, 1, 2, 3])) { + throw new InputException('Value for argument $dispose must be 0, 1, 2 or 3.'); + } + + $this->native->setImageDispose($dispose); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setOffset() + */ + public function setOffset(int $left, int $top): FrameInterface + { + $this->native->setImagePage( + $this->native->getImageWidth(), + $this->native->getImageHeight(), + $left, + $top + ); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::offsetLeft() + */ + public function offsetLeft(): int + { + return $this->native->getImagePage()['x']; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setOffsetLeft() + */ + public function setOffsetLeft(int $offset): FrameInterface + { + return $this->setOffset($offset, $this->offsetTop()); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::offsetTop() + */ + public function offsetTop(): int + { + return $this->native->getImagePage()['y']; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setOffsetTop() + */ + public function setOffsetTop(int $offset): FrameInterface + { + return $this->setOffset($this->offsetLeft(), $offset); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php new file mode 100644 index 0000000..6b84b30 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php @@ -0,0 +1,54 @@ +core()->native()->getImageOrientation()) { + case Imagick::ORIENTATION_TOPRIGHT: // 2 + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_BOTTOMRIGHT: // 3 + $image->core()->native()->rotateImage("#000", 180); + break; + + case Imagick::ORIENTATION_BOTTOMLEFT: // 4 + $image->core()->native()->rotateImage("#000", 180); + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_LEFTTOP: // 5 + $image->core()->native()->rotateImage("#000", -270); + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_RIGHTTOP: // 6 + $image->core()->native()->rotateImage("#000", -270); + break; + + case Imagick::ORIENTATION_RIGHTBOTTOM: // 7 + $image->core()->native()->rotateImage("#000", -90); + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_LEFTBOTTOM: // 8 + $image->core()->native()->rotateImage("#000", -90); + break; + } + + // set new orientation in image + $image->core()->native()->setImageOrientation(Imagick::ORIENTATION_TOPLEFT); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php new file mode 100644 index 0000000..8fdc0b3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php @@ -0,0 +1,32 @@ +blendingColor($this->driver()); + + // get imagickpixel from blending color + $pixel = $this->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative($blendingColor); + + // merge transparent areas with the background color + foreach ($image as $frame) { + $frame->native()->setImageBackgroundColor($pixel); + $frame->native()->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); + $frame->native()->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php new file mode 100644 index 0000000..94c52d1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php @@ -0,0 +1,21 @@ +native()->blurImage($this->amount, 0.5 * $this->amount); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php new file mode 100644 index 0000000..80fd9df --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php @@ -0,0 +1,21 @@ +native()->modulateImage(100 + $this->level, 100, 100); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php new file mode 100644 index 0000000..c4abc30 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php @@ -0,0 +1,34 @@ +normalizeLevel($this->red); + $green = $this->normalizeLevel($this->green); + $blue = $this->normalizeLevel($this->blue); + + foreach ($image as $frame) { + $qrange = $frame->native()->getQuantumRange(); + $frame->native()->levelImage(0, $red, $qrange['quantumRangeLong'], Imagick::CHANNEL_RED); + $frame->native()->levelImage(0, $green, $qrange['quantumRangeLong'], Imagick::CHANNEL_GREEN); + $frame->native()->levelImage(0, $blue, $qrange['quantumRangeLong'], Imagick::CHANNEL_BLUE); + } + + return $image; + } + + private function normalizeLevel(int $level): int + { + return $level > 0 ? intval(round($level / 5)) : intval(round(($level + 100) / 100)); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php new file mode 100644 index 0000000..37e1020 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php @@ -0,0 +1,51 @@ + + */ + protected static array $mapping = [ + RgbColorspace::class => Imagick::COLORSPACE_SRGB, + CmykColorspace::class => Imagick::COLORSPACE_CMYK, + ]; + + public function apply(ImageInterface $image): ImageInterface + { + $colorspace = $this->targetColorspace(); + + $imagick = $image->core()->native(); + $imagick->transformImageColorspace( + $this->getImagickColorspace($colorspace) + ); + + return $image; + } + + /** + * @throws NotSupportedException + */ + private function getImagickColorspace(ColorspaceInterface $colorspace): int + { + if (!array_key_exists($colorspace::class, self::$mapping)) { + throw new NotSupportedException('Given colorspace is not supported.'); + } + + return self::$mapping[$colorspace::class]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php new file mode 100644 index 0000000..b01bfd3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php @@ -0,0 +1,95 @@ +getCropSize($image); + $resize = $this->getResizeSize($image); + $transparent = new ImagickPixel('transparent'); + $background = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + foreach ($image as $frame) { + $frame->native()->scaleImage( + $crop->width(), + $crop->height(), + ); + + $frame->native()->setBackgroundColor($transparent); + $frame->native()->setImageBackgroundColor($transparent); + + $frame->native()->extentImage( + $resize->width(), + $resize->height(), + $crop->pivot()->x() * -1, + $crop->pivot()->y() * -1 + ); + + if ($resize->width() > $crop->width()) { + // fill new emerged background + $draw = new ImagickDraw(); + $draw->setFillColor($background); + + $delta = abs($crop->pivot()->x()); + + if ($delta > 0) { + $draw->rectangle( + 0, + 0, + $delta - 1, + $resize->height() + ); + } + + $draw->rectangle( + $crop->width() + $delta, + 0, + $resize->width(), + $resize->height() + ); + + $frame->native()->drawImage($draw); + } + + if ($resize->height() > $crop->height()) { + // fill new emerged background + $draw = new ImagickDraw(); + $draw->setFillColor($background); + + $delta = abs($crop->pivot()->y()); + + if ($delta > 0) { + $draw->rectangle( + 0, + 0, + $resize->width(), + $delta - 1 + ); + } + + $draw->rectangle( + 0, + $crop->height() + $delta, + $resize->width(), + $resize->height() + ); + + $frame->native()->drawImage($draw); + } + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php new file mode 100644 index 0000000..72083fa --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php @@ -0,0 +1,21 @@ +native()->sigmoidalContrastImage($this->level > 0, abs($this->level / 4), 0); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php new file mode 100644 index 0000000..44ab79e --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php @@ -0,0 +1,19 @@ +resizeDown($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php new file mode 100644 index 0000000..835c4de --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php @@ -0,0 +1,36 @@ +getCropSize($image); + $resize = $this->getResizeSize($crop); + + foreach ($image as $frame) { + $frame->native()->cropImage( + $crop->width(), + $crop->height(), + $crop->pivot()->x(), + $crop->pivot()->y() + ); + + $frame->native()->scaleImage( + $resize->width(), + $resize->height() + ); + + $frame->native()->setImagePage(0, 0, 0, 0); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php new file mode 100644 index 0000000..6a2e8d3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php @@ -0,0 +1,75 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + // create empty container imagick to rebuild core + $imagick = new Imagick(); + + // save resolution to add it later + $resolution = $image->resolution()->perInch(); + + // define position of the image on the new canvas + $crop = $this->crop($image); + $position = [ + ($crop->pivot()->x() + $this->offset_x) * -1, + ($crop->pivot()->y() + $this->offset_y) * -1, + ]; + + foreach ($image as $frame) { + // create new frame canvas with modifiers background + $canvas = new Imagick(); + $canvas->newImage($crop->width(), $crop->height(), $background, 'png'); + $canvas->setImageResolution($resolution->x(), $resolution->y()); + $canvas->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); // or ALPHACHANNEL_ACTIVATE? + + // set animation details + if ($image->isAnimated()) { + $canvas->setImageDelay($frame->native()->getImageDelay()); + $canvas->setImageIterations($frame->native()->getImageIterations()); + $canvas->setImageDispose($frame->native()->getImageDispose()); + } + + // make the rectangular position of the original image transparent + // so that we can later place the original on top. this preserves + // the transparency of the original and shows the background color + // of the modifier in the other areas. if the original image has no + // transparent area the rectangular transparency will be covered by + // the original. + $clearer = new Imagick(); + $clearer->newImage( + $frame->native()->getImageWidth(), + $frame->native()->getImageHeight(), + new ImagickPixel('black'), + ); + $canvas->compositeImage($clearer, Imagick::COMPOSITE_DSTOUT, ...$position); + + // place original frame content onto prepared frame canvas + $canvas->compositeImage($frame->native(), Imagick::COMPOSITE_DEFAULT, ...$position); + + // add newly built frame to container imagick + $imagick->addImage($canvas); + } + + // replace imagick in the original image + $image->core()->setNative($imagick); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php new file mode 100644 index 0000000..fda3ec4 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php @@ -0,0 +1,77 @@ +drawable->count() !== 3 && $this->drawable->count() !== 4) { + throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve'); + } + + $drawing = new ImagickDraw(); + + if ($this->drawable->hasBackgroundColor()) { + $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + } else { + $background_color = 'transparent'; + } + + $drawing->setFillColor($background_color); + + if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 0) { + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + $drawing->setStrokeColor($border_color); + $drawing->setStrokeWidth($this->drawable->borderSize()); + } + + $drawing->pathStart(); + $drawing->pathMoveToAbsolute( + $this->drawable->first()->x(), + $this->drawable->first()->y() + ); + if ($this->drawable->count() === 3) { + $drawing->pathCurveToQuadraticBezierAbsolute( + $this->drawable->second()->x(), + $this->drawable->second()->y(), + $this->drawable->last()->x(), + $this->drawable->last()->y() + ); + } elseif ($this->drawable->count() === 4) { + $drawing->pathCurveToAbsolute( + $this->drawable->second()->x(), + $this->drawable->second()->y(), + $this->drawable->third()->x(), + $this->drawable->third()->y(), + $this->drawable->last()->x(), + $this->drawable->last()->y() + ); + } + $drawing->pathFinish(); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php new file mode 100644 index 0000000..1508f91 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php @@ -0,0 +1,51 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + foreach ($image as $frame) { + $drawing = new ImagickDraw(); + $drawing->setFillColor($background_color); + + if ($this->drawable->hasBorder()) { + $drawing->setStrokeWidth($this->drawable->borderSize()); + $drawing->setStrokeColor($border_color); + } + + $drawing->ellipse( + $this->drawable->position()->x(), + $this->drawable->position()->y(), + $this->drawable->width() / 2, + $this->drawable->height() / 2, + 0, + 360 + ); + + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php new file mode 100644 index 0000000..ac09e51 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php @@ -0,0 +1,42 @@ +setStrokeWidth($this->drawable->width()); + $drawing->setFillOpacity(0); + $drawing->setStrokeColor( + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + + $drawing->line( + $this->drawable->start()->x(), + $this->drawable->start()->y(), + $this->drawable->end()->x(), + $this->drawable->end()->y(), + ); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php new file mode 100644 index 0000000..e69ecc2 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php @@ -0,0 +1,30 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + + $pixel = new ImagickDraw(); + $pixel->setFillColor($color); + $pixel->point($this->position->x(), $this->position->y()); + + foreach ($image as $frame) { + $frame->native()->drawImage($pixel); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php new file mode 100644 index 0000000..003d88c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php @@ -0,0 +1,64 @@ +setFillColor(new ImagickPixel('transparent')); // defaults to no backgroundColor + + if ($this->drawable->hasBackgroundColor()) { + $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + $drawing->setFillColor($background_color); + } + + if ($this->drawable->hasBorder()) { + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + $drawing->setStrokeColor($border_color); + $drawing->setStrokeWidth($this->drawable->borderSize()); + } + + $drawing->polygon($this->points()); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } + + /** + * Return points of drawable in processable form for ImagickDraw + * + * @return array> + */ + private function points(): array + { + $points = []; + foreach ($this->drawable as $point) { + $points[] = ['x' => $point->x(), 'y' => $point->y()]; + } + + return $points; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php new file mode 100644 index 0000000..8f8e79e --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php @@ -0,0 +1,50 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + $drawing->setFillColor($background_color); + if ($this->drawable->hasBorder()) { + $drawing->setStrokeColor($border_color); + $drawing->setStrokeWidth($this->drawable->borderSize()); + } + + // build rectangle + $drawing->rectangle( + $this->drawable->position()->x(), + $this->drawable->position()->y(), + $this->drawable->position()->x() + $this->drawable->width(), + $this->drawable->position()->y() + $this->drawable->height() + ); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php new file mode 100644 index 0000000..274745f --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php @@ -0,0 +1,63 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + + foreach ($image->core()->native() as $frame) { + if ($this->hasPosition()) { + $this->floodFillWithColor($frame, $pixel); + } else { + $this->fillAllWithColor($frame, $pixel); + } + } + + return $image; + } + + private function floodFillWithColor(Imagick $frame, ImagickPixel $pixel): void + { + $target = $frame->getImagePixelColor( + $this->position->x(), + $this->position->y() + ); + + $frame->floodfillPaintImage( + $pixel, + 100, + $target, + $this->position->x(), + $this->position->y(), + false, + Imagick::CHANNEL_ALL + ); + } + + private function fillAllWithColor(Imagick $frame, ImagickPixel $pixel): void + { + $draw = new ImagickDraw(); + $draw->setFillColor($pixel); + $draw->rectangle(0, 0, $frame->getImageWidth(), $frame->getImageHeight()); + $frame->drawImage($draw); + + // deactive alpha channel when image was filled with opaque color + if ($pixel->getColorValue(Imagick::COLOR_ALPHA) == 1) { + $frame->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE); + } + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php new file mode 100644 index 0000000..edfa124 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php @@ -0,0 +1,21 @@ +native()->flipImage(); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php new file mode 100644 index 0000000..d05c239 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php @@ -0,0 +1,21 @@ +native()->flopImage(); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php new file mode 100644 index 0000000..f8b1c7c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php @@ -0,0 +1,21 @@ +native()->gammaImage($this->gamma); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php new file mode 100644 index 0000000..4bc2f28 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php @@ -0,0 +1,21 @@ +native()->modulateImage(100, 0, 100); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php new file mode 100644 index 0000000..d504ecb --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php @@ -0,0 +1,21 @@ +native()->negateImage(false); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php new file mode 100644 index 0000000..40499d9 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php @@ -0,0 +1,24 @@ +size() + ->containMax( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php new file mode 100644 index 0000000..e79eb42 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php @@ -0,0 +1,34 @@ +pixelateFrame($frame); + } + + return $image; + } + + protected function pixelateFrame(FrameInterface $frame): void + { + $size = $frame->size(); + + $frame->native()->scaleImage( + (int) round(max(1, $size->width() / $this->size)), + (int) round(max(1, $size->height() / $this->size)) + ); + + $frame->native()->scaleImage($size->width(), $size->height()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php new file mode 100644 index 0000000..eb5b722 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php @@ -0,0 +1,40 @@ +driver()->handleInput($this->element); + $position = $this->getPosition($image, $watermark); + + // set opacity of watermark + if ($this->opacity < 100) { + $watermark->core()->native()->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); + $watermark->core()->native()->evaluateImage( + Imagick::EVALUATE_DIVIDE, + $this->opacity > 0 ? 100 / $this->opacity : 1000, + Imagick::CHANNEL_ALPHA, + ); + } + + foreach ($image as $frame) { + $frame->native()->compositeImage( + $watermark->core()->native(), + Imagick::COMPOSITE_DEFAULT, + $position->x(), + $position->y() + ); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php new file mode 100644 index 0000000..22212d9 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php @@ -0,0 +1,25 @@ +core()->native(); + $result = $imagick->profileImage('icc', (string) $this->profile); + + if ($result === false) { + throw new ColorException('ICC color profile could not be set.'); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php new file mode 100644 index 0000000..ef4a2ab --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php @@ -0,0 +1,25 @@ +core()->native(); + $result = $imagick->profileImage('icc', null); + + if ($result === false) { + throw new ColorException('ICC color profile could not be removed.'); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php new file mode 100644 index 0000000..6a93482 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php @@ -0,0 +1,37 @@ +limit <= 0) { + throw new InputException('Quantization limit must be greater than 0.'); + } + + // no color reduction if the limit is higher than the colors in the img + if ($this->limit > $image->core()->native()->getImageColors()) { + return $image; + } + + foreach ($image as $frame) { + $frame->native()->quantizeImage( + $this->limit, + $frame->native()->getImageColorspace(), + 0, + false, + false + ); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php new file mode 100644 index 0000000..61c884c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php @@ -0,0 +1,26 @@ +selectedFrame($image); + $imagick->addImage($frame->native()->getImage()); + + // set new imagick to image + $image->core()->setNative($imagick); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php new file mode 100644 index 0000000..4459f32 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php @@ -0,0 +1,27 @@ +cropSize($image); + + $image->modify(new CropModifier( + $cropSize->width(), + $cropSize->height(), + $cropSize->pivot()->x(), + $cropSize->pivot()->y(), + $this->background, + )); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php new file mode 100644 index 0000000..e1fcb74 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php @@ -0,0 +1,16 @@ +size()->resizeDown($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php new file mode 100644 index 0000000..459aad0 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php @@ -0,0 +1,36 @@ +getAdjustedSize($image); + + foreach ($image as $frame) { + $frame->native()->scaleImage( + $resizeTo->width(), + $resizeTo->height() + ); + } + + return $image; + } + + /** + * @throws RuntimeException + */ + protected function getAdjustedSize(ImageInterface $image): SizeInterface + { + return $image->size()->resize($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php new file mode 100644 index 0000000..426e683 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php @@ -0,0 +1,20 @@ +core()->native(); + $imagick->setImageResolution($this->x, $this->y); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php new file mode 100644 index 0000000..19ad228 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php @@ -0,0 +1,28 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + foreach ($image as $frame) { + $frame->native()->rotateImage( + $background, + $this->rotationAngle() * -1 + ); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php new file mode 100644 index 0000000..ae874bb --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php @@ -0,0 +1,16 @@ +size()->scaleDown($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php new file mode 100644 index 0000000..da8c2c4 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php @@ -0,0 +1,16 @@ +size()->scale($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php new file mode 100644 index 0000000..120d3c8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php @@ -0,0 +1,21 @@ +native()->unsharpMaskImage(1, 1, $this->amount / 6.25, 0); + } + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php new file mode 100644 index 0000000..1669107 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php @@ -0,0 +1,24 @@ +offset >= $image->count()) { + throw new AnimationException('Offset is not in the range of frames.'); + } + + $image->core()->slice($this->offset, $this->length); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php new file mode 100644 index 0000000..58d1e7a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php @@ -0,0 +1,34 @@ +core()->native()->getImageProfiles('icc'); + + // remove meta data + $image->core()->native()->stripImage(); + $image->setExif(new Collection()); + + if ($profiles !== []) { + // re-apply icc profiles + $image->core()->native()->profileImage("icc", $profiles['icc']); + } + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php new file mode 100644 index 0000000..69ff34c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php @@ -0,0 +1,139 @@ +processor()->textBlock($this->text, $this->font, $this->position); + $drawText = $this->imagickDrawText($image, $this->font); + $drawStroke = $this->imagickDrawStroke($image, $this->font); + + foreach ($image as $frame) { + foreach ($lines as $line) { + foreach ($this->strokeOffsets($this->font) as $offset) { + // Draw the stroke outline under the actual text + $this->maybeDrawTextline($frame, $line, $drawStroke, $offset); + } + + // Draw the actual text + $this->maybeDrawTextline($frame, $line, $drawText); + } + } + + return $image; + } + + /** + * Create an ImagickDraw object to draw text on the image + * + * @throws RuntimeException + * @throws ColorException + * @throws FontException + * @throws ImagickDrawException + * @throws ImagickException + */ + private function imagickDrawText(ImageInterface $image, FontInterface $font): ImagickDraw + { + $color = $this->driver()->handleInput($font->color()); + + if ($font->hasStrokeEffect() && $color->isTransparent()) { + throw new ColorException( + 'The text color must be fully opaque when using the stroke effect.' + ); + } + + $color = $this->driver()->colorProcessor($image->colorspace())->colorToNative($color); + + return $this->processor()->toImagickDraw($font, $color); + } + + /** + * Create a ImagickDraw object to draw the outline stroke effect on the Image + * + * @throws RuntimeException + * @throws ColorException + * @throws FontException + * @throws ImagickDrawException + * @throws ImagickException + */ + private function imagickDrawStroke(ImageInterface $image, FontInterface $font): ?ImagickDraw + { + if (!$font->hasStrokeEffect()) { + return null; + } + + $color = $this->driver()->handleInput($font->strokeColor()); + + if ($color->isTransparent()) { + throw new ColorException( + 'The stroke color must be fully opaque.' + ); + } + + $color = $this->driver()->colorProcessor($image->colorspace())->colorToNative($color); + + return $this->processor()->toImagickDraw($font, $color); + } + + /** + * Maybe draw given line of text on frame instance depending on given + * ImageDraw instance. Optionally move line position by given offset. + */ + private function maybeDrawTextline( + FrameInterface $frame, + Line $textline, + ?ImagickDraw $draw = null, + PointInterface $offset = new Point(), + ): void { + if ($draw instanceof ImagickDraw) { + $frame->native()->annotateImage( + $draw, + $textline->position()->x() + $offset->x(), + $textline->position()->y() + $offset->y(), + $this->font->angle(), + (string) $textline + ); + } + } + + /** + * Return imagick font processor + * + * @throws FontException + */ + private function processor(): FontProcessor + { + $processor = $this->driver()->fontProcessor(); + + if (!($processor instanceof FontProcessor)) { + throw new FontException('Font processor does not match the driver.'); + } + + return $processor; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php new file mode 100644 index 0000000..88bc46a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php @@ -0,0 +1,26 @@ +isAnimated()) { + throw new NotSupportedException('Trim modifier cannot be applied to animated images.'); + } + + $imagick = $image->core()->native(); + $imagick->trimImage(($this->tolerance / 100 * $imagick->getQuantum()) / 1.5); + $imagick->setImagePage(0, 0, 0, 0); + + return $image; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/Specializable.php b/upLoadImage/vendor/intervention/image/src/Drivers/Specializable.php new file mode 100644 index 0000000..30a1c3f --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/Specializable.php @@ -0,0 +1,13 @@ +analyze($this); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Drivers/SpecializableDecoder.php b/upLoadImage/vendor/intervention/image/src/Drivers/SpecializableDecoder.php new file mode 100644 index 0000000..9b0bf8b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Drivers/SpecializableDecoder.php @@ -0,0 +1,26 @@ +modify($this); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/EncodedImage.php b/upLoadImage/vendor/intervention/image/src/EncodedImage.php new file mode 100644 index 0000000..e8c767a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/EncodedImage.php @@ -0,0 +1,65 @@ +mediaType; + } + + /** + * {@inheritdoc} + * + * @see EncodedImageInterface::mimetype() + */ + public function mimetype(): string + { + return $this->mediaType(); + } + + /** + * {@inheritdoc} + * + * @see EncodedImageInterface::toDataUri() + */ + public function toDataUri(): string + { + return sprintf('data:%s;base64,%s', $this->mediaType(), base64_encode((string) $this)); + } + + /** + * Show debug info for the current image + * + * @return array + */ + public function __debugInfo(): array + { + return [ + 'mediaType' => $this->mediaType(), + 'size' => $this->size(), + ]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Encoders/AutoEncoder.php b/upLoadImage/vendor/intervention/image/src/Encoders/AutoEncoder.php new file mode 100644 index 0000000..0c909d1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Encoders/AutoEncoder.php @@ -0,0 +1,25 @@ +encode( + $this->encoderByMediaType( + $image->origin()->mediaType() + ) + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Encoders/AvifEncoder.php b/upLoadImage/vendor/intervention/image/src/Encoders/AvifEncoder.php new file mode 100644 index 0000000..2cf708d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Encoders/AvifEncoder.php @@ -0,0 +1,23 @@ + + */ + protected array $options = []; + + /** + * Create new encoder instance to encode to format of given file extension + * + * @param null|string|FileExtension $extension Target file extension for example "png" + * @return void + */ + public function __construct(public null|string|FileExtension $extension = null, mixed ...$options) + { + $this->options = $options; + } + + /** + * {@inheritdoc} + * + * @see EncoderInterface::encode() + */ + public function encode(ImageInterface $image): EncodedImageInterface + { + $extension = is_null($this->extension) ? $image->origin()->fileExtension() : $this->extension; + + return $image->encode( + $this->encoderByFileExtension( + $extension + ) + ); + } + + /** + * Create matching encoder for given file extension + * + * @throws EncoderException + */ + protected function encoderByFileExtension(null|string|FileExtension $extension): EncoderInterface + { + if (empty($extension)) { + throw new EncoderException('No encoder found for empty file extension.'); + } + + try { + $extension = is_string($extension) ? FileExtension::from(strtolower($extension)) : $extension; + } catch (Error) { + throw new EncoderException('No encoder found for file extension (' . $extension . ').'); + } + + return $extension->format()->encoder(...$this->options); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Encoders/FilePathEncoder.php b/upLoadImage/vendor/intervention/image/src/Encoders/FilePathEncoder.php new file mode 100644 index 0000000..62c496d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Encoders/FilePathEncoder.php @@ -0,0 +1,38 @@ +encode( + $this->encoderByFileExtension( + is_null($this->path) ? $image->origin()->fileExtension() : pathinfo($this->path, PATHINFO_EXTENSION) + ) + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Encoders/GifEncoder.php b/upLoadImage/vendor/intervention/image/src/Encoders/GifEncoder.php new file mode 100644 index 0000000..0ee950a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Encoders/GifEncoder.php @@ -0,0 +1,20 @@ + + */ + protected array $options = []; + + /** + * Create new encoder instance + * + * @param null|string|MediaType $mediaType Target media type for example "image/jpeg" + * @return void + */ + public function __construct(public null|string|MediaType $mediaType = null, mixed ...$options) + { + $this->options = $options; + } + + /** + * {@inheritdoc} + * + * @see EncoderInterface::encode() + */ + public function encode(ImageInterface $image): EncodedImageInterface + { + $mediaType = is_null($this->mediaType) ? $image->origin()->mediaType() : $this->mediaType; + + return $image->encode( + $this->encoderByMediaType($mediaType) + ); + } + + /** + * Return new encoder by given media (MIME) type + * + * @throws EncoderException + */ + protected function encoderByMediaType(string|MediaType $mediaType): EncoderInterface + { + try { + $mediaType = is_string($mediaType) ? MediaType::from($mediaType) : $mediaType; + } catch (Error) { + throw new EncoderException('No encoder found for media type (' . $mediaType . ').'); + } + + return $mediaType->format()->encoder(...$this->options); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Encoders/PngEncoder.php b/upLoadImage/vendor/intervention/image/src/Encoders/PngEncoder.php new file mode 100644 index 0000000..f542073 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Encoders/PngEncoder.php @@ -0,0 +1,20 @@ +pointer = $this->buildFilePointer($data); + } + + /** + * Create file object from path in file system + * + * @throws RuntimeException + */ + public static function fromPath(string $path): self + { + return new self(fopen($path, 'r')); + } + + /** + * {@inheritdoc} + * + * @see FileInterface::save() + */ + public function save(string $filepath): void + { + $dir = pathinfo($filepath, PATHINFO_DIRNAME); + + if (!is_dir($dir)) { + throw new NotWritableException( + "Can't write image to path. Directory does not exist." + ); + } + + if (!is_writable($dir)) { + throw new NotWritableException( + "Can't write image to path. Directory is not writable." + ); + } + + if (is_file($filepath) && !is_writable($filepath)) { + throw new NotWritableException( + sprintf("Can't write image. Path (%s) is not writable.", $filepath) + ); + } + + // write data + $saved = @file_put_contents($filepath, $this->toFilePointer()); + if ($saved === false) { + throw new NotWritableException( + sprintf("Can't write image data to path (%s).", $filepath) + ); + } + } + + /** + * {@inheritdoc} + * + * @see FileInterface::toString() + */ + public function toString(): string + { + return stream_get_contents($this->toFilePointer(), offset: 0); + } + + /** + * {@inheritdoc} + * + * @see FileInterface::toFilePointer() + */ + public function toFilePointer() + { + rewind($this->pointer); + + return $this->pointer; + } + + /** + * {@inheritdoc} + * + * @see FileInterface::size() + */ + public function size(): int + { + $info = fstat($this->toFilePointer()); + + return intval($info['size']); + } + + /** + * {@inheritdoc} + * + * @see FileInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/FileExtension.php b/upLoadImage/vendor/intervention/image/src/FileExtension.php new file mode 100644 index 0000000..dce24c5 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/FileExtension.php @@ -0,0 +1,127 @@ +fileExtension(); + } + + if ($identifier instanceof MediaType) { + return $identifier->fileExtension(); + } + + try { + $extension = self::from(strtolower($identifier)); + } catch (Error) { + try { + $extension = MediaType::from(strtolower($identifier))->fileExtension(); + } catch (Error) { + throw new NotSupportedException('Unable to create file extension from "' . $identifier . '".'); + } + } + + return $extension; + } + + /** + * Try to create media type from given identifier and return null on failure + * + * @param string|Format|MediaType|FileExtension $identifier + * @return FileExtension|null + */ + public static function tryCreate(string|self|Format|MediaType $identifier): ?self + { + try { + return self::create($identifier); + } catch (NotSupportedException) { + return null; + } + } + + /** + * Return the matching format for the current file extension + */ + public function format(): Format + { + return match ($this) { + self::JPEG, + self::JPG => Format::JPEG, + self::WEBP => Format::WEBP, + self::GIF => Format::GIF, + self::PNG => Format::PNG, + self::AVIF => Format::AVIF, + self::BMP => Format::BMP, + self::TIF, + self::TIFF => Format::TIFF, + self::JP2, + self::JP2K, + self::J2K, + self::JPF, + self::JPM, + self::JPG2, + self::J2C, + self::JPC, + self::JPX => Format::JP2, + self::HEIC, + self::HEIF => Format::HEIC, + }; + } + + /** + * Return media types for the current format + * + * @return array + */ + public function mediaTypes(): array + { + return $this->format()->mediaTypes(); + } + + /** + * Return the first found media type for the current format + */ + public function mediaType(): MediaType + { + return $this->format()->mediaType(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Format.php b/upLoadImage/vendor/intervention/image/src/Format.php new file mode 100644 index 0000000..09be895 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Format.php @@ -0,0 +1,165 @@ +format(); + } + + if ($identifier instanceof FileExtension) { + return $identifier->format(); + } + + try { + $format = MediaType::from(strtolower($identifier))->format(); + } catch (Error) { + try { + $format = FileExtension::from(strtolower($identifier))->format(); + } catch (Error) { + throw new NotSupportedException('Unable to create format from "' . $identifier . '".'); + } + } + + return $format; + } + + /** + * Try to create format from given identifier and return null on failure + * + * @param string|Format|MediaType|FileExtension $identifier + * @return Format|null + */ + public static function tryCreate(string|self|MediaType|FileExtension $identifier): ?self + { + try { + return self::create($identifier); + } catch (NotSupportedException) { + return null; + } + } + + /** + * Return the possible media (MIME) types for the current format + * + * @return array + */ + public function mediaTypes(): array + { + return array_filter( + MediaType::cases(), + fn(MediaType $mediaType): bool => $mediaType->format() === $this + ); + } + + /** + * Return the first found media type for the current format + */ + public function mediaType(): MediaType + { + $types = $this->mediaTypes(); + + return reset($types); + } + + /** + * Return the possible file extension for the current format + * + * @return array + */ + public function fileExtensions(): array + { + return array_filter( + FileExtension::cases(), + fn(FileExtension $fileExtension): bool => $fileExtension->format() === $this + ); + } + + /** + * Return the first found file extension for the current format + */ + public function fileExtension(): FileExtension + { + $extensions = $this->fileExtensions(); + + return reset($extensions); + } + + /** + * Create an encoder instance with given options that matches the format + */ + public function encoder(mixed ...$options): EncoderInterface + { + // get classname of target encoder from current format + $classname = match ($this) { + self::AVIF => AvifEncoder::class, + self::BMP => BmpEncoder::class, + self::GIF => GifEncoder::class, + self::HEIC => HeicEncoder::class, + self::JP2 => Jpeg2000Encoder::class, + self::JPEG => JpegEncoder::class, + self::PNG => PngEncoder::class, + self::TIFF => TiffEncoder::class, + self::WEBP => WebpEncoder::class, + }; + + // get parameters of target encoder + $parameters = []; + $reflectionClass = new ReflectionClass($classname); + if ($constructor = $reflectionClass->getConstructor()) { + $parameters = array_map( + fn(ReflectionParameter $parameter): string => $parameter->getName(), + $constructor->getParameters(), + ); + } + + // filter out unavailable options of target encoder + $options = array_filter( + $options, + fn(mixed $key): bool => in_array($key, $parameters), + ARRAY_FILTER_USE_KEY, + ); + + return new $classname(...$options); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Bezier.php b/upLoadImage/vendor/intervention/image/src/Geometry/Bezier.php new file mode 100644 index 0000000..27dbba1 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Bezier.php @@ -0,0 +1,202 @@ + + * @implements ArrayAccess + */ +class Bezier implements IteratorAggregate, Countable, ArrayAccess, DrawableInterface +{ + use HasBorder; + use HasBackgroundColor; + + /** + * Create new bezier instance + * + * @param array $points + * @return void + */ + public function __construct( + protected array $points = [], + protected PointInterface $pivot = new Point() + ) { + // + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::position() + */ + public function position(): PointInterface + { + return $this->pivot; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): DrawableInterface + { + $this->pivot = $position; + + return $this; + } + + /** + * Implement iteration through all points of bezier + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->points); + } + + /** + * Return current pivot point + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Change pivot point to given point + */ + public function setPivot(PointInterface $pivot): self + { + $this->pivot = $pivot; + + return $this; + } + + /** + * Return first control point of bezier + */ + public function first(): ?PointInterface + { + if ($point = reset($this->points)) { + return $point; + } + + return null; + } + + /** + * Return second control point of bezier + */ + public function second(): ?PointInterface + { + if (array_key_exists(1, $this->points)) { + return $this->points[1]; + } + + return null; + } + + /** + * Return third control point of bezier + */ + public function third(): ?PointInterface + { + if (array_key_exists(2, $this->points)) { + return $this->points[2]; + } + + return null; + } + + /** + * Return last control point of bezier + */ + public function last(): ?PointInterface + { + if ($point = end($this->points)) { + return $point; + } + + return null; + } + + /** + * Return bezier's point count + */ + public function count(): int + { + return count($this->points); + } + + /** + * Determine if point exists at given offset + */ + public function offsetExists(mixed $offset): bool + { + return array_key_exists($offset, $this->points); + } + + /** + * Return point at given offset + */ + public function offsetGet(mixed $offset): mixed + { + return $this->points[$offset]; + } + + /** + * Set point at given offset + */ + public function offsetSet(mixed $offset, mixed $value): void + { + $this->points[$offset] = $value; + } + + /** + * Unset offset at given offset + */ + public function offsetUnset(mixed $offset): void + { + unset($this->points[$offset]); + } + + /** + * Add given point to bezier + */ + public function addPoint(PointInterface $point): self + { + $this->points[] = $point; + + return $this; + } + + /** + * Return array of all x/y values of all points of bezier + * + * @return array + */ + public function toArray(): array + { + $coordinates = []; + foreach ($this->points as $point) { + $coordinates[] = $point->x(); + $coordinates[] = $point->y(); + } + + return $coordinates; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Circle.php b/upLoadImage/vendor/intervention/image/src/Geometry/Circle.php new file mode 100644 index 0000000..dc2e28b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Circle.php @@ -0,0 +1,57 @@ +setWidth($diameter); + $this->setHeight($diameter); + + return $this; + } + + /** + * Get diameter of circle + */ + public function diameter(): int + { + return $this->width(); + } + + /** + * Set radius of circle + */ + public function setRadius(int $radius): self + { + return $this->setDiameter(intval($radius * 2)); + } + + /** + * Get radius of circle + */ + public function radius(): int + { + return intval(round($this->diameter() / 2)); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Ellipse.php b/upLoadImage/vendor/intervention/image/src/Geometry/Ellipse.php new file mode 100644 index 0000000..e27c9d8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Ellipse.php @@ -0,0 +1,103 @@ +pivot; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): self + { + $this->pivot = $position; + + return $this; + } + + /** + * Return pivot point of Ellipse + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Set size of Ellipse + */ + public function setSize(int $width, int $height): self + { + return $this->setWidth($width)->setHeight($height); + } + + /** + * Set width of Ellipse + */ + public function setWidth(int $width): self + { + $this->width = $width; + + return $this; + } + + /** + * Set height of Ellipse + */ + public function setHeight(int $height): self + { + $this->height = $height; + + return $this; + } + + /** + * Get width of Ellipse + */ + public function width(): int + { + return $this->width; + } + + /** + * Get height of Ellipse + */ + public function height(): int + { + return $this->height; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php new file mode 100644 index 0000000..2d8410b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php @@ -0,0 +1,88 @@ +bezier = is_a($init, Bezier::class) ? $init : new Bezier([]); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self($init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->bezier; + } + + /** + * Add a point to the bezier to be produced + */ + public function point(int $x, int $y): self + { + $this->bezier->addPoint(new Point($x, $y)); + + return $this; + } + + /** + * Set the background color of the bezier to be produced + */ + public function background(mixed $color): self + { + $this->bezier->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the bezier to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->bezier->setBorder($color, $size); + + return $this; + } + + /** + * Produce the bezier + */ + public function __invoke(): Bezier + { + return $this->bezier; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php new file mode 100644 index 0000000..f45b581 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php @@ -0,0 +1,102 @@ +circle = is_a($init, Circle::class) ? $init : new Circle(0); + $this->circle->setPosition($pivot); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self(init: $init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->circle; + } + + /** + * Set the radius of the circle to be produced + */ + public function radius(int $radius): self + { + $this->circle->setSize($radius * 2, $radius * 2); + + return $this; + } + + /** + * Set the diameter of the circle to be produced + */ + public function diameter(int $diameter): self + { + $this->circle->setSize($diameter, $diameter); + + return $this; + } + + /** + * Set the background color of the circle to be produced + */ + public function background(mixed $color): self + { + $this->circle->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the ellipse to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->circle->setBorder($color, $size); + + return $this; + } + + /** + * Produce the circle + */ + public function __invoke(): Circle + { + return $this->circle; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Factories/Drawable.php b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/Drawable.php new file mode 100644 index 0000000..e7f14ba --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/Drawable.php @@ -0,0 +1,56 @@ +ellipse = is_a($init, Ellipse::class) ? $init : new Ellipse(0, 0); + $this->ellipse->setPosition($pivot); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self(init: $init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->ellipse; + } + + /** + * Set the size of the ellipse to be produced + */ + public function size(int $width, int $height): self + { + $this->ellipse->setSize($width, $height); + + return $this; + } + + /** + * Set the width of the ellipse to be produced + */ + public function width(int $width): self + { + $this->ellipse->setWidth($width); + + return $this; + } + + /** + * Set the height of the ellipse to be produced + */ + public function height(int $height): self + { + $this->ellipse->setHeight($height); + + return $this; + } + + /** + * Set the background color of the ellipse to be produced + */ + public function background(mixed $color): self + { + $this->ellipse->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the ellipse to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->ellipse->setBorder($color, $size); + + return $this; + } + + /** + * Produce the ellipse + */ + public function __invoke(): Ellipse + { + return $this->ellipse; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Factories/LineFactory.php b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/LineFactory.php new file mode 100644 index 0000000..ce65433 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/LineFactory.php @@ -0,0 +1,122 @@ +line = is_a($init, Line::class) ? $init : new Line(new Point(), new Point()); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self($init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->line; + } + + /** + * Set the color of the line to be produced + */ + public function color(mixed $color): self + { + $this->line->setBackgroundColor($color); + $this->line->setBorderColor($color); + + return $this; + } + + /** + * Set the (background) color of the line to be produced + */ + public function background(mixed $color): self + { + $this->line->setBackgroundColor($color); + $this->line->setBorderColor($color); + + return $this; + } + + /** + * Set the border size & border color of the line to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->line->setBackgroundColor($color); + $this->line->setBorderColor($color); + $this->line->setWidth($size); + + return $this; + } + + /** + * Set the width of the line to be produced + */ + public function width(int $size): self + { + $this->line->setWidth($size); + + return $this; + } + + /** + * Set the coordinates of the starting point of the line to be produced + */ + public function from(int $x, int $y): self + { + $this->line->setStart(new Point($x, $y)); + + return $this; + } + + /** + * Set the coordinates of the end point of the line to be produced + */ + public function to(int $x, int $y): self + { + $this->line->setEnd(new Point($x, $y)); + + return $this; + } + + /** + * Produce the line + */ + public function __invoke(): Line + { + return $this->line; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php new file mode 100644 index 0000000..d065eb8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php @@ -0,0 +1,88 @@ +polygon = is_a($init, Polygon::class) ? $init : new Polygon([]); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self($init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->polygon; + } + + /** + * Add a point to the polygon to be produced + */ + public function point(int $x, int $y): self + { + $this->polygon->addPoint(new Point($x, $y)); + + return $this; + } + + /** + * Set the background color of the polygon to be produced + */ + public function background(mixed $color): self + { + $this->polygon->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the polygon to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->polygon->setBorder($color, $size); + + return $this; + } + + /** + * Produce the polygon + */ + public function __invoke(): Polygon + { + return $this->polygon; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php new file mode 100644 index 0000000..34732f2 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php @@ -0,0 +1,112 @@ +rectangle = is_a($init, Rectangle::class) ? $init : new Rectangle(0, 0, $pivot); + $this->rectangle->setPosition($pivot); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self(init: $init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->rectangle; + } + + /** + * Set the size of the rectangle to be produced + */ + public function size(int $width, int $height): self + { + $this->rectangle->setSize($width, $height); + + return $this; + } + + /** + * Set the width of the rectangle to be produced + */ + public function width(int $width): self + { + $this->rectangle->setWidth($width); + + return $this; + } + + /** + * Set the height of the rectangle to be produced + */ + public function height(int $height): self + { + $this->rectangle->setHeight($height); + + return $this; + } + + /** + * Set the background color of the rectangle to be produced + */ + public function background(mixed $color): self + { + $this->rectangle->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the rectangle to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->rectangle->setBorder($color, $size); + + return $this; + } + + /** + * Produce the rectangle + */ + public function __invoke(): Rectangle + { + return $this->rectangle; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Line.php b/upLoadImage/vendor/intervention/image/src/Geometry/Line.php new file mode 100644 index 0000000..14dd062 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Line.php @@ -0,0 +1,127 @@ +start; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): DrawableInterface + { + $this->start = $position; + + return $this; + } + + /** + * Return line width + */ + public function width(): int + { + return $this->width; + } + + /** + * Set line width + */ + public function setWidth(int $width): self + { + $this->width = $width; + + return $this; + } + + /** + * Get starting point of line + */ + public function start(): PointInterface + { + return $this->start; + } + + /** + * get end point of line + */ + public function end(): PointInterface + { + return $this->end; + } + + /** + * Set starting point of line + */ + public function setStart(PointInterface $start): self + { + $this->start = $start; + + return $this; + } + + /** + * Set starting point of line by coordinates + */ + public function from(int $x, int $y): self + { + $this->start()->setX($x); + $this->start()->setY($y); + + return $this; + } + + /** + * Set end point of line by coordinates + */ + public function to(int $x, int $y): self + { + $this->end()->setX($x); + $this->end()->setY($y); + + return $this; + } + + /** + * Set end point of line + */ + public function setEnd(PointInterface $end): self + { + $this->end = $end; + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Pixel.php b/upLoadImage/vendor/intervention/image/src/Geometry/Pixel.php new file mode 100644 index 0000000..dc5c580 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Pixel.php @@ -0,0 +1,45 @@ +background = $background; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::backgroundColor() + */ + public function backgroundColor(): ColorInterface + { + return $this->background; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Point.php b/upLoadImage/vendor/intervention/image/src/Geometry/Point.php new file mode 100644 index 0000000..f23cd56 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Point.php @@ -0,0 +1,145 @@ + + */ +class Point implements PointInterface, IteratorAggregate +{ + /** + * Create new point instance + * + * @return void + */ + public function __construct( + protected int $x = 0, + protected int $y = 0 + ) { + // + } + + /** + * {@inheritdoc} + * + * @see IteratorAggregate::getIterator() + */ + public function getIterator(): Traversable + { + return new ArrayIterator([$this->x, $this->y]); + } + + /** + * {@inheritdoc} + * + * @see PointInterface::setX() + */ + public function setX(int $x): self + { + $this->x = $x; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::x() + */ + public function x(): int + { + return $this->x; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::setY() + */ + public function setY(int $y): self + { + $this->y = $y; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::y() + */ + public function y(): int + { + return $this->y; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::moveX() + */ + public function moveX(int $value): self + { + $this->x += $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::moveY() + */ + public function moveY(int $value): self + { + $this->y += $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::move() + */ + public function move(int $x, int $y): self + { + return $this->moveX($x)->moveY($y); + } + + /** + * {@inheritdoc} + * + * @see PointInterface::setPosition() + */ + public function setPosition(int $x, int $y): self + { + $this->setX($x); + $this->setY($y); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::rotate() + */ + public function rotate(float $angle, PointInterface $pivot): self + { + $sin = round(sin(deg2rad($angle)), 6); + $cos = round(cos(deg2rad($angle)), 6); + + return $this->setPosition( + intval($cos * ($this->x() - $pivot->x()) - $sin * ($this->y() - $pivot->y()) + $pivot->x()), + intval($sin * ($this->x() - $pivot->x()) + $cos * ($this->y() - $pivot->y()) + $pivot->y()) + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Polygon.php b/upLoadImage/vendor/intervention/image/src/Geometry/Polygon.php new file mode 100644 index 0000000..c416d39 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Polygon.php @@ -0,0 +1,390 @@ + + * @implements ArrayAccess + */ +class Polygon implements IteratorAggregate, Countable, ArrayAccess, DrawableInterface +{ + use HasBorder; + use HasBackgroundColor; + + /** + * Create new polygon instance + * + * @param array $points + * @return void + */ + public function __construct( + protected array $points = [], + protected PointInterface $pivot = new Point() + ) { + // + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::position() + */ + public function position(): PointInterface + { + return $this->pivot; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): self + { + $this->pivot = $position; + + return $this; + } + + /** + * Implement iteration through all points of polygon + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->points); + } + + /** + * Return current pivot point + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Change pivot point to given point + */ + public function setPivot(PointInterface $pivot): self + { + $this->pivot = $pivot; + + return $this; + } + + /** + * Return first point of polygon + */ + public function first(): ?PointInterface + { + if ($point = reset($this->points)) { + return $point; + } + + return null; + } + + /** + * Return last point of polygon + */ + public function last(): ?PointInterface + { + if ($point = end($this->points)) { + return $point; + } + + return null; + } + + /** + * Return polygon's point count + */ + public function count(): int + { + return count($this->points); + } + + /** + * Determine if point exists at given offset + */ + public function offsetExists(mixed $offset): bool + { + return array_key_exists($offset, $this->points); + } + + /** + * Return point at given offset + */ + public function offsetGet(mixed $offset): mixed + { + return $this->points[$offset]; + } + + /** + * Set point at given offset + */ + public function offsetSet(mixed $offset, mixed $value): void + { + $this->points[$offset] = $value; + } + + /** + * Unset offset at given offset + */ + public function offsetUnset(mixed $offset): void + { + unset($this->points[$offset]); + } + + /** + * Add given point to polygon + */ + public function addPoint(PointInterface $point): self + { + $this->points[] = $point; + + return $this; + } + + /** + * Calculate total horizontal span of polygon + */ + public function width(): int + { + return abs($this->mostLeftPoint()->x() - $this->mostRightPoint()->x()); + } + + /** + * Calculate total vertical span of polygon + */ + public function height(): int + { + return abs($this->mostBottomPoint()->y() - $this->mostTopPoint()->y()); + } + + /** + * Return most left point of all points in polygon + */ + public function mostLeftPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->x() === $b->x()) { + return 0; + } + return $a->x() < $b->x() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return most right point in polygon + */ + public function mostRightPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->x() === $b->x()) { + return 0; + } + return $a->x() > $b->x() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return most top point in polygon + */ + public function mostTopPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->y() === $b->y()) { + return 0; + } + return $a->y() > $b->y() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return most bottom point in polygon + */ + public function mostBottomPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->y() === $b->y()) { + return 0; + } + return $a->y() < $b->y() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return point in absolute center of the polygon + */ + public function centerPoint(): PointInterface + { + return new Point( + $this->mostRightPoint()->x() - (intval(round($this->width() / 2))), + $this->mostTopPoint()->y() - (intval(round($this->height() / 2))) + ); + } + + /** + * Align all points of polygon horizontally to given position around pivot point + */ + public function align(string $position): self + { + switch (strtolower($position)) { + case 'center': + case 'middle': + $diff = $this->centerPoint()->x() - $this->pivot()->x(); + break; + + case 'right': + $diff = $this->mostRightPoint()->x() - $this->pivot()->x(); + break; + + default: + case 'left': + $diff = $this->mostLeftPoint()->x() - $this->pivot()->x(); + break; + } + + foreach ($this->points as $point) { + $point->setX( + intval($point->x() - $diff) + ); + } + + return $this; + } + + /** + * Align all points of polygon vertically to given position around pivot point + */ + public function valign(string $position): self + { + switch (strtolower($position)) { + case 'center': + case 'middle': + $diff = $this->centerPoint()->y() - $this->pivot()->y(); + break; + + case 'top': + $diff = $this->mostTopPoint()->y() - $this->pivot()->y() - $this->height(); + break; + + default: + case 'bottom': + $diff = $this->mostBottomPoint()->y() - $this->pivot()->y() + $this->height(); + break; + } + + foreach ($this->points as $point) { + $point->setY( + intval($point->y() - $diff), + ); + } + + return $this; + } + + /** + * Rotate points of polygon around pivot point with given angle + */ + public function rotate(float $angle): self + { + $sin = sin(deg2rad($angle)); + $cos = cos(deg2rad($angle)); + + foreach ($this->points as $point) { + // translate point to pivot + $point->setX( + intval($point->x() - $this->pivot()->x()), + ); + $point->setY( + intval($point->y() - $this->pivot()->y()), + ); + + // rotate point + $x = $point->x() * $cos - $point->y() * $sin; + $y = $point->x() * $sin + $point->y() * $cos; + + // translate point back + $point->setX( + intval($x + $this->pivot()->x()), + ); + $point->setY( + intval($y + $this->pivot()->y()), + ); + } + + return $this; + } + + /** + * Move all points by given amount on the x-axis + */ + public function movePointsX(int $amount): self + { + foreach ($this->points as $point) { + $point->moveX($amount); + } + + return $this; + } + + /** + * Move all points by given amount on the y-axis + */ + public function movePointsY(int $amount): self + { + foreach ($this->points as $point) { + $point->moveY($amount); + } + + return $this; + } + + /** + * Return array of all x/y values of all points of polygon + * + * @return array + */ + public function toArray(): array + { + $coordinates = []; + foreach ($this->points as $point) { + $coordinates[] = $point->x(); + $coordinates[] = $point->y(); + } + + return $coordinates; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Rectangle.php b/upLoadImage/vendor/intervention/image/src/Geometry/Rectangle.php new file mode 100644 index 0000000..01e57f9 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Rectangle.php @@ -0,0 +1,335 @@ +addPoint(new Point($this->pivot->x(), $this->pivot->y())); + $this->addPoint(new Point($this->pivot->x() + $width, $this->pivot->y())); + $this->addPoint(new Point($this->pivot->x() + $width, $this->pivot->y() - $height)); + $this->addPoint(new Point($this->pivot->x(), $this->pivot->y() - $height)); + } + + /** + * Set size of rectangle + */ + public function setSize(int $width, int $height): self + { + return $this->setWidth($width)->setHeight($height); + } + + /** + * Set width of rectangle + */ + public function setWidth(int $width): self + { + $this[1]->setX($this[0]->x() + $width); + $this[2]->setX($this[3]->x() + $width); + + return $this; + } + + /** + * Set height of rectangle + */ + public function setHeight(int $height): self + { + $this[2]->setY($this[1]->y() + $height); + $this[3]->setY($this[0]->y() + $height); + + return $this; + } + + /** + * Return pivot point of rectangle + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Set pivot point of rectangle + */ + public function setPivot(PointInterface $pivot): self + { + $this->pivot = $pivot; + + return $this; + } + + /** + * Move pivot to the given position in the rectangle and adjust the new + * position by given offset values. + */ + public function movePivot(string $position, int $offset_x = 0, int $offset_y = 0): self + { + switch (strtolower($position)) { + case 'top': + case 'top-center': + case 'top-middle': + case 'center-top': + case 'middle-top': + $x = intval(round($this->width() / 2)) + $offset_x; + $y = $offset_y; + break; + + case 'top-right': + case 'right-top': + $x = $this->width() - $offset_x; + $y = $offset_y; + break; + + case 'left': + case 'left-center': + case 'left-middle': + case 'center-left': + case 'middle-left': + $x = $offset_x; + $y = intval(round($this->height() / 2)) + $offset_y; + break; + + case 'right': + case 'right-center': + case 'right-middle': + case 'center-right': + case 'middle-right': + $x = $this->width() - $offset_x; + $y = intval(round($this->height() / 2)) + $offset_y; + break; + + case 'bottom-left': + case 'left-bottom': + $x = $offset_x; + $y = $this->height() - $offset_y; + break; + + case 'bottom': + case 'bottom-center': + case 'bottom-middle': + case 'center-bottom': + case 'middle-bottom': + $x = intval(round($this->width() / 2)) + $offset_x; + $y = $this->height() - $offset_y; + break; + + case 'bottom-right': + case 'right-bottom': + $x = $this->width() - $offset_x; + $y = $this->height() - $offset_y; + break; + + case 'center': + case 'middle': + case 'center-center': + case 'middle-middle': + $x = intval(round($this->width() / 2)) + $offset_x; + $y = intval(round($this->height() / 2)) + $offset_y; + break; + + default: + case 'top-left': + case 'left-top': + $x = $offset_x; + $y = $offset_y; + break; + } + + $this->pivot->setPosition($x, $y); + + return $this; + } + + /** + * Align pivot relative to given size at given position + */ + public function alignPivotTo(SizeInterface $size, string $position): self + { + $reference = new self($size->width(), $size->height()); + $reference->movePivot($position); + + $this->movePivot($position)->setPivot( + $reference->relativePositionTo($this) + ); + + return $this; + } + + /** + * Return relative position to given rectangle + */ + public function relativePositionTo(SizeInterface $rectangle): PointInterface + { + return new Point( + $this->pivot()->x() - $rectangle->pivot()->x(), + $this->pivot()->y() - $rectangle->pivot()->y() + ); + } + + /** + * Return aspect ration of rectangle + */ + public function aspectRatio(): float + { + return $this->width() / $this->height(); + } + + /** + * Determine if rectangle fits into given rectangle + */ + public function fitsInto(SizeInterface $size): bool + { + if ($this->width() > $size->width()) { + return false; + } + + if ($this->height() > $size->height()) { + return false; + } + + return true; + } + + /** + * Determine if rectangle has landscape format + */ + public function isLandscape(): bool + { + return $this->width() > $this->height(); + } + + /** + * Determine if rectangle has landscape format + */ + public function isPortrait(): bool + { + return $this->width() < $this->height(); + } + + /** + * Return most top left point of rectangle + */ + public function topLeftPoint(): PointInterface + { + return $this->points[0]; + } + + /** + * Return bottom right point of rectangle + */ + public function bottomRightPoint(): PointInterface + { + return $this->points[2]; + } + + /** + * @see SizeInterface::resize() + * + * @throws GeometryException + */ + public function resize(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->resize($this); + } + + /** + * @see SizeInterface::resizeDown() + * + * @throws GeometryException + */ + public function resizeDown(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->resizeDown($this); + } + + /** + * @see SizeInterface::scale() + * + * @throws GeometryException + */ + public function scale(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->scale($this); + } + + /** + * @see SizeInterface::scaleDown() + * + * @throws GeometryException + */ + public function scaleDown(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->scaleDown($this); + } + + /** + * @see SizeInterface::cover() + * + * @throws GeometryException + */ + public function cover(int $width, int $height): SizeInterface + { + return $this->resizer($width, $height)->cover($this); + } + + /** + * @see SizeInterface::contain() + * + * @throws GeometryException + */ + public function contain(int $width, int $height): SizeInterface + { + return $this->resizer($width, $height)->contain($this); + } + + /** + * @see SizeInterface::containMax() + * + * @throws GeometryException + */ + public function containMax(int $width, int $height): SizeInterface + { + return $this->resizer($width, $height)->containDown($this); + } + + /** + * Create resizer instance with given target size + * + * @throws GeometryException + */ + protected function resizer(?int $width = null, ?int $height = null): RectangleResizer + { + return new RectangleResizer($width, $height); + } + + /** + * Show debug info for the current rectangle + * + * @return array + */ + public function __debugInfo(): array + { + return [ + 'width' => $this->width(), + 'height' => $this->height(), + 'pivot' => $this->pivot, + ]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php b/upLoadImage/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php new file mode 100644 index 0000000..7136b36 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php @@ -0,0 +1,341 @@ +width); + } + + /** + * Return target width of resizer if available + */ + protected function getTargetWidth(): ?int + { + return $this->hasTargetWidth() ? $this->width : null; + } + + /** + * Determine if resize has target height + */ + protected function hasTargetHeight(): bool + { + return is_int($this->height); + } + + /** + * Return target width of resizer if available + */ + protected function getTargetHeight(): ?int + { + return $this->hasTargetHeight() ? $this->height : null; + } + + /** + * Return target size object + * + * @throws GeometryException + */ + protected function getTargetSize(): SizeInterface + { + if (!$this->hasTargetWidth() || !$this->hasTargetHeight()) { + throw new GeometryException('Target size needs width and height.'); + } + + return new Rectangle($this->width, $this->height); + } + + /** + * Set target width of resizer + */ + public function toWidth(int $width): self + { + $this->width = $width; + + return $this; + } + + /** + * Set target height of resizer + */ + public function toHeight(int $height): self + { + $this->height = $height; + + return $this; + } + + /** + * Set target size to given size object + */ + public function toSize(SizeInterface $size): self + { + $this->width = $size->width(); + $this->height = $size->height(); + + return $this; + } + + /** + * Get proportinal width + */ + protected function getProportionalWidth(SizeInterface $size): int + { + if (!$this->hasTargetHeight()) { + return $size->width(); + } + + return max([1, (int) round($this->height * $size->aspectRatio())]); + } + + /** + * Get proportinal height + */ + protected function getProportionalHeight(SizeInterface $size): int + { + if (!$this->hasTargetWidth()) { + return $size->height(); + } + + return max([1, (int) round($this->width / $size->aspectRatio())]); + } + + /** + * Resize given size to target size of the resizer + */ + public function resize(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($width = $this->getTargetWidth()) { + $resized->setWidth($width); + } + + if ($height = $this->getTargetHeight()) { + $resized->setHeight($height); + } + + return $resized; + } + + /** + * Resize given size to target size of the resizer but do not exceed original size + */ + public function resizeDown(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($width = $this->getTargetWidth()) { + $resized->setWidth( + min($width, $size->width()) + ); + } + + if ($height = $this->getTargetHeight()) { + $resized->setHeight( + min($height, $size->height()) + ); + } + + return $resized; + } + + /** + * Resize given size to target size proportinally + */ + public function scale(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($this->hasTargetWidth() && $this->hasTargetHeight()) { + $resized->setWidth(min( + $this->getProportionalWidth($size), + $this->getTargetWidth() + )); + $resized->setHeight(min( + $this->getProportionalHeight($size), + $this->getTargetHeight() + )); + } elseif ($this->hasTargetWidth()) { + $resized->setWidth($this->getTargetWidth()); + $resized->setHeight($this->getProportionalHeight($size)); + } elseif ($this->hasTargetHeight()) { + $resized->setWidth($this->getProportionalWidth($size)); + $resized->setHeight($this->getTargetHeight()); + } + + return $resized; + } + + /** + * Resize given size to target size proportinally but do not exceed original size + */ + public function scaleDown(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($this->hasTargetWidth() && $this->hasTargetHeight()) { + $resized->setWidth(min( + $this->getProportionalWidth($size), + $this->getTargetWidth(), + $size->width() + )); + $resized->setHeight(min( + $this->getProportionalHeight($size), + $this->getTargetHeight(), + $size->height() + )); + } elseif ($this->hasTargetWidth()) { + $resized->setWidth(min( + $this->getTargetWidth(), + $size->width() + )); + $resized->setHeight(min( + $this->getProportionalHeight($size), + $size->height() + )); + } elseif ($this->hasTargetHeight()) { + $resized->setWidth(min( + $this->getProportionalWidth($size), + $size->width() + )); + $resized->setHeight(min( + $this->getTargetHeight(), + $size->height() + )); + } + + return $resized; + } + + /** + * Scale given size to cover target size + * + * @param SizeInterface $size Size to be resized + * @throws GeometryException + */ + public function cover(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + // auto height + $resized->setWidth($this->getTargetWidth()); + $resized->setHeight($this->getProportionalHeight($size)); + + if ($resized->fitsInto($this->getTargetSize())) { + // auto width + $resized->setWidth($this->getProportionalWidth($size)); + $resized->setHeight($this->getTargetHeight()); + } + + return $resized; + } + + /** + * Scale given size to contain target size + * + * @param SizeInterface $size Size to be resized + * @throws GeometryException + */ + public function contain(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + // auto height + $resized->setWidth($this->getTargetWidth()); + $resized->setHeight($this->getProportionalHeight($size)); + + if (!$resized->fitsInto($this->getTargetSize())) { + // auto width + $resized->setWidth($this->getProportionalWidth($size)); + $resized->setHeight($this->getTargetHeight()); + } + + return $resized; + } + + /** + * Scale given size to contain target size but prevent upsizing + * + * @param SizeInterface $size Size to be resized + * @throws GeometryException + */ + public function containDown(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + // auto height + $resized->setWidth( + min($size->width(), $this->getTargetWidth()) + ); + + $resized->setHeight( + min($size->height(), $this->getProportionalHeight($size)) + ); + + if (!$resized->fitsInto($this->getTargetSize())) { + // auto width + $resized->setWidth( + min($size->width(), $this->getProportionalWidth($size)) + ); + $resized->setHeight( + min($size->height(), $this->getTargetHeight()) + ); + } + + return $resized; + } + + /** + * Crop target size out of given size at given position (i.e. move the pivot point) + */ + public function crop(SizeInterface $size, string $position = 'top-left'): SizeInterface + { + return $this->resize($size)->alignPivotTo( + $size->movePivot($position), + $position + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php b/upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php new file mode 100644 index 0000000..a18c8b4 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php @@ -0,0 +1,42 @@ +backgroundColor = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::backgroundColor() + */ + public function backgroundColor(): mixed + { + return $this->backgroundColor; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::hasBackgroundColor() + */ + public function hasBackgroundColor(): bool + { + return !empty($this->backgroundColor); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBorder.php b/upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBorder.php new file mode 100644 index 0000000..57ff83a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Geometry/Traits/HasBorder.php @@ -0,0 +1,75 @@ +setBorderSize($size)->setBorderColor($color); + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setBorderSize() + */ + public function setBorderSize(int $size): self + { + $this->borderSize = $size; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::borderSize() + */ + public function borderSize(): int + { + return $this->borderSize; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setBorderColor() + */ + public function setBorderColor(mixed $color): self + { + $this->borderColor = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::borderColor() + */ + public function borderColor(): mixed + { + return $this->borderColor; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::hasBorder() + */ + public function hasBorder(): bool + { + return $this->borderSize > 0 && !is_null($this->borderColor); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Image.php b/upLoadImage/vendor/intervention/image/src/Image.php new file mode 100644 index 0000000..738d0fe --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Image.php @@ -0,0 +1,1082 @@ +origin = new Origin(); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::driver() + */ + public function driver(): DriverInterface + { + return $this->driver; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::core() + */ + public function core(): CoreInterface + { + return $this->core; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::origin() + */ + public function origin(): Origin + { + return $this->origin; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setOrigin() + */ + public function setOrigin(Origin $origin): ImageInterface + { + $this->origin = $origin; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::count() + */ + public function count(): int + { + return $this->core->count(); + } + + /** + * Implementation of IteratorAggregate + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return $this->core; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::isAnimated() + */ + public function isAnimated(): bool + { + return $this->count() > 1; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::removeAnimation( + */ + public function removeAnimation(int|string $position = 0): ImageInterface + { + return $this->modify(new RemoveAnimationModifier($position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::sliceAnimation() + */ + public function sliceAnimation(int $offset = 0, ?int $length = null): ImageInterface + { + return $this->modify(new SliceAnimationModifier($offset, $length)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::loops() + */ + public function loops(): int + { + return $this->core->loops(); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setLoops() + */ + public function setLoops(int $loops): ImageInterface + { + $this->core->setLoops($loops); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::exif() + */ + public function exif(?string $query = null): mixed + { + return is_null($query) ? $this->exif : $this->exif->get($query); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setExif() + */ + public function setExif(CollectionInterface $exif): ImageInterface + { + $this->exif = $exif; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::modify() + */ + public function modify(ModifierInterface $modifier): ImageInterface + { + return $this->driver->specialize($modifier)->apply($this); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::analyze() + */ + public function analyze(AnalyzerInterface $analyzer): mixed + { + return $this->driver->specialize($analyzer)->analyze($this); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encode() + */ + public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImageInterface + { + return $this->driver->specialize($encoder)->encode($this); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::save() + */ + public function save(?string $path = null, mixed ...$options): ImageInterface + { + $path = is_null($path) ? $this->origin()->filePath() : $path; + + if (is_null($path)) { + throw new EncoderException('Could not determine file path to save.'); + } + + try { + // try to determine encoding format by file extension of the path + $encoded = $this->encodeByPath($path, ...$options); + } catch (EncoderException) { + // fallback to encoding format by media type + $encoded = $this->encodeByMediaType(null, ...$options); + } + + $encoded->save($path); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::width() + */ + public function width(): int + { + return $this->analyze(new WidthAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::height() + */ + public function height(): int + { + return $this->analyze(new HeightAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::size() + */ + public function size(): SizeInterface + { + return new Rectangle($this->width(), $this->height()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return $this->analyze(new ColorspaceAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setColorspace() + */ + public function setColorspace(string|ColorspaceInterface $colorspace): ImageInterface + { + return $this->modify(new ColorspaceModifier($colorspace)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resolution() + */ + public function resolution(): ResolutionInterface + { + return $this->analyze(new ResolutionAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setResolution() + */ + public function setResolution(float $x, float $y): ImageInterface + { + return $this->modify(new ResolutionModifier($x, $y)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pickColor() + */ + public function pickColor(int $x, int $y, int $frame_key = 0): ColorInterface + { + return $this->analyze(new PixelColorAnalyzer($x, $y, $frame_key)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pickColors() + */ + public function pickColors(int $x, int $y): CollectionInterface + { + return $this->analyze(new PixelColorsAnalyzer($x, $y)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::blendingColor() + */ + public function blendingColor(): ColorInterface + { + return $this->driver()->handleInput( + $this->driver()->config()->blendingColor + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setBlendingColor() + */ + public function setBlendingColor(mixed $color): ImageInterface + { + $this->driver()->config()->setOptions( + blendingColor: $this->driver()->handleInput($color) + ); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::blendTransparency() + */ + public function blendTransparency(mixed $color = null): ImageInterface + { + return $this->modify(new BlendTransparencyModifier($color)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::profile() + */ + public function profile(): ProfileInterface + { + return $this->analyze(new ProfileAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setProfile() + */ + public function setProfile(ProfileInterface $profile): ImageInterface + { + return $this->modify(new ProfileModifier($profile)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::removeProfile() + */ + public function removeProfile(): ImageInterface + { + return $this->modify(new ProfileRemovalModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::reduceColors() + */ + public function reduceColors(int $limit, mixed $background = 'transparent'): ImageInterface + { + return $this->modify(new QuantizeColorsModifier($limit, $background)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::sharpen() + */ + public function sharpen(int $amount = 10): ImageInterface + { + return $this->modify(new SharpenModifier($amount)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::invert() + */ + public function invert(): ImageInterface + { + return $this->modify(new InvertModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pixelate() + */ + public function pixelate(int $size): ImageInterface + { + return $this->modify(new PixelateModifier($size)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::greyscale() + */ + public function greyscale(): ImageInterface + { + return $this->modify(new GreyscaleModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::brightness() + */ + public function brightness(int $level): ImageInterface + { + return $this->modify(new BrightnessModifier($level)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::contrast() + */ + public function contrast(int $level): ImageInterface + { + return $this->modify(new ContrastModifier($level)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::gamma() + */ + public function gamma(float $gamma): ImageInterface + { + return $this->modify(new GammaModifier($gamma)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::colorize() + */ + public function colorize(int $red = 0, int $green = 0, int $blue = 0): ImageInterface + { + return $this->modify(new ColorizeModifier($red, $green, $blue)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::flip() + */ + public function flip(): ImageInterface + { + return $this->modify(new FlipModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::flop() + */ + public function flop(): ImageInterface + { + return $this->modify(new FlopModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::blur() + */ + public function blur(int $amount = 5): ImageInterface + { + return $this->modify(new BlurModifier($amount)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::rotate() + */ + public function rotate(float $angle, mixed $background = 'ffffff'): ImageInterface + { + return $this->modify(new RotateModifier($angle, $background)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::orient() + */ + public function orient(): ImageInterface + { + return $this->modify(new AlignRotationModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::text() + */ + public function text(string $text, int $x, int $y, callable|Closure|FontInterface $font): ImageInterface + { + return $this->modify( + new TextModifier( + $text, + new Point($x, $y), + call_user_func(new FontFactory($font)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resize() + */ + public function resize(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ResizeModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resizeDown() + */ + public function resizeDown(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ResizeDownModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::scale() + */ + public function scale(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ScaleModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::scaleDown() + */ + public function scaleDown(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ScaleDownModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::cover() + */ + public function cover(int $width, int $height, string $position = 'center'): ImageInterface + { + return $this->modify(new CoverModifier($width, $height, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::coverDown() + */ + public function coverDown(int $width, int $height, string $position = 'center'): ImageInterface + { + return $this->modify(new CoverDownModifier($width, $height, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resizeCanvas() + */ + public function resizeCanvas( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new ResizeCanvasModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resizeCanvasRelative() + */ + public function resizeCanvasRelative( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new ResizeCanvasRelativeModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::padDown() + */ + public function pad( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new PadModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pad() + */ + public function contain( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new ContainModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::crop() + */ + public function crop( + int $width, + int $height, + int $offset_x = 0, + int $offset_y = 0, + mixed $background = 'ffffff', + string $position = 'top-left' + ): ImageInterface { + return $this->modify(new CropModifier($width, $height, $offset_x, $offset_y, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::trim() + */ + public function trim(int $tolerance = 0): ImageInterface + { + return $this->modify(new TrimModifier($tolerance)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::place() + */ + public function place( + mixed $element, + string $position = 'top-left', + int $offset_x = 0, + int $offset_y = 0, + int $opacity = 100 + ): ImageInterface { + return $this->modify(new PlaceModifier($element, $position, $offset_x, $offset_y, $opacity)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::fill() + */ + public function fill(mixed $color, ?int $x = null, ?int $y = null): ImageInterface + { + return $this->modify( + new FillModifier( + $color, + is_null($x) || is_null($y) ? null : new Point($x, $y), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawPixel() + */ + public function drawPixel(int $x, int $y, mixed $color): ImageInterface + { + return $this->modify(new DrawPixelModifier(new Point($x, $y), $color)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawRectangle() + */ + public function drawRectangle(int $x, int $y, callable|Closure|Rectangle $init): ImageInterface + { + return $this->modify( + new DrawRectangleModifier( + call_user_func(new RectangleFactory(new Point($x, $y), $init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawEllipse() + */ + public function drawEllipse(int $x, int $y, callable|Closure|Ellipse $init): ImageInterface + { + return $this->modify( + new DrawEllipseModifier( + call_user_func(new EllipseFactory(new Point($x, $y), $init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawCircle() + */ + public function drawCircle(int $x, int $y, callable|Closure|Circle $init): ImageInterface + { + return $this->modify( + new DrawEllipseModifier( + call_user_func(new CircleFactory(new Point($x, $y), $init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawPolygon() + */ + public function drawPolygon(callable|Closure|Polygon $init): ImageInterface + { + return $this->modify( + new DrawPolygonModifier( + call_user_func(new PolygonFactory($init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawLine() + */ + public function drawLine(callable|Closure|Line $init): ImageInterface + { + return $this->modify( + new DrawLineModifier( + call_user_func(new LineFactory($init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawBezier() + */ + public function drawBezier(callable|Closure|Bezier $init): ImageInterface + { + return $this->modify( + new DrawBezierModifier( + call_user_func(new BezierFactory($init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encodeByMediaType() + */ + public function encodeByMediaType(null|string|MediaType $type = null, mixed ...$options): EncodedImageInterface + { + return $this->encode(new MediaTypeEncoder($type, ...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encodeByExtension() + */ + public function encodeByExtension( + null|string|FileExtension $extension = null, + mixed ...$options + ): EncodedImageInterface { + return $this->encode(new FileExtensionEncoder($extension, ...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encodeByPath() + */ + public function encodeByPath(?string $path = null, mixed ...$options): EncodedImageInterface + { + return $this->encode(new FilePathEncoder($path, ...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toJpeg() + */ + public function toJpeg(mixed ...$options): EncodedImageInterface + { + return $this->encode(new JpegEncoder(...$options)); + } + + /** + * Alias of self::toJpeg() + * + * @throws RuntimeException + */ + public function toJpg(mixed ...$options): EncodedImageInterface + { + return $this->toJpeg(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toJpeg() + */ + public function toJpeg2000(mixed ...$options): EncodedImageInterface + { + return $this->encode(new Jpeg2000Encoder(...$options)); + } + + /** + * ALias of self::toJpeg2000() + * + * @throws RuntimeException + */ + public function toJp2(mixed ...$options): EncodedImageInterface + { + return $this->toJpeg2000(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toPng() + */ + public function toPng(mixed ...$options): EncodedImageInterface + { + return $this->encode(new PngEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toGif() + */ + public function toGif(mixed ...$options): EncodedImageInterface + { + return $this->encode(new GifEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toWebp() + */ + public function toWebp(mixed ...$options): EncodedImageInterface + { + return $this->encode(new WebpEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toBitmap() + */ + public function toBitmap(mixed ...$options): EncodedImageInterface + { + return $this->encode(new BmpEncoder(...$options)); + } + + /** + * Alias if self::toBitmap() + * + * @throws RuntimeException + */ + public function toBmp(mixed ...$options): EncodedImageInterface + { + return $this->toBitmap(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toAvif() + */ + public function toAvif(mixed ...$options): EncodedImageInterface + { + return $this->encode(new AvifEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toTiff() + */ + public function toTiff(mixed ...$options): EncodedImageInterface + { + return $this->encode(new TiffEncoder(...$options)); + } + + /** + * Alias of self::toTiff() + * + * @throws RuntimeException + */ + public function toTif(mixed ...$options): EncodedImageInterface + { + return $this->toTiff(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toHeic() + */ + public function toHeic(mixed ...$options): EncodedImageInterface + { + return $this->encode(new HeicEncoder(...$options)); + } + + /** + * Show debug info for the current image + * + * @return array + */ + public function __debugInfo(): array + { + try { + return [ + 'width' => $this->width(), + 'height' => $this->height(), + ]; + } catch (RuntimeException) { + return []; + } + } + + /** + * Clone image + */ + public function __clone(): void + { + $this->driver = clone $this->driver; + $this->core = clone $this->core; + $this->exif = clone $this->exif; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/ImageManager.php b/upLoadImage/vendor/intervention/image/src/ImageManager.php new file mode 100644 index 0000000..16e608b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/ImageManager.php @@ -0,0 +1,143 @@ +driver = $this->resolveDriver($driver, ...$options); + } + + /** + * Create image manager with given driver + * + * @link https://image.intervention.io/v3/basics/configuration-drivers#static-constructor + * + * @throws DriverException + * @throws InputException + */ + public static function withDriver(string|DriverInterface $driver, mixed ...$options): self + { + return new self(self::resolveDriver($driver, ...$options)); + } + + /** + * Create image manager with GD driver + * + * @link https://image.intervention.io/v3/basics/configuration-drivers#static-gd-driver-constructor + * + * @throws DriverException + * @throws InputException + */ + public static function gd(mixed ...$options): self + { + return self::withDriver(new GdDriver(), ...$options); + } + + /** + * Create image manager with Imagick driver + * + * @link https://image.intervention.io/v3/basics/configuration-drivers#static-imagick-driver-constructor + * + * @throws DriverException + * @throws InputException + */ + public static function imagick(mixed ...$options): self + { + return self::withDriver(new ImagickDriver(), ...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::create() + */ + public function create(int $width, int $height): ImageInterface + { + return $this->driver->createImage($width, $height); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::read() + */ + public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface + { + return $this->driver->handleInput( + $input, + match (true) { + is_string($decoders), is_a($decoders, DecoderInterface::class) => [$decoders], + default => $decoders, + } + ); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::animate() + */ + public function animate(callable $init): ImageInterface + { + return $this->driver->createAnimation($init); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::driver() + */ + public function driver(): DriverInterface + { + return $this->driver; + } + + /** + * Return driver object from given input which might be driver classname or instance of DriverInterface + * + * @throws DriverException + * @throws InputException + */ + private static function resolveDriver(string|DriverInterface $driver, mixed ...$options): DriverInterface + { + $driver = match (true) { + $driver instanceof DriverInterface => $driver, + class_exists($driver) => new $driver(), + default => throw new DriverException( + 'Unable to resolve driver. Argment must be either an instance of ' . + DriverInterface::class . '::class or a qualified namespaced name of the driver class.', + ), + }; + + if (!$driver instanceof DriverInterface) { + throw new DriverException( + 'Unable to resolve driver. Driver object must implement ' . DriverInterface::class . '.', + ); + } + + $driver->config()->setOptions(...$options); + + return $driver; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/InputHandler.php b/upLoadImage/vendor/intervention/image/src/InputHandler.php new file mode 100644 index 0000000..9189aad --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/InputHandler.php @@ -0,0 +1,132 @@ + + */ + protected array $decoders = [ + NativeObjectDecoder::class, + ImageObjectDecoder::class, + ColorObjectDecoder::class, + RgbHexColorDecoder::class, + RgbStringColorDecoder::class, + CmykStringColorDecoder::class, + HsvStringColorDecoder::class, + HslStringColorDecoder::class, + TransparentColorDecoder::class, + HtmlColornameDecoder::class, + FilePointerImageDecoder::class, + FilePathImageDecoder::class, + SplFileInfoImageDecoder::class, + BinaryImageDecoder::class, + DataUriImageDecoder::class, + Base64ImageDecoder::class, + EncodedImageObjectDecoder::class, + ]; + + /** + * Driver with which the decoder classes are specialized + */ + protected ?DriverInterface $driver = null; + + /** + * Create new input handler instance with given decoder classnames + * + * @param array $decoders + * @return void + */ + public function __construct(array $decoders = [], ?DriverInterface $driver = null) + { + $this->decoders = count($decoders) ? $decoders : $this->decoders; + $this->driver = $driver; + } + + /** + * Static factory method + * + * @param array $decoders + */ + public static function withDecoders(array $decoders, ?DriverInterface $driver = null): self + { + return new self($decoders, $driver); + } + + /** + * {@inheritdoc} + * + * @see InputHandlerInterface::handle() + */ + public function handle(mixed $input): ImageInterface|ColorInterface + { + foreach ($this->decoders as $decoder) { + try { + // decode with driver specialized decoder + return $this->resolve($decoder)->decode($input); + } catch (DecoderException | NotSupportedException $e) { + // try next decoder + } + } + + if (isset($e)) { + throw new ($e::class)($e->getMessage()); + } + + throw new DecoderException('Unable to decode input.'); + } + + /** + * Resolve the given classname to an decoder object + * + * @throws DriverException + * @throws NotSupportedException + */ + private function resolve(string|DecoderInterface $decoder): DecoderInterface + { + if (($decoder instanceof DecoderInterface) && empty($this->driver)) { + return $decoder; + } + + if (($decoder instanceof DecoderInterface) && !empty($this->driver)) { + return $this->driver->specialize($decoder); + } + + if (empty($this->driver)) { + return new $decoder(); + } + + return $this->driver->specialize(new $decoder()); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php new file mode 100644 index 0000000..d11d874 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php @@ -0,0 +1,17 @@ + + */ +interface CollectionInterface extends Traversable +{ + /** + * Determine if the collection has item at given key + */ + public function has(int|string $key): bool; + + /** + * Add item to collection + * + * @return CollectionInterface + */ + public function push(mixed $item): self; + + /** + * Return item for given key or return default is key does not exist + */ + public function get(int|string $key, mixed $default = null): mixed; + + /** + * Return item at given numeric position starting at 0 + */ + public function getAtPosition(int $key = 0, mixed $default = null): mixed; + + /** + * Return first item in collection + */ + public function first(): mixed; + + /** + * Return last item in collection + */ + public function last(): mixed; + + /** + * Return item count of collection + */ + public function count(): int; + + /** + * Empty collection + * + * @return CollectionInterface + */ + public function empty(): self; + + /** + * Transform collection as array + * + * @return array + */ + public function toArray(): array; + + /** + * Extract items based on given values and discard the rest. + * + * @return CollectionInterface + */ + public function slice(int $offset, ?int $length = 0): self; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php new file mode 100644 index 0000000..ed70557 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php @@ -0,0 +1,57 @@ + + */ + public function toArray(): array; + + /** + * Cast color object to hex encoded web color + */ + public function toHex(string $prefix = ''): string; + + /** + * Return array of all color channels + * + * @return array + */ + public function channels(): array; + + /** + * Return array of normalized color channel values + * + * @return array + */ + public function normalize(): array; + + /** + * Retrieve the color channel by its classname + * + * @throws ColorException + */ + public function channel(string $classname): ColorChannelInterface; + + /** + * Convert color to given colorspace + */ + public function convertTo(string|ColorspaceInterface $colorspace): self; + + /** + * Determine if the current color is gray + */ + public function isGreyscale(): bool; + + /** + * Determine if the current color is (semi) transparent + */ + public function isTransparent(): bool; + + /** + * Determine whether the current color is completely transparent + */ + public function isClear(): bool; + + /** + * Cast color object to string + */ + public function __toString(): string; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php new file mode 100644 index 0000000..cd1d7ec --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php @@ -0,0 +1,24 @@ + $normalized + */ + public function colorFromNormalized(array $normalized): ColorInterface; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/CoreInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/CoreInterface.php new file mode 100644 index 0000000..4082984 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/CoreInterface.php @@ -0,0 +1,70 @@ + + */ + public function setNative(mixed $native): self; + + /** + * Count number of frames of animated image core + */ + public function count(): int; + + /** + * Return frame of given position in an animated image + * + * @throws AnimationException + */ + public function frame(int $position): FrameInterface; + + /** + * Add new frame to core + * + * @return CoreInterface + */ + public function add(FrameInterface $frame): self; + + /** + * Return number of repetitions of an animated image + */ + public function loops(): int; + + /** + * Set the number of repetitions for an animation. Where a + * value of 0 means infinite repetition. + * + * @return CoreInterface + */ + public function setLoops(int $loops): self; + + /** + * Get first frame in core + * + * @throws AnimationException + */ + public function first(): FrameInterface; + + /** + * Get last frame in core + * + * @throws AnimationException + */ + public function last(): FrameInterface; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/DecoderInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/DecoderInterface.php new file mode 100644 index 0000000..3383269 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/DecoderInterface.php @@ -0,0 +1,17 @@ + $objects + * @throws NotSupportedException + * @throws DriverException + * @return array + */ + public function specializeMultiple(array $objects): array; + + /** + * Create new image instance with the current driver in given dimensions + * + * @throws RuntimeException + */ + public function createImage(int $width, int $height): ImageInterface; + + /** + * Create new animated image + * + * @throws RuntimeException + */ + public function createAnimation(callable $init): ImageInterface; + + /** + * Handle given input by decoding it to ImageInterface or ColorInterface + * + * @param array $decoders + * @throws RuntimeException + */ + public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface; + + /** + * Return color processor for the given colorspace + */ + public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface; + + /** + * Return font processor of the current driver + */ + public function fontProcessor(): FontProcessorInterface; + + /** + * Check whether all requirements for operating the driver are met and + * throw exception if the check fails. + * + * @throws DriverException + */ + public function checkHealth(): void; + + /** + * Check if the current driver supports the given format and if the + * underlying PHP extension was built with support for the format. + */ + public function supports(string|Format|FileExtension|MediaType $identifier): bool; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/EncodedImageInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/EncodedImageInterface.php new file mode 100644 index 0000000..d521d8e --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/EncodedImageInterface.php @@ -0,0 +1,23 @@ + + */ +interface ImageInterface extends IteratorAggregate, Countable +{ + /** + * Return driver of current image + */ + public function driver(): DriverInterface; + + /** + * Return core of current image + */ + public function core(): CoreInterface; + + /** + * Return the origin of the image + */ + public function origin(): Origin; + + /** + * Set the origin of the image + */ + public function setOrigin(Origin $origin): self; + + /** + * Return width of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#read-the-pixel-width + * + * @throws RuntimeException + */ + public function width(): int; + + /** + * Return height of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#read-the-pixel-height + * + * @throws RuntimeException + */ + public function height(): int; + + /** + * Return size of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#read-the-image-size-as-an-object + * + * @throws RuntimeException + */ + public function size(): SizeInterface; + + /** + * Encode image with given encoder + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images + * + * @throws RuntimeException + */ + public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImageInterface; + + /** + * Save the image to the specified path in the file system. If no path is + * given, the image will be saved at its original location. + * + * @link https://image.intervention.io/v3/basics/image-output#encode--save-combined + * + * @throws RuntimeException + */ + public function save(?string $path = null, mixed ...$options): self; + + /** + * Apply given modifier to current image + * + * @link https://image.intervention.io/v3/modifying-images/custom-modifiers + * + * @throws RuntimeException + */ + public function modify(ModifierInterface $modifier): self; + + /** + * Analyzer current image with given analyzer + * + * @throws RuntimeException + */ + public function analyze(AnalyzerInterface $analyzer): mixed; + + /** + * Determine if current image is animated + * + * @link https://image.intervention.io/v3/modifying-images/animations#check-the-current-image-instance-for-animation + */ + public function isAnimated(): bool; + + /** + * Remove all frames but keep the one at the specified position + * + * It is possible to specify the position as integer or string values. + * With the former, the exact position passed is searched for, while + * string values must represent a percentage value between '0%' and '100%' + * and the respective frame position is only determined approximately. + * + * @link https://image.intervention.io/v3/modifying-images/animations#remove-animation + * + * @throws RuntimeException + */ + public function removeAnimation(int|string $position = 0): self; + + /** + * Extract animation frames based on given values and discard the rest + * + * @link https://image.intervention.io/v3/modifying-images/animations#change-the-animation-iteration-count + * + * @throws RuntimeException + */ + public function sliceAnimation(int $offset = 0, ?int $length = null): self; + + /** + * Return loop count of animated image + * + * @link https://image.intervention.io/v3/modifying-images/animations#read-the-animation-iteration-count + */ + public function loops(): int; + + /** + * Set loop count of animated image + * + * @link https://image.intervention.io/v3/modifying-images/animations#change-the-animation-iteration-count + */ + public function setLoops(int $loops): self; + + /** + * Return exif data of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#exif-information + */ + public function exif(?string $query = null): mixed; + + /** + * Set exif data for the image object + */ + public function setExif(CollectionInterface $exif): self; + + /** + * Return image resolution/density + * + * @link https://image.intervention.io/v3/basics/meta-information#image-resolution + * + * @throws RuntimeException + */ + public function resolution(): ResolutionInterface; + + /** + * Set image resolution + * + * @link https://image.intervention.io/v3/basics/meta-information#image-resolution + * + * @throws RuntimeException + */ + public function setResolution(float $x, float $y): self; + + /** + * Get the colorspace of the image + * + * @link https://image.intervention.io/v3/basics/colors#read-the-image-colorspace + * + * @throws RuntimeException + */ + public function colorspace(): ColorspaceInterface; + + /** + * Transform image to given colorspace + * + * @link https://image.intervention.io/v3/basics/colors#change-the-image-colorspace + * + * @throws RuntimeException + */ + public function setColorspace(string|ColorspaceInterface $colorspace): self; + + /** + * Return color of pixel at given position on given frame position + * + * @link https://image.intervention.io/v3/basics/colors#color-information + * + * @throws RuntimeException + */ + public function pickColor(int $x, int $y, int $frame_key = 0): ColorInterface; + + /** + * Return all colors of pixel at given position for all frames of image + * + * @link https://image.intervention.io/v3/basics/colors#color-information + * + * @throws RuntimeException + */ + public function pickColors(int $x, int $y): CollectionInterface; + + /** + * Return color that is mixed with transparent areas when converting to a format which + * does not support transparency. + * + * @throws RuntimeException + */ + public function blendingColor(): ColorInterface; + + /** + * Set blending color will have no effect unless image is converted into a format + * which does not support transparency. + * + * @throws RuntimeException + */ + public function setBlendingColor(mixed $color): self; + + /** + * Replace transparent areas of the image with given color + * + * @throws RuntimeException + */ + public function blendTransparency(mixed $color = null): self; + + /** + * Retrieve ICC color profile of image + * + * @link https://image.intervention.io/v3/basics/colors#color-profiles + * + * @throws RuntimeException + */ + public function profile(): ProfileInterface; + + /** + * Set given icc color profile to image + * + * @link https://image.intervention.io/v3/basics/colors#color-profiles + * + * @throws RuntimeException + */ + public function setProfile(ProfileInterface $profile): self; + + /** + * Remove ICC color profile from the current image + * + * @link https://image.intervention.io/v3/basics/colors#color-profiles + * + * @throws RuntimeException + */ + public function removeProfile(): self; + + /** + * Apply color quantization to the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#reduce-colors + * + * @throws RuntimeException + */ + public function reduceColors(int $limit, mixed $background = 'transparent'): self; + + /** + * Sharpen the current image with given strength + * + * @link https://image.intervention.io/v3/modifying-images/effects#sharpening-effect + * + * @throws RuntimeException + */ + public function sharpen(int $amount = 10): self; + + /** + * Turn image into a greyscale version + * + * @link https://image.intervention.io/v3/modifying-images/effects#convert-image-to-a-greyscale-version + * + * @throws RuntimeException + */ + public function greyscale(): self; + + /** + * Adjust brightness of the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#change-the-image-brightness + * + * @throws RuntimeException + */ + public function brightness(int $level): self; + + /** + * Adjust color contrast of the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#change-the-image-contrast + * + * @throws RuntimeException + */ + public function contrast(int $level): self; + + /** + * Apply gamma correction on the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#gamma-correction + * + * @throws RuntimeException + */ + public function gamma(float $gamma): self; + + /** + * Adjust the intensity of the RGB color channels + * + * @link https://image.intervention.io/v3/modifying-images/effects#color-correction + * + * @throws RuntimeException + */ + public function colorize(int $red = 0, int $green = 0, int $blue = 0): self; + + /** + * Mirror the current image vertically by swapping top and bottom + * + * @link https://image.intervention.io/v3/modifying-images/effects#mirror-image-vertically + * + * @throws RuntimeException + */ + public function flip(): self; + + /** + * Mirror the current image horizontally by swapping left and right + * + * @link https://image.intervention.io/v3/modifying-images/effects#mirror-image-horizontally + * + * @throws RuntimeException + */ + public function flop(): self; + + /** + * Blur current image by given strength + * + * @link https://image.intervention.io/v3/modifying-images/effects#blur-effect + * + * @throws RuntimeException + */ + public function blur(int $amount = 5): self; + + /** + * Invert the colors of the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#invert-colors + * + * @throws RuntimeException + */ + public function invert(): self; + + /** + * Apply pixelation filter effect on current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#pixelation-effect + * + * @throws RuntimeException + */ + public function pixelate(int $size): self; + + /** + * Rotate current image by given angle + * + * @link https://image.intervention.io/v3/modifying-images/effects#image-rotation + * + * @param string $background + * @throws RuntimeException + */ + public function rotate(float $angle, mixed $background = 'ffffff'): self; + + /** + * Rotate the image to be upright according to exif information + * + * @link https://image.intervention.io/v3/modifying-images/effects#image-orientation-according-to-exif-data + * + * @throws RuntimeException + */ + public function orient(): self; + + /** + * Draw text on image + * + * @link https://image.intervention.io/v3/modifying-images/text-fonts + * + * @throws RuntimeException + */ + public function text(string $text, int $x, int $y, callable|Closure|FontInterface $font): self; + + /** + * Resize image to the given width and/or height + * + * @link https://image.intervention.io/v3/modifying-images/resizing#simple-image-resizing + * + * @throws RuntimeException + */ + public function resize(?int $width = null, ?int $height = null): self; + + /** + * Resize image to the given width and/or height without exceeding the original dimensions + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-without-exceeding-the-original-size + * + * @throws RuntimeException + */ + public function resizeDown(?int $width = null, ?int $height = null): self; + + /** + * Resize image to the given width and/or height and keep the original aspect ratio + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-images-proportionally + * + * @throws RuntimeException + */ + public function scale(?int $width = null, ?int $height = null): self; + + /** + * Resize image to the given width and/or height, keep the original aspect ratio + * and do not exceed the original image width or height + * + * @link https://image.intervention.io/v3/modifying-images/resizing#scale-images-but-do-not-exceed-the-original-size + * + * @throws RuntimeException + */ + public function scaleDown(?int $width = null, ?int $height = null): self; + + /** + * Takes the specified width and height and scales them to the largest + * possible size that fits within the original size. This scaled size is + * then positioned on the original and cropped, before this result is resized + * to the desired size using the arguments + * + * @link https://image.intervention.io/v3/modifying-images/resizing#cropping--resizing-combined + * + * @throws RuntimeException + */ + public function cover(int $width, int $height, string $position = 'center'): self; + + /** + * Same as cover() but do not exceed the original image size + * + * @link https://image.intervention.io/v3/modifying-images/resizing#fitted-resizing-without-exceeding-the-original-size + * + * @throws RuntimeException + */ + public function coverDown(int $width, int $height, string $position = 'center'): self; + + /** + * Resize the boundaries of the current image to given width and height. + * An anchor position can be defined to determine where the original image + * is fixed. A background color can be passed to define the color of the + * new emerging areas. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-image-boundaries-without-resampling-the-original-image + * + * @throws RuntimeException + */ + public function resizeCanvas( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * Resize canvas in the same way as resizeCanvas() but takes relative values + * for the width and height, which will be added or subtracted to the + * original image size. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-image-boundaries-relative-to-the-original + * + * @throws RuntimeException + */ + public function resizeCanvasRelative( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * Padded resizing means that the original image is scaled until it fits the + * defined target size with unchanged aspect ratio. The original image is + * not scaled up but only down. + * + * Compared to the cover() method, this method does not create cropped areas, + * but possibly new empty areas on the sides of the result image. These are + * filled with the specified background color. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resizing--padding-combined + * + * @param string $background + * @throws RuntimeException + */ + public function pad( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * This method does the same as pad(), but the original image is also scaled + * up if the target size exceeds the original size. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#padded-resizing-with-upscaling + * + * @param string $background + * @throws RuntimeException + */ + public function contain( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * Cut out a rectangular part of the current image with given width and + * height at a given position. Define optional x,y offset coordinates + * to move the cutout by the given amount of pixels. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#cut-out-a-rectangular-part + * + * @throws RuntimeException + */ + public function crop( + int $width, + int $height, + int $offset_x = 0, + int $offset_y = 0, + mixed $background = 'ffffff', + string $position = 'top-left' + ): self; + + /** + * Trim the image by removing border areas of similar color within a the given tolerance + * + * @link https://image.intervention.io/v3/modifying-images/resizing#remove-border-areas-in-similar-color + * + * @throws RuntimeException + * @throws AnimationException + */ + public function trim(int $tolerance = 0): self; + + /** + * Place another image into the current image instance + * + * @link https://image.intervention.io/v3/modifying-images/inserting#insert-images + * + * @throws RuntimeException + */ + public function place( + mixed $element, + string $position = 'top-left', + int $offset_x = 0, + int $offset_y = 0, + int $opacity = 100 + ): self; + + /** + * Fill image with given color + * + * If an optional position is specified for the filling process ln the form + * of x and y coordinates, the process is executed as flood fill. This means + * that the color at the specified position is taken as a reference and all + * adjacent pixels are also filled with the filling color. + * + * If no coordinates are specified, the entire image area is filled. + * + * @link https://image.intervention.io/v3/modifying-images/drawing#fill-images-with-color + * + * @throws RuntimeException + */ + public function fill(mixed $color, ?int $x = null, ?int $y = null): self; + + /** + * Draw a single pixel at given position defined by the coordinates x and y in a given color. + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-pixels + * + * @throws RuntimeException + */ + public function drawPixel(int $x, int $y, mixed $color): self; + + /** + * Draw a rectangle on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-rectangle + * + * @throws RuntimeException + */ + public function drawRectangle(int $x, int $y, callable|Closure|Rectangle $init): self; + + /** + * Draw ellipse on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-ellipses + * + * @throws RuntimeException + */ + public function drawEllipse(int $x, int $y, callable|Closure|Ellipse $init): self; + + /** + * Draw circle on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-circle + * + * @throws RuntimeException + */ + public function drawCircle(int $x, int $y, callable|Closure|Circle $init): self; + + /** + * Draw a polygon on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-polygon + * + * @throws RuntimeException + */ + public function drawPolygon(callable|Closure|Polygon $init): self; + + /** + * Draw a line on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-line + * + * @throws RuntimeException + */ + public function drawLine(callable|Closure|Line $init): self; + + /** + * Draw a bezier curve on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-bezier-curves + * + * @throws RuntimeException + */ + public function drawBezier(callable|Closure|Bezier $init): self; + + /** + * Encode image to given media (mime) type. If no type is given the image + * will be encoded to the format of the originally read image. + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images-by-media-mime-type + * + * @throws RuntimeException + */ + public function encodeByMediaType(null|string|MediaType $type = null, mixed ...$options): EncodedImageInterface; + + /** + * Encode the image into the format represented by the given extension. If no + * extension is given the image will be encoded to the format of the + * originally read image. + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images-by-file-extension + * + * @throws RuntimeException + */ + public function encodeByExtension( + null|string|FileExtension $extension = null, + mixed ...$options + ): EncodedImageInterface; + + /** + * Encode the image into the format represented by the given extension of + * the given file path extension is given the image will be encoded to + * the format of the originally read image. + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images-by-file-path + * + * @throws RuntimeException + */ + public function encodeByPath(?string $path = null, mixed ...$options): EncodedImageInterface; + + /** + * Encode image to JPEG format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-jpeg-format + * + * @throws RuntimeException + */ + public function toJpeg(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to Jpeg2000 format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-jpeg-2000-format + * + * @throws RuntimeException + */ + public function toJpeg2000(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to Webp format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-webp-format + * + * @throws RuntimeException + */ + public function toWebp(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to PNG format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-png-format + * + * @throws RuntimeException + */ + public function toPng(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to GIF format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-gif-format + * + * @throws RuntimeException + */ + public function toGif(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to Bitmap format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-windows-bitmap-format + * + * @throws RuntimeException + */ + public function toBitmap(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to AVIF format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-av1-image-file-format-avif + * + * @throws RuntimeException + */ + public function toAvif(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to TIFF format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-tiff-format + * + * @throws RuntimeException + */ + public function toTiff(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to HEIC format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-heic-format + * + * @throws RuntimeException + */ + public function toHeic(mixed ...$options): EncodedImageInterface; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/ImageManagerInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/ImageManagerInterface.php new file mode 100644 index 0000000..92652ec --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/ImageManagerInterface.php @@ -0,0 +1,63 @@ +|DecoderInterface $decoders + * @throws RuntimeException + */ + public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface; + + /** + * Create new animated image by given callback + * + * @link https://image.intervention.io/v3/basics/instantiation#create-animations + * + * @throws RuntimeException + */ + public function animate(callable $init): ImageInterface; + + /** + * Return currently used driver + */ + public function driver(): DriverInterface; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/InputHandlerInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/InputHandlerInterface.php new file mode 100644 index 0000000..f6c6c3d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/InputHandlerInterface.php @@ -0,0 +1,17 @@ + + */ + public function specializable(): array; + + /** + * Set the driver for which the object is specialized + * + * @throws DriverException + */ + public function setDriver(DriverInterface $driver): self; + + /** + * Return the driver for which the object was specialized + */ + public function driver(): DriverInterface; +} diff --git a/upLoadImage/vendor/intervention/image/src/Interfaces/SpecializedInterface.php b/upLoadImage/vendor/intervention/image/src/Interfaces/SpecializedInterface.php new file mode 100644 index 0000000..5d23bab --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Interfaces/SpecializedInterface.php @@ -0,0 +1,10 @@ +mediaType(); + } + + if ($identifier instanceof FileExtension) { + return $identifier->mediaType(); + } + + try { + $type = self::from(strtolower($identifier)); + } catch (Error) { + try { + $type = FileExtension::from(strtolower($identifier))->mediaType(); + } catch (Error) { + throw new NotSupportedException('Unable to create media type from "' . $identifier . '".'); + } + } + + return $type; + } + + /** + * Try to create media type from given identifier and return null on failure + * + * @param string|Format|MediaType|FileExtension $identifier + * @return MediaType|null + */ + public static function tryCreate(string|self|Format|FileExtension $identifier): ?self + { + try { + return self::create($identifier); + } catch (NotSupportedException) { + return null; + } + } + + /** + * Return the matching format for the current media (MIME) type + */ + public function format(): Format + { + return match ($this) { + self::IMAGE_JPEG, + self::IMAGE_JPG, + self::IMAGE_PJPEG, + self::IMAGE_X_JPEG => Format::JPEG, + self::IMAGE_WEBP, + self::IMAGE_X_WEBP => Format::WEBP, + self::IMAGE_GIF => Format::GIF, + self::IMAGE_PNG, + self::IMAGE_X_PNG => Format::PNG, + self::IMAGE_AVIF, + self::IMAGE_X_AVIF => Format::AVIF, + self::IMAGE_BMP, + self::IMAGE_MS_BMP, + self::IMAGE_X_BITMAP, + self::IMAGE_X_BMP, + self::IMAGE_X_MS_BMP, + self::IMAGE_X_XBITMAP, + self::IMAGE_X_WINDOWS_BMP, + self::IMAGE_X_BMP3, + self::IMAGE_X_WIN_BITMAP => Format::BMP, + self::IMAGE_TIFF => Format::TIFF, + self::IMAGE_JP2, + self::IMAGE_JPX, + self::IMAGE_X_JP2_CODESTREAM, + self::IMAGE_JPM => Format::JP2, + self::IMAGE_HEIF, + self::IMAGE_HEIC, + self::IMAGE_X_HEIC => Format::HEIC, + }; + } + + /** + * Return the possible file extension for the current media type + * + * @return array + */ + public function fileExtensions(): array + { + return $this->format()->fileExtensions(); + } + + /** + * Return the first file extension for the current media type + */ + public function fileExtension(): FileExtension + { + return $this->format()->fileExtension(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/ModifierStack.php b/upLoadImage/vendor/intervention/image/src/ModifierStack.php new file mode 100644 index 0000000..aacfa15 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/ModifierStack.php @@ -0,0 +1,44 @@ + $modifiers + * @return void + */ + public function __construct(protected array $modifiers) + { + // + } + + /** + * Apply all modifiers in stack to the given image + */ + public function apply(ImageInterface $image): ImageInterface + { + foreach ($this->modifiers as $modifier) { + $modifier->apply($image); + } + + return $image; + } + + /** + * Append new modifier to the stack + */ + public function push(ModifierInterface $modifier): self + { + $this->modifiers[] = $modifier; + + return $this; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php new file mode 100644 index 0000000..123b163 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php @@ -0,0 +1,47 @@ +driver()->handleInput($this->drawable()->backgroundColor()); + } catch (DecoderException) { + return $this->driver()->handleInput('transparent'); + } + + return $color; + } + + /** + * @throws RuntimeException + */ + public function borderColor(): ColorInterface + { + try { + $color = $this->driver()->handleInput($this->drawable()->borderColor()); + } catch (DecoderException) { + return $this->driver()->handleInput('transparent'); + } + + return $color; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/AlignRotationModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/AlignRotationModifier.php new file mode 100644 index 0000000..0faaa76 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/AlignRotationModifier.php @@ -0,0 +1,12 @@ +handleInput( + $this->color ?: $driver->config()->blendingColor + ); + + // replace alpha channel value with opaque value + if ($color->isTransparent()) { + return new Color( + $color->channel(Red::class)->value(), + $color->channel(Green::class)->value(), + $color->channel(Blue::class)->value(), + ); + } + + return $color; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/BlurModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/BlurModifier.php new file mode 100644 index 0000000..4ae60d3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/BlurModifier.php @@ -0,0 +1,15 @@ +target)) { + return $this->target; + } + + if (in_array($this->target, ['rgb', 'RGB', RgbColorspace::class])) { + return new RgbColorspace(); + } + + if (in_array($this->target, ['cmyk', 'CMYK', CmykColorspace::class])) { + return new CmykColorspace(); + } + + throw new NotSupportedException('Given colorspace is not supported.'); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/ContainModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/ContainModifier.php new file mode 100644 index 0000000..90da85d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/ContainModifier.php @@ -0,0 +1,44 @@ +size() + ->contain( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } + + public function getResizeSize(ImageInterface $image): SizeInterface + { + return new Rectangle($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/ContrastModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/ContrastModifier.php new file mode 100644 index 0000000..77f7b17 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/ContrastModifier.php @@ -0,0 +1,20 @@ +size(); + $crop = new Rectangle($this->width, $this->height); + + return $crop->contain( + $imagesize->width(), + $imagesize->height() + )->alignPivotTo($imagesize, $this->position); + } + + /** + * @throws RuntimeException + */ + public function getResizeSize(SizeInterface $size): SizeInterface + { + return $size->resize($this->width, $this->height); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/CropModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/CropModifier.php new file mode 100644 index 0000000..c9aa585 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/CropModifier.php @@ -0,0 +1,44 @@ +width, $this->height); + $crop->align($this->position); + + return $crop->alignPivotTo( + $image->size(), + $this->position + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/DrawBezierModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawBezierModifier.php new file mode 100644 index 0000000..d4e14e3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawBezierModifier.php @@ -0,0 +1,29 @@ +drawable; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php new file mode 100644 index 0000000..b32d5e0 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php @@ -0,0 +1,21 @@ +drawable; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/DrawLineModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawLineModifier.php new file mode 100644 index 0000000..26a86e3 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawLineModifier.php @@ -0,0 +1,29 @@ +drawable; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/DrawPixelModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawPixelModifier.php new file mode 100644 index 0000000..3faeabc --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawPixelModifier.php @@ -0,0 +1,23 @@ +drawable; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php new file mode 100644 index 0000000..005b79a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php @@ -0,0 +1,29 @@ +drawable; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/FillModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/FillModifier.php new file mode 100644 index 0000000..d3f334d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/FillModifier.php @@ -0,0 +1,23 @@ +position instanceof PointInterface; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/FlipModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/FlipModifier.php new file mode 100644 index 0000000..8862f1d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/FlipModifier.php @@ -0,0 +1,12 @@ +size() + ->containMax( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/PixelateModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/PixelateModifier.php new file mode 100644 index 0000000..768fcce --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/PixelateModifier.php @@ -0,0 +1,15 @@ +size()->movePivot( + $this->position, + $this->offset_x, + $this->offset_y + ); + + $watermark_size = $watermark->size()->movePivot( + $this->position + ); + + return $image_size->relativePositionTo($watermark_size); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/ProfileModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/ProfileModifier.php new file mode 100644 index 0000000..f784c95 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/ProfileModifier.php @@ -0,0 +1,16 @@ +core()->frame($this->normalizePosition($image)); + } + + /** + * Return the position of the selected frame as integer + * + * @throws InputException + */ + protected function normalizePosition(ImageInterface $image): int + { + if (is_int($this->position)) { + return $this->position; + } + + if (is_numeric($this->position)) { + return (int) $this->position; + } + + // calculate position from percentage value + if (preg_match("/^(?P[0-9]{1,3})%$/", $this->position, $matches) != 1) { + throw new InputException( + 'Position must be either integer or a percent value as string.' + ); + } + + $total = count($image); + $position = intval(round($total / 100 * intval($matches['percent']))); + + return $position == $total ? $position - 1 : $position; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php new file mode 100644 index 0000000..ae42b7a --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php @@ -0,0 +1,49 @@ + new Rectangle( + is_null($this->width) ? $image->width() : $image->width() + $this->width, + is_null($this->height) ? $image->height() : $image->height() + $this->height, + ), + default => new Rectangle( + is_null($this->width) ? $image->width() : $this->width, + is_null($this->height) ? $image->height() : $this->height, + ), + }; + + return $size->alignPivotTo($image->size(), $this->position); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php new file mode 100644 index 0000000..bcc5fa8 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php @@ -0,0 +1,10 @@ +angle, 360); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/ScaleDownModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/ScaleDownModifier.php new file mode 100644 index 0000000..8fdfa9b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/ScaleDownModifier.php @@ -0,0 +1,10 @@ +driver()->handleInput($this->font->color()); + + if ($this->font->hasStrokeEffect() && $color->isTransparent()) { + throw new ColorException( + 'The text color must be fully opaque when using the stroke effect.' + ); + } + + return $color; + } + + /** + * Decode outline stroke color + * + * @throws RuntimeException + * @throws ColorException + */ + protected function strokeColor(): ColorInterface + { + $color = $this->driver()->handleInput($this->font->strokeColor()); + + if ($color->isTransparent()) { + throw new ColorException( + 'The stroke color must be fully opaque.' + ); + } + + return $color; + } + + /** + * Return array of offset points to draw text stroke effect below the actual text + * + * @return array + */ + protected function strokeOffsets(FontInterface $font): array + { + $offsets = []; + + if ($font->strokeWidth() <= 0) { + return $offsets; + } + + for ($x = $font->strokeWidth() * -1; $x <= $font->strokeWidth(); $x++) { + for ($y = $font->strokeWidth() * -1; $y <= $font->strokeWidth(); $y++) { + $offsets[] = new Point($x, $y); + } + } + + return $offsets; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Modifiers/TrimModifier.php b/upLoadImage/vendor/intervention/image/src/Modifiers/TrimModifier.php new file mode 100644 index 0000000..6d7959b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Modifiers/TrimModifier.php @@ -0,0 +1,20 @@ +mediaType; + } + + /** + * Alias of self::mediaType() + */ + public function mimetype(): string + { + return $this->mediaType(); + } + + /** + * Set media type of current instance + */ + public function setMediaType(string|MediaType $type): self + { + $this->mediaType = match (true) { + is_string($type) => $type, + default => $type->value, + }; + + return $this; + } + + /** + * Return file path of origin + */ + public function filePath(): ?string + { + return $this->filePath; + } + + /** + * Set file path for origin + */ + public function setFilePath(string $path): self + { + $this->filePath = $path; + + return $this; + } + + /** + * Return file extension if origin was created from file path + */ + public function fileExtension(): ?string + { + return pathinfo($this->filePath ?: '', PATHINFO_EXTENSION) ?: null; + } + + /** + * Show debug info for the current image + * + * @return array + */ + public function __debugInfo(): array + { + return [ + 'mediaType' => $this->mediaType(), + 'filePath' => $this->filePath(), + ]; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Resolution.php b/upLoadImage/vendor/intervention/image/src/Resolution.php new file mode 100644 index 0000000..64ab07c --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Resolution.php @@ -0,0 +1,162 @@ + + */ +class Resolution implements ResolutionInterface, Stringable, IteratorAggregate +{ + public const PER_INCH = 1; + public const PER_CM = 2; + + /** + * Create new instance + */ + public function __construct( + protected float $x, + protected float $y, + protected int $per_unit = self::PER_INCH + ) { + // + } + + /** + * {@inheritdoc} + * + * @see IteratorAggregate::getIterator() + */ + public function getIterator(): Traversable + { + return new ArrayIterator([$this->x, $this->y]); + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::x() + */ + public function x(): float + { + return $this->x; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::setX() + */ + public function setX(float $x): self + { + $this->x = $x; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::y() + */ + public function y(): float + { + return $this->y; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::setY() + */ + public function setY(float $y): self + { + $this->y = $y; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::setPerUnit() + */ + protected function setPerUnit(int $per_unit): self + { + $this->per_unit = $per_unit; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::unit() + */ + public function unit(): string + { + return match ($this->per_unit) { + self::PER_CM => 'dpcm', + default => 'dpi', + }; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::perInch() + */ + public function perInch(): self + { + return match ($this->per_unit) { + self::PER_CM => $this + ->setPerUnit(self::PER_INCH) + ->setX($this->x * 2.54) + ->setY($this->y * 2.54), + default => $this + }; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::perCm() + */ + public function perCm(): self + { + return match ($this->per_unit) { + self::PER_INCH => $this + ->setPerUnit(self::PER_CM) + ->setX($this->x / 2.54) + ->setY($this->y / 2.54), + default => $this, + }; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::toString() + */ + public function toString(): string + { + return sprintf("%1\$.2f x %2\$.2f %3\$s", $this->x, $this->y, $this->unit()); + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php b/upLoadImage/vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php new file mode 100644 index 0000000..efa5622 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php @@ -0,0 +1,77 @@ +getConstructor()) { + foreach ($constructor->getParameters() as $parameter) { + $specializable[$parameter->getName()] = $this->{$parameter->getName()}; + } + } + + return $specializable; + } + + /** + * {@inheritdoc} + * + * @see SpecializableInterface::driver() + */ + public function driver(): DriverInterface + { + return $this->driver; + } + + /** + * {@inheritdoc} + * + * @see SpecializableInterface::setDriver() + */ + public function setDriver(DriverInterface $driver): SpecializableInterface + { + if (!$this->belongsToDriver($driver)) { + throw new DriverException( + "Class '" . $this::class . "' can not be used with " . $driver->id() . " driver." + ); + } + + $this->driver = $driver; + + return $this; + } + + /** + * Determine if the current object belongs to the given driver's namespace + */ + protected function belongsToDriver(object $driver): bool + { + $namespace = function (object $object): string { + return (new ReflectionClass($object))->getNamespaceName(); + }; + + return str_starts_with($namespace($this), $namespace($driver)); + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Traits/CanBuildFilePointer.php b/upLoadImage/vendor/intervention/image/src/Traits/CanBuildFilePointer.php new file mode 100644 index 0000000..29d613d --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Traits/CanBuildFilePointer.php @@ -0,0 +1,42 @@ +filename = $filename; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setSize() + */ + public function setSize(float $size): FontInterface + { + $this->size = $size; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::size() + */ + public function size(): float + { + return $this->size; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setAngle() + */ + public function setAngle(float $angle): FontInterface + { + $this->angle = $angle; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::angle() + */ + public function angle(): float + { + return $this->angle; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setFilename() + * + * @throws FontException + */ + public function setFilename(string $filename): FontInterface + { + if (!file_exists($filename)) { + throw new FontException('Font file ' . $filename . ' does not exist.'); + } + + $this->filename = $filename; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::filename() + */ + public function filename(): ?string + { + return $this->filename; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::hasFilename() + */ + public function hasFilename(): bool + { + return !is_null($this->filename) && is_file($this->filename); + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setColor() + */ + public function setColor(mixed $color): FontInterface + { + $this->color = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::color() + */ + public function color(): mixed + { + return $this->color; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setStrokeColor() + */ + public function setStrokeColor(mixed $color): FontInterface + { + $this->strokeColor = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::strokeColor() + */ + public function strokeColor(): mixed + { + return $this->strokeColor; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setStrokeWidth() + */ + public function setStrokeWidth(int $width): FontInterface + { + if (!in_array($width, range(0, 10))) { + throw new FontException( + 'The stroke width must be in the range from 0 to 10.' + ); + } + + $this->strokeWidth = $width; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::strokeWidth() + */ + public function strokeWidth(): int + { + return $this->strokeWidth; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::hasStrokeEffect() + */ + public function hasStrokeEffect(): bool + { + return $this->strokeWidth > 0; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::alignment() + */ + public function alignment(): string + { + return $this->alignment; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setAlignment() + */ + public function setAlignment(string $value): FontInterface + { + $this->alignment = $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::valignment() + */ + public function valignment(): string + { + return $this->valignment; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setValignment() + */ + public function setValignment(string $value): FontInterface + { + $this->valignment = $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setLineHeight() + */ + public function setLineHeight(float $height): FontInterface + { + $this->lineHeight = $height; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::lineHeight() + */ + public function lineHeight(): float + { + return $this->lineHeight; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setWrapWidth() + */ + public function setWrapWidth(?int $width): FontInterface + { + $this->wrapWidth = $width; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::wrapWidth() + */ + public function wrapWidth(): ?int + { + return $this->wrapWidth; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Typography/FontFactory.php b/upLoadImage/vendor/intervention/image/src/Typography/FontFactory.php new file mode 100644 index 0000000..7259012 --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Typography/FontFactory.php @@ -0,0 +1,141 @@ +font = is_a($init, FontInterface::class) ? $init : new Font(); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * Set the filename of the font to be built + */ + public function filename(string $value): self + { + $this->font->setFilename($value); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see self::filename() + */ + public function file(string $value): self + { + return $this->filename($value); + } + + /** + * Set outline stroke effect for the font to be built + * + * @throws FontException + */ + public function stroke(mixed $color, int $width = 1): self + { + $this->font->setStrokeWidth($width); + $this->font->setStrokeColor($color); + + return $this; + } + + /** + * Set color for the font to be built + */ + public function color(mixed $value): self + { + $this->font->setColor($value); + + return $this; + } + + /** + * Set the size for the font to be built + */ + public function size(float $value): self + { + $this->font->setSize($value); + + return $this; + } + + /** + * Set the horizontal alignment of the font to be built + */ + public function align(string $value): self + { + $this->font->setAlignment($value); + + return $this; + } + + /** + * Set the vertical alignment of the font to be built + */ + public function valign(string $value): self + { + $this->font->setValignment($value); + + return $this; + } + + /** + * Set the line height of the font to be built + */ + public function lineHeight(float $value): self + { + $this->font->setLineHeight($value); + + return $this; + } + + /** + * Set the rotation angle of the font to be built + */ + public function angle(float $value): self + { + $this->font->setAngle($value); + + return $this; + } + + /** + * Set the maximum width of the text block to be built + */ + public function wrap(int $width): self + { + $this->font->setWrapWidth($width); + + return $this; + } + + /** + * Build font + */ + public function __invoke(): FontInterface + { + return $this->font; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Typography/Line.php b/upLoadImage/vendor/intervention/image/src/Typography/Line.php new file mode 100644 index 0000000..e820dfc --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Typography/Line.php @@ -0,0 +1,125 @@ + + */ +class Line implements IteratorAggregate, Countable, Stringable +{ + /** + * Segments (usually individual words including punctuation marks) of the line + * + * @var array + */ + protected array $segments = []; + + /** + * Create new text line object with given text & position + * + * @return void + */ + public function __construct( + ?string $text = null, + protected PointInterface $position = new Point() + ) { + if (is_string($text)) { + $this->segments = $this->wordsSeperatedBySpaces($text) ? explode(" ", $text) : mb_str_split($text); + } + } + + /** + * Add word to current line + */ + public function add(string $word): self + { + $this->segments[] = $word; + + return $this; + } + + /** + * Returns Iterator + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->segments); + } + + /** + * Get Position of line + */ + public function position(): PointInterface + { + return $this->position; + } + + /** + * Set position of current line + */ + public function setPosition(PointInterface $point): self + { + $this->position = $point; + + return $this; + } + + /** + * Count segments (individual words including punctuation marks) of line + */ + public function count(): int + { + return count($this->segments); + } + + /** + * Count characters of line + */ + public function length(): int + { + return mb_strlen((string) $this); + } + + /** + * Dermine if words are sperarated by spaces in the written language of the given text + */ + private function wordsSeperatedBySpaces(string $text): bool + { + return 1 !== preg_match( + '/[' . + '\x{4E00}-\x{9FFF}' . // CJK Unified Ideographs (chinese) + '\x{3400}-\x{4DBF}' . // CJK Unified Ideographs Extension A (chinese) + '\x{3040}-\x{309F}' . // hiragana (japanese) + '\x{30A0}-\x{30FF}' . // katakana (japanese) + '\x{0E00}-\x{0E7F}' . // thai + ']/u', + $text + ); + } + + /** + * Cast line to string + */ + public function __toString(): string + { + $string = implode("", $this->segments); + + if ($this->wordsSeperatedBySpaces($string)) { + return implode(" ", $this->segments); + } + + return $string; + } +} diff --git a/upLoadImage/vendor/intervention/image/src/Typography/TextBlock.php b/upLoadImage/vendor/intervention/image/src/Typography/TextBlock.php new file mode 100644 index 0000000..09d109b --- /dev/null +++ b/upLoadImage/vendor/intervention/image/src/Typography/TextBlock.php @@ -0,0 +1,72 @@ +push(new Line($line)); + } + } + + /** + * Return array of lines in text block + * + * @return array + */ + public function lines(): array + { + return $this->items; + } + + /** + * Set lines of the text block + * + * @param array $lines + */ + public function setLines(array $lines): self + { + $this->items = $lines; + + return $this; + } + + /** + * Get line by given key + */ + public function line(mixed $key): ?Line + { + if (!array_key_exists($key, $this->lines())) { + return null; + } + + return $this->lines()[$key]; + } + + /** + * Return line with most characters of text block + */ + public function longestLine(): Line + { + $lines = $this->lines(); + usort($lines, function (Line $a, Line $b): int { + if ($a->length() === $b->length()) { + return 0; + } + return $a->length() > $b->length() ? -1 : 1; + }); + + return $lines[0]; + } +} diff --git a/upLoadImage/vendor/symfony/deprecation-contracts/CHANGELOG.md b/upLoadImage/vendor/symfony/deprecation-contracts/CHANGELOG.md new file mode 100644 index 0000000..7932e26 --- /dev/null +++ b/upLoadImage/vendor/symfony/deprecation-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/upLoadImage/vendor/symfony/deprecation-contracts/LICENSE b/upLoadImage/vendor/symfony/deprecation-contracts/LICENSE new file mode 100644 index 0000000..0ed3a24 --- /dev/null +++ b/upLoadImage/vendor/symfony/deprecation-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-present Fabien Potencier + +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/upLoadImage/vendor/symfony/deprecation-contracts/README.md b/upLoadImage/vendor/symfony/deprecation-contracts/README.md new file mode 100644 index 0000000..9814864 --- /dev/null +++ b/upLoadImage/vendor/symfony/deprecation-contracts/README.md @@ -0,0 +1,26 @@ +Symfony Deprecation Contracts +============================= + +A generic function and convention to trigger deprecation notices. + +This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. + +By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, +the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. + +The function requires at least 3 arguments: + - the name of the Composer package that is triggering the deprecation + - the version of the package that introduced the deprecation + - the message of the deprecation + - more arguments can be provided: they will be inserted in the message using `printf()` formatting + +Example: +```php +trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); +``` + +This will generate the following message: +`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` + +While not recommended, the deprecation notices can be completely ignored by declaring an empty +`function trigger_deprecation() {}` in your application. diff --git a/upLoadImage/vendor/symfony/deprecation-contracts/composer.json b/upLoadImage/vendor/symfony/deprecation-contracts/composer.json new file mode 100644 index 0000000..5533b5c --- /dev/null +++ b/upLoadImage/vendor/symfony/deprecation-contracts/composer.json @@ -0,0 +1,35 @@ +{ + "name": "symfony/deprecation-contracts", + "type": "library", + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.1" + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "3.6-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/upLoadImage/vendor/symfony/deprecation-contracts/function.php b/upLoadImage/vendor/symfony/deprecation-contracts/function.php new file mode 100644 index 0000000..2d56512 --- /dev/null +++ b/upLoadImage/vendor/symfony/deprecation-contracts/function.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (!function_exists('trigger_deprecation')) { + /** + * Triggers a silenced deprecation notice. + * + * @param string $package The name of the Composer package that is triggering the deprecation + * @param string $version The version of the package that introduced the deprecation + * @param string $message The message of the deprecation + * @param mixed ...$args Values to insert in the message using printf() formatting + * + * @author Nicolas Grekas + */ + function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void + { + @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); + } +} diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/LICENSE b/upLoadImage/vendor/symfony/polyfill-mbstring/LICENSE new file mode 100644 index 0000000..6e3afce --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-present Fabien Potencier + +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/upLoadImage/vendor/symfony/polyfill-mbstring/Mbstring.php b/upLoadImage/vendor/symfony/polyfill-mbstring/Mbstring.php new file mode 100644 index 0000000..31e36a3 --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -0,0 +1,1045 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Mbstring; + +/** + * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. + * + * Implemented: + * - mb_chr - Returns a specific character from its Unicode code point + * - mb_convert_encoding - Convert character encoding + * - mb_convert_variables - Convert character code in variable(s) + * - mb_decode_mimeheader - Decode string in MIME header field + * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED + * - mb_decode_numericentity - Decode HTML numeric string reference to character + * - mb_encode_numericentity - Encode character to HTML numeric string reference + * - mb_convert_case - Perform case folding on a string + * - mb_detect_encoding - Detect character encoding + * - mb_get_info - Get internal settings of mbstring + * - mb_http_input - Detect HTTP input character encoding + * - mb_http_output - Set/Get HTTP output character encoding + * - mb_internal_encoding - Set/Get internal character encoding + * - mb_list_encodings - Returns an array of all supported encodings + * - mb_ord - Returns the Unicode code point of a character + * - mb_output_handler - Callback function converts character encoding in output buffer + * - mb_scrub - Replaces ill-formed byte sequences with substitute characters + * - mb_strlen - Get string length + * - mb_strpos - Find position of first occurrence of string in a string + * - mb_strrpos - Find position of last occurrence of a string in a string + * - mb_str_split - Convert a string to an array + * - mb_strtolower - Make a string lowercase + * - mb_strtoupper - Make a string uppercase + * - mb_substitute_character - Set/Get substitution character + * - mb_substr - Get part of string + * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive + * - mb_stristr - Finds first occurrence of a string within another, case insensitive + * - mb_strrchr - Finds the last occurrence of a character in a string within another + * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive + * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive + * - mb_strstr - Finds first occurrence of a string within another + * - mb_strwidth - Return width of string + * - mb_substr_count - Count the number of substring occurrences + * - mb_ucfirst - Make a string's first character uppercase + * - mb_lcfirst - Make a string's first character lowercase + * - mb_trim - Strip whitespace (or other characters) from the beginning and end of a string + * - mb_ltrim - Strip whitespace (or other characters) from the beginning of a string + * - mb_rtrim - Strip whitespace (or other characters) from the end of a string + * + * Not implemented: + * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * - mb_ereg_* - Regular expression with multibyte support + * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable + * - mb_preferred_mime_name - Get MIME charset string + * - mb_regex_encoding - Returns current encoding for multibyte regex as string + * - mb_regex_set_options - Set/Get the default options for mbregex functions + * - mb_send_mail - Send encoded mail + * - mb_split - Split multibyte string using regular expression + * - mb_strcut - Get part of string + * - mb_strimwidth - Get truncated string with specified width + * + * @author Nicolas Grekas + * + * @internal + */ +final class Mbstring +{ + public const MB_CASE_FOLD = \PHP_INT_MAX; + + private const SIMPLE_CASE_FOLD = [ + ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], + ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], + ]; + + private static $encodingList = ['ASCII', 'UTF-8']; + private static $language = 'neutral'; + private static $internalEncoding = 'UTF-8'; + + public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) + { + if (\is_array($s)) { + $r = []; + foreach ($s as $str) { + $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding); + } + + return $r; + } + + if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { + $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); + } else { + $fromEncoding = self::getEncoding($fromEncoding); + } + + $toEncoding = self::getEncoding($toEncoding); + + if ('BASE64' === $fromEncoding) { + $s = base64_decode($s); + $fromEncoding = $toEncoding; + } + + if ('BASE64' === $toEncoding) { + return base64_encode($s); + } + + if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { + if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { + $fromEncoding = 'Windows-1252'; + } + if ('UTF-8' !== $fromEncoding) { + $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); + } + + return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); + } + + if ('HTML-ENTITIES' === $fromEncoding) { + $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); + $fromEncoding = 'UTF-8'; + } + + return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); + } + + public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) + { + $ok = true; + array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { + if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { + $ok = false; + } + }); + + return $ok ? $fromEncoding : false; + } + + public static function mb_decode_mimeheader($s) + { + return iconv_mime_decode($s, 2, self::$internalEncoding); + } + + public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) + { + trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); + } + + public static function mb_decode_numericentity($s, $convmap, $encoding = null) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return ''; // Instead of null (cf. mb_encode_numericentity). + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $cnt = floor(\count($convmap) / 4) * 4; + + for ($i = 0; $i < $cnt; $i += 4) { + // collector_decode_htmlnumericentity ignores $convmap[$i + 3] + $convmap[$i] += $convmap[$i + 2]; + $convmap[$i + 1] += $convmap[$i + 2]; + } + + $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { + $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; + for ($i = 0; $i < $cnt; $i += 4) { + if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { + return self::mb_chr($c - $convmap[$i + 2]); + } + } + + return $m[0]; + }, $s); + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; // Instead of '' (cf. mb_decode_numericentity). + } + + if (null !== $is_hex && !\is_scalar($is_hex)) { + trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $cnt = floor(\count($convmap) / 4) * 4; + $i = 0; + $len = \strlen($s); + $result = ''; + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + $c = self::mb_ord($uchr); + + for ($j = 0; $j < $cnt; $j += 4) { + if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { + $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; + $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; + continue 2; + } + } + $result .= $uchr; + } + + if (null === $encoding) { + return $result; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $result); + } + + public static function mb_convert_case($s, $mode, $encoding = null) + { + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + if (\MB_CASE_TITLE == $mode) { + static $titleRegexp = null; + if (null === $titleRegexp) { + $titleRegexp = self::getData('titleCaseRegexp'); + } + $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); + } else { + if (\MB_CASE_UPPER == $mode) { + static $upper = null; + if (null === $upper) { + $upper = self::getData('upperCase'); + } + $map = $upper; + } else { + if (self::MB_CASE_FOLD === $mode) { + static $caseFolding = null; + if (null === $caseFolding) { + $caseFolding = self::getData('caseFolding'); + } + $s = strtr($s, $caseFolding); + } + + static $lower = null; + if (null === $lower) { + $lower = self::getData('lowerCase'); + } + $map = $lower; + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $i = 0; + $len = \strlen($s); + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if (isset($map[$uchr])) { + $uchr = $map[$uchr]; + $nlen = \strlen($uchr); + + if ($nlen == $ulen) { + $nlen = $i; + do { + $s[--$nlen] = $uchr[--$ulen]; + } while ($ulen); + } else { + $s = substr_replace($s, $uchr, $i - $ulen, $ulen); + $len += $nlen - $ulen; + $i += $nlen - $ulen; + } + } + } + } + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_internal_encoding($encoding = null) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + $normalizedEncoding = self::getEncoding($encoding); + + if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { + self::$internalEncoding = $normalizedEncoding; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + + public static function mb_language($lang = null) + { + if (null === $lang) { + return self::$language; + } + + switch ($normalizedLang = strtolower($lang)) { + case 'uni': + case 'neutral': + self::$language = $normalizedLang; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); + } + + public static function mb_list_encodings() + { + return ['UTF-8']; + } + + public static function mb_encoding_aliases($encoding) + { + switch (strtoupper($encoding)) { + case 'UTF8': + case 'UTF-8': + return ['utf8']; + } + + return false; + } + + public static function mb_check_encoding($var = null, $encoding = null) + { + if (null === $encoding) { + if (null === $var) { + return false; + } + $encoding = self::$internalEncoding; + } + + if (!\is_array($var)) { + return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); + } + + foreach ($var as $key => $value) { + if (!self::mb_check_encoding($key, $encoding)) { + return false; + } + if (!self::mb_check_encoding($value, $encoding)) { + return false; + } + } + + return true; + } + + public static function mb_detect_encoding($str, $encodingList = null, $strict = false) + { + if (null === $encodingList) { + $encodingList = self::$encodingList; + } else { + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + } + + foreach ($encodingList as $enc) { + switch ($enc) { + case 'ASCII': + if (!preg_match('/[\x80-\xFF]/', $str)) { + return $enc; + } + break; + + case 'UTF8': + case 'UTF-8': + if (preg_match('//u', $str)) { + return 'UTF-8'; + } + break; + + default: + if (0 === strncmp($enc, 'ISO-8859-', 9)) { + return $enc; + } + } + } + + return false; + } + + public static function mb_detect_order($encodingList = null) + { + if (null === $encodingList) { + return self::$encodingList; + } + + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + + foreach ($encodingList as $enc) { + switch ($enc) { + default: + if (strncmp($enc, 'ISO-8859-', 9)) { + return false; + } + // no break + case 'ASCII': + case 'UTF8': + case 'UTF-8': + } + } + + self::$encodingList = $encodingList; + + return true; + } + + public static function mb_strlen($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strlen($s); + } + + return @iconv_strlen($s, $encoding); + } + + public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strpos($haystack, $needle, $offset); + } + + $needle = (string) $needle; + if ('' === $needle) { + if (80000 > \PHP_VERSION_ID) { + trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); + + return false; + } + + return 0; + } + + return iconv_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strrpos($haystack, $needle, $offset); + } + + if ($offset != (int) $offset) { + $offset = 0; + } elseif ($offset = (int) $offset) { + if ($offset < 0) { + if (0 > $offset += self::mb_strlen($needle)) { + $haystack = self::mb_substr($haystack, 0, $offset, $encoding); + } + $offset = 0; + } else { + $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); + } + } + + $pos = '' !== $needle || 80000 > \PHP_VERSION_ID + ? iconv_strrpos($haystack, $needle, $encoding) + : self::mb_strlen($haystack, $encoding); + + return false !== $pos ? $offset + $pos : false; + } + + public static function mb_str_split($string, $split_length = 1, $encoding = null) + { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { + trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); + + return null; + } + + if (1 > $split_length = (int) $split_length) { + if (80000 > \PHP_VERSION_ID) { + trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); + + return false; + } + + throw new \ValueError('Argument #2 ($length) must be greater than 0'); + } + + if (null === $encoding) { + $encoding = mb_internal_encoding(); + } + + if ('UTF-8' === $encoding = self::getEncoding($encoding)) { + $rx = '/('; + while (65535 < $split_length) { + $rx .= '.{65535}'; + $split_length -= 65535; + } + $rx .= '.{'.$split_length.'})/us'; + + return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + } + + $result = []; + $length = mb_strlen($string, $encoding); + + for ($i = 0; $i < $length; $i += $split_length) { + $result[] = mb_substr($string, $i, $split_length, $encoding); + } + + return $result; + } + + public static function mb_strtolower($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); + } + + public static function mb_strtoupper($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); + } + + public static function mb_substitute_character($c = null) + { + if (null === $c) { + return 'none'; + } + if (0 === strcasecmp($c, 'none')) { + return true; + } + if (80000 > \PHP_VERSION_ID) { + return false; + } + if (\is_int($c) || 'long' === $c || 'entity' === $c) { + return false; + } + + throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); + } + + public static function mb_substr($s, $start, $length = null, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return (string) substr($s, $start, null === $length ? 2147483647 : $length); + } + + if ($start < 0) { + $start = iconv_strlen($s, $encoding) + $start; + if ($start < 0) { + $start = 0; + } + } + + if (null === $length) { + $length = 2147483647; + } elseif ($length < 0) { + $length = iconv_strlen($s, $encoding) + $length - $start; + if ($length < 0) { + return ''; + } + } + + return (string) iconv_substr($s, $start, $length, $encoding); + } + + public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) + { + [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [ + self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), + self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding), + ]); + + return self::mb_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) + { + $pos = self::mb_stripos($haystack, $needle, 0, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + $pos = strrpos($haystack, $needle); + } else { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); + } + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) + { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = self::mb_strripos($haystack, $needle, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); + $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); + + $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); + $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); + + return self::mb_strrpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) + { + $pos = strpos($haystack, $needle); + if (false === $pos) { + return false; + } + if ($part) { + return substr($haystack, 0, $pos); + } + + return substr($haystack, $pos); + } + + public static function mb_get_info($type = 'all') + { + $info = [ + 'internal_encoding' => self::$internalEncoding, + 'http_output' => 'pass', + 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', + 'func_overload' => 0, + 'func_overload_list' => 'no overload', + 'mail_charset' => 'UTF-8', + 'mail_header_encoding' => 'BASE64', + 'mail_body_encoding' => 'BASE64', + 'illegal_chars' => 0, + 'encoding_translation' => 'Off', + 'language' => self::$language, + 'detect_order' => self::$encodingList, + 'substitute_character' => 'none', + 'strict_detection' => 'Off', + ]; + + if ('all' === $type) { + return $info; + } + if (isset($info[$type])) { + return $info[$type]; + } + + return false; + } + + public static function mb_http_input($type = '') + { + return false; + } + + public static function mb_http_output($encoding = null) + { + return null !== $encoding ? 'pass' === $encoding : 'pass'; + } + + public static function mb_strwidth($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + + if ('UTF-8' !== $encoding) { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); + + return ($wide << 1) + iconv_strlen($s, 'UTF-8'); + } + + public static function mb_substr_count($haystack, $needle, $encoding = null) + { + return substr_count($haystack, $needle); + } + + public static function mb_output_handler($contents, $status) + { + return $contents; + } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } + + public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string + { + if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { + throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); + } + + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given'); + } + + if (self::mb_strlen($pad_string, $encoding) <= 0) { + throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); + } + + $paddingRequired = $length - self::mb_strlen($string, $encoding); + + if ($paddingRequired < 1) { + return $string; + } + + switch ($pad_type) { + case \STR_PAD_LEFT: + return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; + case \STR_PAD_RIGHT: + return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); + default: + $leftPaddingLength = floor($paddingRequired / 2); + $rightPaddingLength = $paddingRequired - $leftPaddingLength; + + return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); + } + } + + public static function mb_ucfirst(string $string, ?string $encoding = null): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } + + $firstChar = mb_substr($string, 0, 1, $encoding); + $firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding); + + return $firstChar.mb_substr($string, 1, null, $encoding); + } + + public static function mb_lcfirst(string $string, ?string $encoding = null): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } + + $firstChar = mb_substr($string, 0, 1, $encoding); + $firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding); + + return $firstChar.mb_substr($string, 1, null, $encoding); + } + + private static function getSubpart($pos, $part, $haystack, $encoding) + { + if (false === $pos) { + return false; + } + if ($part) { + return self::mb_substr($haystack, 0, $pos, $encoding); + } + + return self::mb_substr($haystack, $pos, null, $encoding); + } + + private static function html_encoding_callback(array $m) + { + $i = 1; + $entities = ''; + $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); + + while (isset($m[$i])) { + if (0x80 > $m[$i]) { + $entities .= \chr($m[$i++]); + continue; + } + if (0xF0 <= $m[$i]) { + $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } elseif (0xE0 <= $m[$i]) { + $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } else { + $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; + } + + $entities .= '&#'.$c.';'; + } + + return $entities; + } + + private static function title_case(array $s) + { + return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { + return require $file; + } + + return false; + } + + private static function getEncoding($encoding) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + if ('UTF-8' === $encoding) { + return 'UTF-8'; + } + + $encoding = strtoupper($encoding); + + if ('8BIT' === $encoding || 'BINARY' === $encoding) { + return 'CP850'; + } + + if ('UTF8' === $encoding) { + return 'UTF-8'; + } + + return $encoding; + } + + public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__); + } + + public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__); + } + + public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__); + } + + private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given'); + } + + if ('' === $characters) { + return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding); + } + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $string)) { + $string = @iconv('UTF-8', 'UTF-8//IGNORE', $string); + } + if (null !== $characters && !preg_match('//u', $characters)) { + $characters = @iconv('UTF-8', 'UTF-8//IGNORE', $characters); + } + } else { + $string = iconv($encoding, 'UTF-8//IGNORE', $string); + + if (null !== $characters) { + $characters = iconv($encoding, 'UTF-8//IGNORE', $characters); + } + } + + if (null === $characters) { + $characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}"; + } else { + $characters = preg_quote($characters); + } + + $string = preg_replace(sprintf($regex, $characters), '', $string); + + if (null === $encoding) { + return $string; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $string); + } + + private static function assertEncoding(string $encoding, string $errorFormat): void + { + try { + $validEncoding = @self::mb_check_encoding('', $encoding); + } catch (\ValueError $e) { + throw new \ValueError(sprintf($errorFormat, $encoding)); + } + + // BC for PHP 7.3 and lower + if (!$validEncoding) { + throw new \ValueError(sprintf($errorFormat, $encoding)); + } + } +} diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/README.md b/upLoadImage/vendor/symfony/polyfill-mbstring/README.md new file mode 100644 index 0000000..478b40d --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/README.md @@ -0,0 +1,13 @@ +Symfony Polyfill / Mbstring +=========================== + +This component provides a partial, native PHP implementation for the +[Mbstring](https://php.net/mbstring) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php new file mode 100644 index 0000000..512bba0 --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php @@ -0,0 +1,119 @@ + 'i̇', + 'µ' => 'μ', + 'ſ' => 's', + 'ͅ' => 'ι', + 'ς' => 'σ', + 'ϐ' => 'β', + 'ϑ' => 'θ', + 'ϕ' => 'φ', + 'ϖ' => 'π', + 'ϰ' => 'κ', + 'ϱ' => 'ρ', + 'ϵ' => 'ε', + 'ẛ' => 'ṡ', + 'ι' => 'ι', + 'ß' => 'ss', + 'ʼn' => 'ʼn', + 'ǰ' => 'ǰ', + 'ΐ' => 'ΐ', + 'ΰ' => 'ΰ', + 'և' => 'եւ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'ẘ' => 'ẘ', + 'ẙ' => 'ẙ', + 'ẚ' => 'aʾ', + 'ẞ' => 'ss', + 'ὐ' => 'ὐ', + 'ὒ' => 'ὒ', + 'ὔ' => 'ὔ', + 'ὖ' => 'ὖ', + 'ᾀ' => 'ἀι', + 'ᾁ' => 'ἁι', + 'ᾂ' => 'ἂι', + 'ᾃ' => 'ἃι', + 'ᾄ' => 'ἄι', + 'ᾅ' => 'ἅι', + 'ᾆ' => 'ἆι', + 'ᾇ' => 'ἇι', + 'ᾈ' => 'ἀι', + 'ᾉ' => 'ἁι', + 'ᾊ' => 'ἂι', + 'ᾋ' => 'ἃι', + 'ᾌ' => 'ἄι', + 'ᾍ' => 'ἅι', + 'ᾎ' => 'ἆι', + 'ᾏ' => 'ἇι', + 'ᾐ' => 'ἠι', + 'ᾑ' => 'ἡι', + 'ᾒ' => 'ἢι', + 'ᾓ' => 'ἣι', + 'ᾔ' => 'ἤι', + 'ᾕ' => 'ἥι', + 'ᾖ' => 'ἦι', + 'ᾗ' => 'ἧι', + 'ᾘ' => 'ἠι', + 'ᾙ' => 'ἡι', + 'ᾚ' => 'ἢι', + 'ᾛ' => 'ἣι', + 'ᾜ' => 'ἤι', + 'ᾝ' => 'ἥι', + 'ᾞ' => 'ἦι', + 'ᾟ' => 'ἧι', + 'ᾠ' => 'ὠι', + 'ᾡ' => 'ὡι', + 'ᾢ' => 'ὢι', + 'ᾣ' => 'ὣι', + 'ᾤ' => 'ὤι', + 'ᾥ' => 'ὥι', + 'ᾦ' => 'ὦι', + 'ᾧ' => 'ὧι', + 'ᾨ' => 'ὠι', + 'ᾩ' => 'ὡι', + 'ᾪ' => 'ὢι', + 'ᾫ' => 'ὣι', + 'ᾬ' => 'ὤι', + 'ᾭ' => 'ὥι', + 'ᾮ' => 'ὦι', + 'ᾯ' => 'ὧι', + 'ᾲ' => 'ὰι', + 'ᾳ' => 'αι', + 'ᾴ' => 'άι', + 'ᾶ' => 'ᾶ', + 'ᾷ' => 'ᾶι', + 'ᾼ' => 'αι', + 'ῂ' => 'ὴι', + 'ῃ' => 'ηι', + 'ῄ' => 'ήι', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῆι', + 'ῌ' => 'ηι', + 'ῒ' => 'ῒ', + 'ῖ' => 'ῖ', + 'ῗ' => 'ῗ', + 'ῢ' => 'ῢ', + 'ῤ' => 'ῤ', + 'ῦ' => 'ῦ', + 'ῧ' => 'ῧ', + 'ῲ' => 'ὼι', + 'ῳ' => 'ωι', + 'ῴ' => 'ώι', + 'ῶ' => 'ῶ', + 'ῷ' => 'ῶι', + 'ῼ' => 'ωι', + 'ff' => 'ff', + 'fi' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'ſt' => 'st', + 'st' => 'st', + 'ﬓ' => 'մն', + 'ﬔ' => 'մե', + 'ﬕ' => 'մի', + 'ﬖ' => 'վն', + 'ﬗ' => 'մխ', +]; diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php new file mode 100644 index 0000000..fac60b0 --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -0,0 +1,1397 @@ + 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + 'À' => 'à', + 'Á' => 'á', + 'Â' => 'â', + 'Ã' => 'ã', + 'Ä' => 'ä', + 'Å' => 'å', + 'Æ' => 'æ', + 'Ç' => 'ç', + 'È' => 'è', + 'É' => 'é', + 'Ê' => 'ê', + 'Ë' => 'ë', + 'Ì' => 'ì', + 'Í' => 'í', + 'Î' => 'î', + 'Ï' => 'ï', + 'Ð' => 'ð', + 'Ñ' => 'ñ', + 'Ò' => 'ò', + 'Ó' => 'ó', + 'Ô' => 'ô', + 'Õ' => 'õ', + 'Ö' => 'ö', + 'Ø' => 'ø', + 'Ù' => 'ù', + 'Ú' => 'ú', + 'Û' => 'û', + 'Ü' => 'ü', + 'Ý' => 'ý', + 'Þ' => 'þ', + 'Ā' => 'ā', + 'Ă' => 'ă', + 'Ą' => 'ą', + 'Ć' => 'ć', + 'Ĉ' => 'ĉ', + 'Ċ' => 'ċ', + 'Č' => 'č', + 'Ď' => 'ď', + 'Đ' => 'đ', + 'Ē' => 'ē', + 'Ĕ' => 'ĕ', + 'Ė' => 'ė', + 'Ę' => 'ę', + 'Ě' => 'ě', + 'Ĝ' => 'ĝ', + 'Ğ' => 'ğ', + 'Ġ' => 'ġ', + 'Ģ' => 'ģ', + 'Ĥ' => 'ĥ', + 'Ħ' => 'ħ', + 'Ĩ' => 'ĩ', + 'Ī' => 'ī', + 'Ĭ' => 'ĭ', + 'Į' => 'į', + 'İ' => 'i̇', + 'IJ' => 'ij', + 'Ĵ' => 'ĵ', + 'Ķ' => 'ķ', + 'Ĺ' => 'ĺ', + 'Ļ' => 'ļ', + 'Ľ' => 'ľ', + 'Ŀ' => 'ŀ', + 'Ł' => 'ł', + 'Ń' => 'ń', + 'Ņ' => 'ņ', + 'Ň' => 'ň', + 'Ŋ' => 'ŋ', + 'Ō' => 'ō', + 'Ŏ' => 'ŏ', + 'Ő' => 'ő', + 'Œ' => 'œ', + 'Ŕ' => 'ŕ', + 'Ŗ' => 'ŗ', + 'Ř' => 'ř', + 'Ś' => 'ś', + 'Ŝ' => 'ŝ', + 'Ş' => 'ş', + 'Š' => 'š', + 'Ţ' => 'ţ', + 'Ť' => 'ť', + 'Ŧ' => 'ŧ', + 'Ũ' => 'ũ', + 'Ū' => 'ū', + 'Ŭ' => 'ŭ', + 'Ů' => 'ů', + 'Ű' => 'ű', + 'Ų' => 'ų', + 'Ŵ' => 'ŵ', + 'Ŷ' => 'ŷ', + 'Ÿ' => 'ÿ', + 'Ź' => 'ź', + 'Ż' => 'ż', + 'Ž' => 'ž', + 'Ɓ' => 'ɓ', + 'Ƃ' => 'ƃ', + 'Ƅ' => 'ƅ', + 'Ɔ' => 'ɔ', + 'Ƈ' => 'ƈ', + 'Ɖ' => 'ɖ', + 'Ɗ' => 'ɗ', + 'Ƌ' => 'ƌ', + 'Ǝ' => 'ǝ', + 'Ə' => 'ə', + 'Ɛ' => 'ɛ', + 'Ƒ' => 'ƒ', + 'Ɠ' => 'ɠ', + 'Ɣ' => 'ɣ', + 'Ɩ' => 'ɩ', + 'Ɨ' => 'ɨ', + 'Ƙ' => 'ƙ', + 'Ɯ' => 'ɯ', + 'Ɲ' => 'ɲ', + 'Ɵ' => 'ɵ', + 'Ơ' => 'ơ', + 'Ƣ' => 'ƣ', + 'Ƥ' => 'ƥ', + 'Ʀ' => 'ʀ', + 'Ƨ' => 'ƨ', + 'Ʃ' => 'ʃ', + 'Ƭ' => 'ƭ', + 'Ʈ' => 'ʈ', + 'Ư' => 'ư', + 'Ʊ' => 'ʊ', + 'Ʋ' => 'ʋ', + 'Ƴ' => 'ƴ', + 'Ƶ' => 'ƶ', + 'Ʒ' => 'ʒ', + 'Ƹ' => 'ƹ', + 'Ƽ' => 'ƽ', + 'DŽ' => 'dž', + 'Dž' => 'dž', + 'LJ' => 'lj', + 'Lj' => 'lj', + 'NJ' => 'nj', + 'Nj' => 'nj', + 'Ǎ' => 'ǎ', + 'Ǐ' => 'ǐ', + 'Ǒ' => 'ǒ', + 'Ǔ' => 'ǔ', + 'Ǖ' => 'ǖ', + 'Ǘ' => 'ǘ', + 'Ǚ' => 'ǚ', + 'Ǜ' => 'ǜ', + 'Ǟ' => 'ǟ', + 'Ǡ' => 'ǡ', + 'Ǣ' => 'ǣ', + 'Ǥ' => 'ǥ', + 'Ǧ' => 'ǧ', + 'Ǩ' => 'ǩ', + 'Ǫ' => 'ǫ', + 'Ǭ' => 'ǭ', + 'Ǯ' => 'ǯ', + 'DZ' => 'dz', + 'Dz' => 'dz', + 'Ǵ' => 'ǵ', + 'Ƕ' => 'ƕ', + 'Ƿ' => 'ƿ', + 'Ǹ' => 'ǹ', + 'Ǻ' => 'ǻ', + 'Ǽ' => 'ǽ', + 'Ǿ' => 'ǿ', + 'Ȁ' => 'ȁ', + 'Ȃ' => 'ȃ', + 'Ȅ' => 'ȅ', + 'Ȇ' => 'ȇ', + 'Ȉ' => 'ȉ', + 'Ȋ' => 'ȋ', + 'Ȍ' => 'ȍ', + 'Ȏ' => 'ȏ', + 'Ȑ' => 'ȑ', + 'Ȓ' => 'ȓ', + 'Ȕ' => 'ȕ', + 'Ȗ' => 'ȗ', + 'Ș' => 'ș', + 'Ț' => 'ț', + 'Ȝ' => 'ȝ', + 'Ȟ' => 'ȟ', + 'Ƞ' => 'ƞ', + 'Ȣ' => 'ȣ', + 'Ȥ' => 'ȥ', + 'Ȧ' => 'ȧ', + 'Ȩ' => 'ȩ', + 'Ȫ' => 'ȫ', + 'Ȭ' => 'ȭ', + 'Ȯ' => 'ȯ', + 'Ȱ' => 'ȱ', + 'Ȳ' => 'ȳ', + 'Ⱥ' => 'ⱥ', + 'Ȼ' => 'ȼ', + 'Ƚ' => 'ƚ', + 'Ⱦ' => 'ⱦ', + 'Ɂ' => 'ɂ', + 'Ƀ' => 'ƀ', + 'Ʉ' => 'ʉ', + 'Ʌ' => 'ʌ', + 'Ɇ' => 'ɇ', + 'Ɉ' => 'ɉ', + 'Ɋ' => 'ɋ', + 'Ɍ' => 'ɍ', + 'Ɏ' => 'ɏ', + 'Ͱ' => 'ͱ', + 'Ͳ' => 'ͳ', + 'Ͷ' => 'ͷ', + 'Ϳ' => 'ϳ', + 'Ά' => 'ά', + 'Έ' => 'έ', + 'Ή' => 'ή', + 'Ί' => 'ί', + 'Ό' => 'ό', + 'Ύ' => 'ύ', + 'Ώ' => 'ώ', + 'Α' => 'α', + 'Β' => 'β', + 'Γ' => 'γ', + 'Δ' => 'δ', + 'Ε' => 'ε', + 'Ζ' => 'ζ', + 'Η' => 'η', + 'Θ' => 'θ', + 'Ι' => 'ι', + 'Κ' => 'κ', + 'Λ' => 'λ', + 'Μ' => 'μ', + 'Ν' => 'ν', + 'Ξ' => 'ξ', + 'Ο' => 'ο', + 'Π' => 'π', + 'Ρ' => 'ρ', + 'Σ' => 'σ', + 'Τ' => 'τ', + 'Υ' => 'υ', + 'Φ' => 'φ', + 'Χ' => 'χ', + 'Ψ' => 'ψ', + 'Ω' => 'ω', + 'Ϊ' => 'ϊ', + 'Ϋ' => 'ϋ', + 'Ϗ' => 'ϗ', + 'Ϙ' => 'ϙ', + 'Ϛ' => 'ϛ', + 'Ϝ' => 'ϝ', + 'Ϟ' => 'ϟ', + 'Ϡ' => 'ϡ', + 'Ϣ' => 'ϣ', + 'Ϥ' => 'ϥ', + 'Ϧ' => 'ϧ', + 'Ϩ' => 'ϩ', + 'Ϫ' => 'ϫ', + 'Ϭ' => 'ϭ', + 'Ϯ' => 'ϯ', + 'ϴ' => 'θ', + 'Ϸ' => 'ϸ', + 'Ϲ' => 'ϲ', + 'Ϻ' => 'ϻ', + 'Ͻ' => 'ͻ', + 'Ͼ' => 'ͼ', + 'Ͽ' => 'ͽ', + 'Ѐ' => 'ѐ', + 'Ё' => 'ё', + 'Ђ' => 'ђ', + 'Ѓ' => 'ѓ', + 'Є' => 'є', + 'Ѕ' => 'ѕ', + 'І' => 'і', + 'Ї' => 'ї', + 'Ј' => 'ј', + 'Љ' => 'љ', + 'Њ' => 'њ', + 'Ћ' => 'ћ', + 'Ќ' => 'ќ', + 'Ѝ' => 'ѝ', + 'Ў' => 'ў', + 'Џ' => 'џ', + 'А' => 'а', + 'Б' => 'б', + 'В' => 'в', + 'Г' => 'г', + 'Д' => 'д', + 'Е' => 'е', + 'Ж' => 'ж', + 'З' => 'з', + 'И' => 'и', + 'Й' => 'й', + 'К' => 'к', + 'Л' => 'л', + 'М' => 'м', + 'Н' => 'н', + 'О' => 'о', + 'П' => 'п', + 'Р' => 'р', + 'С' => 'с', + 'Т' => 'т', + 'У' => 'у', + 'Ф' => 'ф', + 'Х' => 'х', + 'Ц' => 'ц', + 'Ч' => 'ч', + 'Ш' => 'ш', + 'Щ' => 'щ', + 'Ъ' => 'ъ', + 'Ы' => 'ы', + 'Ь' => 'ь', + 'Э' => 'э', + 'Ю' => 'ю', + 'Я' => 'я', + 'Ѡ' => 'ѡ', + 'Ѣ' => 'ѣ', + 'Ѥ' => 'ѥ', + 'Ѧ' => 'ѧ', + 'Ѩ' => 'ѩ', + 'Ѫ' => 'ѫ', + 'Ѭ' => 'ѭ', + 'Ѯ' => 'ѯ', + 'Ѱ' => 'ѱ', + 'Ѳ' => 'ѳ', + 'Ѵ' => 'ѵ', + 'Ѷ' => 'ѷ', + 'Ѹ' => 'ѹ', + 'Ѻ' => 'ѻ', + 'Ѽ' => 'ѽ', + 'Ѿ' => 'ѿ', + 'Ҁ' => 'ҁ', + 'Ҋ' => 'ҋ', + 'Ҍ' => 'ҍ', + 'Ҏ' => 'ҏ', + 'Ґ' => 'ґ', + 'Ғ' => 'ғ', + 'Ҕ' => 'ҕ', + 'Җ' => 'җ', + 'Ҙ' => 'ҙ', + 'Қ' => 'қ', + 'Ҝ' => 'ҝ', + 'Ҟ' => 'ҟ', + 'Ҡ' => 'ҡ', + 'Ң' => 'ң', + 'Ҥ' => 'ҥ', + 'Ҧ' => 'ҧ', + 'Ҩ' => 'ҩ', + 'Ҫ' => 'ҫ', + 'Ҭ' => 'ҭ', + 'Ү' => 'ү', + 'Ұ' => 'ұ', + 'Ҳ' => 'ҳ', + 'Ҵ' => 'ҵ', + 'Ҷ' => 'ҷ', + 'Ҹ' => 'ҹ', + 'Һ' => 'һ', + 'Ҽ' => 'ҽ', + 'Ҿ' => 'ҿ', + 'Ӏ' => 'ӏ', + 'Ӂ' => 'ӂ', + 'Ӄ' => 'ӄ', + 'Ӆ' => 'ӆ', + 'Ӈ' => 'ӈ', + 'Ӊ' => 'ӊ', + 'Ӌ' => 'ӌ', + 'Ӎ' => 'ӎ', + 'Ӑ' => 'ӑ', + 'Ӓ' => 'ӓ', + 'Ӕ' => 'ӕ', + 'Ӗ' => 'ӗ', + 'Ә' => 'ә', + 'Ӛ' => 'ӛ', + 'Ӝ' => 'ӝ', + 'Ӟ' => 'ӟ', + 'Ӡ' => 'ӡ', + 'Ӣ' => 'ӣ', + 'Ӥ' => 'ӥ', + 'Ӧ' => 'ӧ', + 'Ө' => 'ө', + 'Ӫ' => 'ӫ', + 'Ӭ' => 'ӭ', + 'Ӯ' => 'ӯ', + 'Ӱ' => 'ӱ', + 'Ӳ' => 'ӳ', + 'Ӵ' => 'ӵ', + 'Ӷ' => 'ӷ', + 'Ӹ' => 'ӹ', + 'Ӻ' => 'ӻ', + 'Ӽ' => 'ӽ', + 'Ӿ' => 'ӿ', + 'Ԁ' => 'ԁ', + 'Ԃ' => 'ԃ', + 'Ԅ' => 'ԅ', + 'Ԇ' => 'ԇ', + 'Ԉ' => 'ԉ', + 'Ԋ' => 'ԋ', + 'Ԍ' => 'ԍ', + 'Ԏ' => 'ԏ', + 'Ԑ' => 'ԑ', + 'Ԓ' => 'ԓ', + 'Ԕ' => 'ԕ', + 'Ԗ' => 'ԗ', + 'Ԙ' => 'ԙ', + 'Ԛ' => 'ԛ', + 'Ԝ' => 'ԝ', + 'Ԟ' => 'ԟ', + 'Ԡ' => 'ԡ', + 'Ԣ' => 'ԣ', + 'Ԥ' => 'ԥ', + 'Ԧ' => 'ԧ', + 'Ԩ' => 'ԩ', + 'Ԫ' => 'ԫ', + 'Ԭ' => 'ԭ', + 'Ԯ' => 'ԯ', + 'Ա' => 'ա', + 'Բ' => 'բ', + 'Գ' => 'գ', + 'Դ' => 'դ', + 'Ե' => 'ե', + 'Զ' => 'զ', + 'Է' => 'է', + 'Ը' => 'ը', + 'Թ' => 'թ', + 'Ժ' => 'ժ', + 'Ի' => 'ի', + 'Լ' => 'լ', + 'Խ' => 'խ', + 'Ծ' => 'ծ', + 'Կ' => 'կ', + 'Հ' => 'հ', + 'Ձ' => 'ձ', + 'Ղ' => 'ղ', + 'Ճ' => 'ճ', + 'Մ' => 'մ', + 'Յ' => 'յ', + 'Ն' => 'ն', + 'Շ' => 'շ', + 'Ո' => 'ո', + 'Չ' => 'չ', + 'Պ' => 'պ', + 'Ջ' => 'ջ', + 'Ռ' => 'ռ', + 'Ս' => 'ս', + 'Վ' => 'վ', + 'Տ' => 'տ', + 'Ր' => 'ր', + 'Ց' => 'ց', + 'Ւ' => 'ւ', + 'Փ' => 'փ', + 'Ք' => 'ք', + 'Օ' => 'օ', + 'Ֆ' => 'ֆ', + 'Ⴀ' => 'ⴀ', + 'Ⴁ' => 'ⴁ', + 'Ⴂ' => 'ⴂ', + 'Ⴃ' => 'ⴃ', + 'Ⴄ' => 'ⴄ', + 'Ⴅ' => 'ⴅ', + 'Ⴆ' => 'ⴆ', + 'Ⴇ' => 'ⴇ', + 'Ⴈ' => 'ⴈ', + 'Ⴉ' => 'ⴉ', + 'Ⴊ' => 'ⴊ', + 'Ⴋ' => 'ⴋ', + 'Ⴌ' => 'ⴌ', + 'Ⴍ' => 'ⴍ', + 'Ⴎ' => 'ⴎ', + 'Ⴏ' => 'ⴏ', + 'Ⴐ' => 'ⴐ', + 'Ⴑ' => 'ⴑ', + 'Ⴒ' => 'ⴒ', + 'Ⴓ' => 'ⴓ', + 'Ⴔ' => 'ⴔ', + 'Ⴕ' => 'ⴕ', + 'Ⴖ' => 'ⴖ', + 'Ⴗ' => 'ⴗ', + 'Ⴘ' => 'ⴘ', + 'Ⴙ' => 'ⴙ', + 'Ⴚ' => 'ⴚ', + 'Ⴛ' => 'ⴛ', + 'Ⴜ' => 'ⴜ', + 'Ⴝ' => 'ⴝ', + 'Ⴞ' => 'ⴞ', + 'Ⴟ' => 'ⴟ', + 'Ⴠ' => 'ⴠ', + 'Ⴡ' => 'ⴡ', + 'Ⴢ' => 'ⴢ', + 'Ⴣ' => 'ⴣ', + 'Ⴤ' => 'ⴤ', + 'Ⴥ' => 'ⴥ', + 'Ⴧ' => 'ⴧ', + 'Ⴭ' => 'ⴭ', + 'Ꭰ' => 'ꭰ', + 'Ꭱ' => 'ꭱ', + 'Ꭲ' => 'ꭲ', + 'Ꭳ' => 'ꭳ', + 'Ꭴ' => 'ꭴ', + 'Ꭵ' => 'ꭵ', + 'Ꭶ' => 'ꭶ', + 'Ꭷ' => 'ꭷ', + 'Ꭸ' => 'ꭸ', + 'Ꭹ' => 'ꭹ', + 'Ꭺ' => 'ꭺ', + 'Ꭻ' => 'ꭻ', + 'Ꭼ' => 'ꭼ', + 'Ꭽ' => 'ꭽ', + 'Ꭾ' => 'ꭾ', + 'Ꭿ' => 'ꭿ', + 'Ꮀ' => 'ꮀ', + 'Ꮁ' => 'ꮁ', + 'Ꮂ' => 'ꮂ', + 'Ꮃ' => 'ꮃ', + 'Ꮄ' => 'ꮄ', + 'Ꮅ' => 'ꮅ', + 'Ꮆ' => 'ꮆ', + 'Ꮇ' => 'ꮇ', + 'Ꮈ' => 'ꮈ', + 'Ꮉ' => 'ꮉ', + 'Ꮊ' => 'ꮊ', + 'Ꮋ' => 'ꮋ', + 'Ꮌ' => 'ꮌ', + 'Ꮍ' => 'ꮍ', + 'Ꮎ' => 'ꮎ', + 'Ꮏ' => 'ꮏ', + 'Ꮐ' => 'ꮐ', + 'Ꮑ' => 'ꮑ', + 'Ꮒ' => 'ꮒ', + 'Ꮓ' => 'ꮓ', + 'Ꮔ' => 'ꮔ', + 'Ꮕ' => 'ꮕ', + 'Ꮖ' => 'ꮖ', + 'Ꮗ' => 'ꮗ', + 'Ꮘ' => 'ꮘ', + 'Ꮙ' => 'ꮙ', + 'Ꮚ' => 'ꮚ', + 'Ꮛ' => 'ꮛ', + 'Ꮜ' => 'ꮜ', + 'Ꮝ' => 'ꮝ', + 'Ꮞ' => 'ꮞ', + 'Ꮟ' => 'ꮟ', + 'Ꮠ' => 'ꮠ', + 'Ꮡ' => 'ꮡ', + 'Ꮢ' => 'ꮢ', + 'Ꮣ' => 'ꮣ', + 'Ꮤ' => 'ꮤ', + 'Ꮥ' => 'ꮥ', + 'Ꮦ' => 'ꮦ', + 'Ꮧ' => 'ꮧ', + 'Ꮨ' => 'ꮨ', + 'Ꮩ' => 'ꮩ', + 'Ꮪ' => 'ꮪ', + 'Ꮫ' => 'ꮫ', + 'Ꮬ' => 'ꮬ', + 'Ꮭ' => 'ꮭ', + 'Ꮮ' => 'ꮮ', + 'Ꮯ' => 'ꮯ', + 'Ꮰ' => 'ꮰ', + 'Ꮱ' => 'ꮱ', + 'Ꮲ' => 'ꮲ', + 'Ꮳ' => 'ꮳ', + 'Ꮴ' => 'ꮴ', + 'Ꮵ' => 'ꮵ', + 'Ꮶ' => 'ꮶ', + 'Ꮷ' => 'ꮷ', + 'Ꮸ' => 'ꮸ', + 'Ꮹ' => 'ꮹ', + 'Ꮺ' => 'ꮺ', + 'Ꮻ' => 'ꮻ', + 'Ꮼ' => 'ꮼ', + 'Ꮽ' => 'ꮽ', + 'Ꮾ' => 'ꮾ', + 'Ꮿ' => 'ꮿ', + 'Ᏸ' => 'ᏸ', + 'Ᏹ' => 'ᏹ', + 'Ᏺ' => 'ᏺ', + 'Ᏻ' => 'ᏻ', + 'Ᏼ' => 'ᏼ', + 'Ᏽ' => 'ᏽ', + 'Ა' => 'ა', + 'Ბ' => 'ბ', + 'Გ' => 'გ', + 'Დ' => 'დ', + 'Ე' => 'ე', + 'Ვ' => 'ვ', + 'Ზ' => 'ზ', + 'Თ' => 'თ', + 'Ი' => 'ი', + 'Კ' => 'კ', + 'Ლ' => 'ლ', + 'Მ' => 'მ', + 'Ნ' => 'ნ', + 'Ო' => 'ო', + 'Პ' => 'პ', + 'Ჟ' => 'ჟ', + 'Რ' => 'რ', + 'Ს' => 'ს', + 'Ტ' => 'ტ', + 'Უ' => 'უ', + 'Ფ' => 'ფ', + 'Ქ' => 'ქ', + 'Ღ' => 'ღ', + 'Ყ' => 'ყ', + 'Შ' => 'შ', + 'Ჩ' => 'ჩ', + 'Ც' => 'ც', + 'Ძ' => 'ძ', + 'Წ' => 'წ', + 'Ჭ' => 'ჭ', + 'Ხ' => 'ხ', + 'Ჯ' => 'ჯ', + 'Ჰ' => 'ჰ', + 'Ჱ' => 'ჱ', + 'Ჲ' => 'ჲ', + 'Ჳ' => 'ჳ', + 'Ჴ' => 'ჴ', + 'Ჵ' => 'ჵ', + 'Ჶ' => 'ჶ', + 'Ჷ' => 'ჷ', + 'Ჸ' => 'ჸ', + 'Ჹ' => 'ჹ', + 'Ჺ' => 'ჺ', + 'Ჽ' => 'ჽ', + 'Ჾ' => 'ჾ', + 'Ჿ' => 'ჿ', + 'Ḁ' => 'ḁ', + 'Ḃ' => 'ḃ', + 'Ḅ' => 'ḅ', + 'Ḇ' => 'ḇ', + 'Ḉ' => 'ḉ', + 'Ḋ' => 'ḋ', + 'Ḍ' => 'ḍ', + 'Ḏ' => 'ḏ', + 'Ḑ' => 'ḑ', + 'Ḓ' => 'ḓ', + 'Ḕ' => 'ḕ', + 'Ḗ' => 'ḗ', + 'Ḙ' => 'ḙ', + 'Ḛ' => 'ḛ', + 'Ḝ' => 'ḝ', + 'Ḟ' => 'ḟ', + 'Ḡ' => 'ḡ', + 'Ḣ' => 'ḣ', + 'Ḥ' => 'ḥ', + 'Ḧ' => 'ḧ', + 'Ḩ' => 'ḩ', + 'Ḫ' => 'ḫ', + 'Ḭ' => 'ḭ', + 'Ḯ' => 'ḯ', + 'Ḱ' => 'ḱ', + 'Ḳ' => 'ḳ', + 'Ḵ' => 'ḵ', + 'Ḷ' => 'ḷ', + 'Ḹ' => 'ḹ', + 'Ḻ' => 'ḻ', + 'Ḽ' => 'ḽ', + 'Ḿ' => 'ḿ', + 'Ṁ' => 'ṁ', + 'Ṃ' => 'ṃ', + 'Ṅ' => 'ṅ', + 'Ṇ' => 'ṇ', + 'Ṉ' => 'ṉ', + 'Ṋ' => 'ṋ', + 'Ṍ' => 'ṍ', + 'Ṏ' => 'ṏ', + 'Ṑ' => 'ṑ', + 'Ṓ' => 'ṓ', + 'Ṕ' => 'ṕ', + 'Ṗ' => 'ṗ', + 'Ṙ' => 'ṙ', + 'Ṛ' => 'ṛ', + 'Ṝ' => 'ṝ', + 'Ṟ' => 'ṟ', + 'Ṡ' => 'ṡ', + 'Ṣ' => 'ṣ', + 'Ṥ' => 'ṥ', + 'Ṧ' => 'ṧ', + 'Ṩ' => 'ṩ', + 'Ṫ' => 'ṫ', + 'Ṭ' => 'ṭ', + 'Ṯ' => 'ṯ', + 'Ṱ' => 'ṱ', + 'Ṳ' => 'ṳ', + 'Ṵ' => 'ṵ', + 'Ṷ' => 'ṷ', + 'Ṹ' => 'ṹ', + 'Ṻ' => 'ṻ', + 'Ṽ' => 'ṽ', + 'Ṿ' => 'ṿ', + 'Ẁ' => 'ẁ', + 'Ẃ' => 'ẃ', + 'Ẅ' => 'ẅ', + 'Ẇ' => 'ẇ', + 'Ẉ' => 'ẉ', + 'Ẋ' => 'ẋ', + 'Ẍ' => 'ẍ', + 'Ẏ' => 'ẏ', + 'Ẑ' => 'ẑ', + 'Ẓ' => 'ẓ', + 'Ẕ' => 'ẕ', + 'ẞ' => 'ß', + 'Ạ' => 'ạ', + 'Ả' => 'ả', + 'Ấ' => 'ấ', + 'Ầ' => 'ầ', + 'Ẩ' => 'ẩ', + 'Ẫ' => 'ẫ', + 'Ậ' => 'ậ', + 'Ắ' => 'ắ', + 'Ằ' => 'ằ', + 'Ẳ' => 'ẳ', + 'Ẵ' => 'ẵ', + 'Ặ' => 'ặ', + 'Ẹ' => 'ẹ', + 'Ẻ' => 'ẻ', + 'Ẽ' => 'ẽ', + 'Ế' => 'ế', + 'Ề' => 'ề', + 'Ể' => 'ể', + 'Ễ' => 'ễ', + 'Ệ' => 'ệ', + 'Ỉ' => 'ỉ', + 'Ị' => 'ị', + 'Ọ' => 'ọ', + 'Ỏ' => 'ỏ', + 'Ố' => 'ố', + 'Ồ' => 'ồ', + 'Ổ' => 'ổ', + 'Ỗ' => 'ỗ', + 'Ộ' => 'ộ', + 'Ớ' => 'ớ', + 'Ờ' => 'ờ', + 'Ở' => 'ở', + 'Ỡ' => 'ỡ', + 'Ợ' => 'ợ', + 'Ụ' => 'ụ', + 'Ủ' => 'ủ', + 'Ứ' => 'ứ', + 'Ừ' => 'ừ', + 'Ử' => 'ử', + 'Ữ' => 'ữ', + 'Ự' => 'ự', + 'Ỳ' => 'ỳ', + 'Ỵ' => 'ỵ', + 'Ỷ' => 'ỷ', + 'Ỹ' => 'ỹ', + 'Ỻ' => 'ỻ', + 'Ỽ' => 'ỽ', + 'Ỿ' => 'ỿ', + 'Ἀ' => 'ἀ', + 'Ἁ' => 'ἁ', + 'Ἂ' => 'ἂ', + 'Ἃ' => 'ἃ', + 'Ἄ' => 'ἄ', + 'Ἅ' => 'ἅ', + 'Ἆ' => 'ἆ', + 'Ἇ' => 'ἇ', + 'Ἐ' => 'ἐ', + 'Ἑ' => 'ἑ', + 'Ἒ' => 'ἒ', + 'Ἓ' => 'ἓ', + 'Ἔ' => 'ἔ', + 'Ἕ' => 'ἕ', + 'Ἠ' => 'ἠ', + 'Ἡ' => 'ἡ', + 'Ἢ' => 'ἢ', + 'Ἣ' => 'ἣ', + 'Ἤ' => 'ἤ', + 'Ἥ' => 'ἥ', + 'Ἦ' => 'ἦ', + 'Ἧ' => 'ἧ', + 'Ἰ' => 'ἰ', + 'Ἱ' => 'ἱ', + 'Ἲ' => 'ἲ', + 'Ἳ' => 'ἳ', + 'Ἴ' => 'ἴ', + 'Ἵ' => 'ἵ', + 'Ἶ' => 'ἶ', + 'Ἷ' => 'ἷ', + 'Ὀ' => 'ὀ', + 'Ὁ' => 'ὁ', + 'Ὂ' => 'ὂ', + 'Ὃ' => 'ὃ', + 'Ὄ' => 'ὄ', + 'Ὅ' => 'ὅ', + 'Ὑ' => 'ὑ', + 'Ὓ' => 'ὓ', + 'Ὕ' => 'ὕ', + 'Ὗ' => 'ὗ', + 'Ὠ' => 'ὠ', + 'Ὡ' => 'ὡ', + 'Ὢ' => 'ὢ', + 'Ὣ' => 'ὣ', + 'Ὤ' => 'ὤ', + 'Ὥ' => 'ὥ', + 'Ὦ' => 'ὦ', + 'Ὧ' => 'ὧ', + 'ᾈ' => 'ᾀ', + 'ᾉ' => 'ᾁ', + 'ᾊ' => 'ᾂ', + 'ᾋ' => 'ᾃ', + 'ᾌ' => 'ᾄ', + 'ᾍ' => 'ᾅ', + 'ᾎ' => 'ᾆ', + 'ᾏ' => 'ᾇ', + 'ᾘ' => 'ᾐ', + 'ᾙ' => 'ᾑ', + 'ᾚ' => 'ᾒ', + 'ᾛ' => 'ᾓ', + 'ᾜ' => 'ᾔ', + 'ᾝ' => 'ᾕ', + 'ᾞ' => 'ᾖ', + 'ᾟ' => 'ᾗ', + 'ᾨ' => 'ᾠ', + 'ᾩ' => 'ᾡ', + 'ᾪ' => 'ᾢ', + 'ᾫ' => 'ᾣ', + 'ᾬ' => 'ᾤ', + 'ᾭ' => 'ᾥ', + 'ᾮ' => 'ᾦ', + 'ᾯ' => 'ᾧ', + 'Ᾰ' => 'ᾰ', + 'Ᾱ' => 'ᾱ', + 'Ὰ' => 'ὰ', + 'Ά' => 'ά', + 'ᾼ' => 'ᾳ', + 'Ὲ' => 'ὲ', + 'Έ' => 'έ', + 'Ὴ' => 'ὴ', + 'Ή' => 'ή', + 'ῌ' => 'ῃ', + 'Ῐ' => 'ῐ', + 'Ῑ' => 'ῑ', + 'Ὶ' => 'ὶ', + 'Ί' => 'ί', + 'Ῠ' => 'ῠ', + 'Ῡ' => 'ῡ', + 'Ὺ' => 'ὺ', + 'Ύ' => 'ύ', + 'Ῥ' => 'ῥ', + 'Ὸ' => 'ὸ', + 'Ό' => 'ό', + 'Ὼ' => 'ὼ', + 'Ώ' => 'ώ', + 'ῼ' => 'ῳ', + 'Ω' => 'ω', + 'K' => 'k', + 'Å' => 'å', + 'Ⅎ' => 'ⅎ', + 'Ⅰ' => 'ⅰ', + 'Ⅱ' => 'ⅱ', + 'Ⅲ' => 'ⅲ', + 'Ⅳ' => 'ⅳ', + 'Ⅴ' => 'ⅴ', + 'Ⅵ' => 'ⅵ', + 'Ⅶ' => 'ⅶ', + 'Ⅷ' => 'ⅷ', + 'Ⅸ' => 'ⅸ', + 'Ⅹ' => 'ⅹ', + 'Ⅺ' => 'ⅺ', + 'Ⅻ' => 'ⅻ', + 'Ⅼ' => 'ⅼ', + 'Ⅽ' => 'ⅽ', + 'Ⅾ' => 'ⅾ', + 'Ⅿ' => 'ⅿ', + 'Ↄ' => 'ↄ', + 'Ⓐ' => 'ⓐ', + 'Ⓑ' => 'ⓑ', + 'Ⓒ' => 'ⓒ', + 'Ⓓ' => 'ⓓ', + 'Ⓔ' => 'ⓔ', + 'Ⓕ' => 'ⓕ', + 'Ⓖ' => 'ⓖ', + 'Ⓗ' => 'ⓗ', + 'Ⓘ' => 'ⓘ', + 'Ⓙ' => 'ⓙ', + 'Ⓚ' => 'ⓚ', + 'Ⓛ' => 'ⓛ', + 'Ⓜ' => 'ⓜ', + 'Ⓝ' => 'ⓝ', + 'Ⓞ' => 'ⓞ', + 'Ⓟ' => 'ⓟ', + 'Ⓠ' => 'ⓠ', + 'Ⓡ' => 'ⓡ', + 'Ⓢ' => 'ⓢ', + 'Ⓣ' => 'ⓣ', + 'Ⓤ' => 'ⓤ', + 'Ⓥ' => 'ⓥ', + 'Ⓦ' => 'ⓦ', + 'Ⓧ' => 'ⓧ', + 'Ⓨ' => 'ⓨ', + 'Ⓩ' => 'ⓩ', + 'Ⰰ' => 'ⰰ', + 'Ⰱ' => 'ⰱ', + 'Ⰲ' => 'ⰲ', + 'Ⰳ' => 'ⰳ', + 'Ⰴ' => 'ⰴ', + 'Ⰵ' => 'ⰵ', + 'Ⰶ' => 'ⰶ', + 'Ⰷ' => 'ⰷ', + 'Ⰸ' => 'ⰸ', + 'Ⰹ' => 'ⰹ', + 'Ⰺ' => 'ⰺ', + 'Ⰻ' => 'ⰻ', + 'Ⰼ' => 'ⰼ', + 'Ⰽ' => 'ⰽ', + 'Ⰾ' => 'ⰾ', + 'Ⰿ' => 'ⰿ', + 'Ⱀ' => 'ⱀ', + 'Ⱁ' => 'ⱁ', + 'Ⱂ' => 'ⱂ', + 'Ⱃ' => 'ⱃ', + 'Ⱄ' => 'ⱄ', + 'Ⱅ' => 'ⱅ', + 'Ⱆ' => 'ⱆ', + 'Ⱇ' => 'ⱇ', + 'Ⱈ' => 'ⱈ', + 'Ⱉ' => 'ⱉ', + 'Ⱊ' => 'ⱊ', + 'Ⱋ' => 'ⱋ', + 'Ⱌ' => 'ⱌ', + 'Ⱍ' => 'ⱍ', + 'Ⱎ' => 'ⱎ', + 'Ⱏ' => 'ⱏ', + 'Ⱐ' => 'ⱐ', + 'Ⱑ' => 'ⱑ', + 'Ⱒ' => 'ⱒ', + 'Ⱓ' => 'ⱓ', + 'Ⱔ' => 'ⱔ', + 'Ⱕ' => 'ⱕ', + 'Ⱖ' => 'ⱖ', + 'Ⱗ' => 'ⱗ', + 'Ⱘ' => 'ⱘ', + 'Ⱙ' => 'ⱙ', + 'Ⱚ' => 'ⱚ', + 'Ⱛ' => 'ⱛ', + 'Ⱜ' => 'ⱜ', + 'Ⱝ' => 'ⱝ', + 'Ⱞ' => 'ⱞ', + 'Ⱡ' => 'ⱡ', + 'Ɫ' => 'ɫ', + 'Ᵽ' => 'ᵽ', + 'Ɽ' => 'ɽ', + 'Ⱨ' => 'ⱨ', + 'Ⱪ' => 'ⱪ', + 'Ⱬ' => 'ⱬ', + 'Ɑ' => 'ɑ', + 'Ɱ' => 'ɱ', + 'Ɐ' => 'ɐ', + 'Ɒ' => 'ɒ', + 'Ⱳ' => 'ⱳ', + 'Ⱶ' => 'ⱶ', + 'Ȿ' => 'ȿ', + 'Ɀ' => 'ɀ', + 'Ⲁ' => 'ⲁ', + 'Ⲃ' => 'ⲃ', + 'Ⲅ' => 'ⲅ', + 'Ⲇ' => 'ⲇ', + 'Ⲉ' => 'ⲉ', + 'Ⲋ' => 'ⲋ', + 'Ⲍ' => 'ⲍ', + 'Ⲏ' => 'ⲏ', + 'Ⲑ' => 'ⲑ', + 'Ⲓ' => 'ⲓ', + 'Ⲕ' => 'ⲕ', + 'Ⲗ' => 'ⲗ', + 'Ⲙ' => 'ⲙ', + 'Ⲛ' => 'ⲛ', + 'Ⲝ' => 'ⲝ', + 'Ⲟ' => 'ⲟ', + 'Ⲡ' => 'ⲡ', + 'Ⲣ' => 'ⲣ', + 'Ⲥ' => 'ⲥ', + 'Ⲧ' => 'ⲧ', + 'Ⲩ' => 'ⲩ', + 'Ⲫ' => 'ⲫ', + 'Ⲭ' => 'ⲭ', + 'Ⲯ' => 'ⲯ', + 'Ⲱ' => 'ⲱ', + 'Ⲳ' => 'ⲳ', + 'Ⲵ' => 'ⲵ', + 'Ⲷ' => 'ⲷ', + 'Ⲹ' => 'ⲹ', + 'Ⲻ' => 'ⲻ', + 'Ⲽ' => 'ⲽ', + 'Ⲿ' => 'ⲿ', + 'Ⳁ' => 'ⳁ', + 'Ⳃ' => 'ⳃ', + 'Ⳅ' => 'ⳅ', + 'Ⳇ' => 'ⳇ', + 'Ⳉ' => 'ⳉ', + 'Ⳋ' => 'ⳋ', + 'Ⳍ' => 'ⳍ', + 'Ⳏ' => 'ⳏ', + 'Ⳑ' => 'ⳑ', + 'Ⳓ' => 'ⳓ', + 'Ⳕ' => 'ⳕ', + 'Ⳗ' => 'ⳗ', + 'Ⳙ' => 'ⳙ', + 'Ⳛ' => 'ⳛ', + 'Ⳝ' => 'ⳝ', + 'Ⳟ' => 'ⳟ', + 'Ⳡ' => 'ⳡ', + 'Ⳣ' => 'ⳣ', + 'Ⳬ' => 'ⳬ', + 'Ⳮ' => 'ⳮ', + 'Ⳳ' => 'ⳳ', + 'Ꙁ' => 'ꙁ', + 'Ꙃ' => 'ꙃ', + 'Ꙅ' => 'ꙅ', + 'Ꙇ' => 'ꙇ', + 'Ꙉ' => 'ꙉ', + 'Ꙋ' => 'ꙋ', + 'Ꙍ' => 'ꙍ', + 'Ꙏ' => 'ꙏ', + 'Ꙑ' => 'ꙑ', + 'Ꙓ' => 'ꙓ', + 'Ꙕ' => 'ꙕ', + 'Ꙗ' => 'ꙗ', + 'Ꙙ' => 'ꙙ', + 'Ꙛ' => 'ꙛ', + 'Ꙝ' => 'ꙝ', + 'Ꙟ' => 'ꙟ', + 'Ꙡ' => 'ꙡ', + 'Ꙣ' => 'ꙣ', + 'Ꙥ' => 'ꙥ', + 'Ꙧ' => 'ꙧ', + 'Ꙩ' => 'ꙩ', + 'Ꙫ' => 'ꙫ', + 'Ꙭ' => 'ꙭ', + 'Ꚁ' => 'ꚁ', + 'Ꚃ' => 'ꚃ', + 'Ꚅ' => 'ꚅ', + 'Ꚇ' => 'ꚇ', + 'Ꚉ' => 'ꚉ', + 'Ꚋ' => 'ꚋ', + 'Ꚍ' => 'ꚍ', + 'Ꚏ' => 'ꚏ', + 'Ꚑ' => 'ꚑ', + 'Ꚓ' => 'ꚓ', + 'Ꚕ' => 'ꚕ', + 'Ꚗ' => 'ꚗ', + 'Ꚙ' => 'ꚙ', + 'Ꚛ' => 'ꚛ', + 'Ꜣ' => 'ꜣ', + 'Ꜥ' => 'ꜥ', + 'Ꜧ' => 'ꜧ', + 'Ꜩ' => 'ꜩ', + 'Ꜫ' => 'ꜫ', + 'Ꜭ' => 'ꜭ', + 'Ꜯ' => 'ꜯ', + 'Ꜳ' => 'ꜳ', + 'Ꜵ' => 'ꜵ', + 'Ꜷ' => 'ꜷ', + 'Ꜹ' => 'ꜹ', + 'Ꜻ' => 'ꜻ', + 'Ꜽ' => 'ꜽ', + 'Ꜿ' => 'ꜿ', + 'Ꝁ' => 'ꝁ', + 'Ꝃ' => 'ꝃ', + 'Ꝅ' => 'ꝅ', + 'Ꝇ' => 'ꝇ', + 'Ꝉ' => 'ꝉ', + 'Ꝋ' => 'ꝋ', + 'Ꝍ' => 'ꝍ', + 'Ꝏ' => 'ꝏ', + 'Ꝑ' => 'ꝑ', + 'Ꝓ' => 'ꝓ', + 'Ꝕ' => 'ꝕ', + 'Ꝗ' => 'ꝗ', + 'Ꝙ' => 'ꝙ', + 'Ꝛ' => 'ꝛ', + 'Ꝝ' => 'ꝝ', + 'Ꝟ' => 'ꝟ', + 'Ꝡ' => 'ꝡ', + 'Ꝣ' => 'ꝣ', + 'Ꝥ' => 'ꝥ', + 'Ꝧ' => 'ꝧ', + 'Ꝩ' => 'ꝩ', + 'Ꝫ' => 'ꝫ', + 'Ꝭ' => 'ꝭ', + 'Ꝯ' => 'ꝯ', + 'Ꝺ' => 'ꝺ', + 'Ꝼ' => 'ꝼ', + 'Ᵹ' => 'ᵹ', + 'Ꝿ' => 'ꝿ', + 'Ꞁ' => 'ꞁ', + 'Ꞃ' => 'ꞃ', + 'Ꞅ' => 'ꞅ', + 'Ꞇ' => 'ꞇ', + 'Ꞌ' => 'ꞌ', + 'Ɥ' => 'ɥ', + 'Ꞑ' => 'ꞑ', + 'Ꞓ' => 'ꞓ', + 'Ꞗ' => 'ꞗ', + 'Ꞙ' => 'ꞙ', + 'Ꞛ' => 'ꞛ', + 'Ꞝ' => 'ꞝ', + 'Ꞟ' => 'ꞟ', + 'Ꞡ' => 'ꞡ', + 'Ꞣ' => 'ꞣ', + 'Ꞥ' => 'ꞥ', + 'Ꞧ' => 'ꞧ', + 'Ꞩ' => 'ꞩ', + 'Ɦ' => 'ɦ', + 'Ɜ' => 'ɜ', + 'Ɡ' => 'ɡ', + 'Ɬ' => 'ɬ', + 'Ɪ' => 'ɪ', + 'Ʞ' => 'ʞ', + 'Ʇ' => 'ʇ', + 'Ʝ' => 'ʝ', + 'Ꭓ' => 'ꭓ', + 'Ꞵ' => 'ꞵ', + 'Ꞷ' => 'ꞷ', + 'Ꞹ' => 'ꞹ', + 'Ꞻ' => 'ꞻ', + 'Ꞽ' => 'ꞽ', + 'Ꞿ' => 'ꞿ', + 'Ꟃ' => 'ꟃ', + 'Ꞔ' => 'ꞔ', + 'Ʂ' => 'ʂ', + 'Ᶎ' => 'ᶎ', + 'Ꟈ' => 'ꟈ', + 'Ꟊ' => 'ꟊ', + 'Ꟶ' => 'ꟶ', + 'A' => 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + '𐐀' => '𐐨', + '𐐁' => '𐐩', + '𐐂' => '𐐪', + '𐐃' => '𐐫', + '𐐄' => '𐐬', + '𐐅' => '𐐭', + '𐐆' => '𐐮', + '𐐇' => '𐐯', + '𐐈' => '𐐰', + '𐐉' => '𐐱', + '𐐊' => '𐐲', + '𐐋' => '𐐳', + '𐐌' => '𐐴', + '𐐍' => '𐐵', + '𐐎' => '𐐶', + '𐐏' => '𐐷', + '𐐐' => '𐐸', + '𐐑' => '𐐹', + '𐐒' => '𐐺', + '𐐓' => '𐐻', + '𐐔' => '𐐼', + '𐐕' => '𐐽', + '𐐖' => '𐐾', + '𐐗' => '𐐿', + '𐐘' => '𐑀', + '𐐙' => '𐑁', + '𐐚' => '𐑂', + '𐐛' => '𐑃', + '𐐜' => '𐑄', + '𐐝' => '𐑅', + '𐐞' => '𐑆', + '𐐟' => '𐑇', + '𐐠' => '𐑈', + '𐐡' => '𐑉', + '𐐢' => '𐑊', + '𐐣' => '𐑋', + '𐐤' => '𐑌', + '𐐥' => '𐑍', + '𐐦' => '𐑎', + '𐐧' => '𐑏', + '𐒰' => '𐓘', + '𐒱' => '𐓙', + '𐒲' => '𐓚', + '𐒳' => '𐓛', + '𐒴' => '𐓜', + '𐒵' => '𐓝', + '𐒶' => '𐓞', + '𐒷' => '𐓟', + '𐒸' => '𐓠', + '𐒹' => '𐓡', + '𐒺' => '𐓢', + '𐒻' => '𐓣', + '𐒼' => '𐓤', + '𐒽' => '𐓥', + '𐒾' => '𐓦', + '𐒿' => '𐓧', + '𐓀' => '𐓨', + '𐓁' => '𐓩', + '𐓂' => '𐓪', + '𐓃' => '𐓫', + '𐓄' => '𐓬', + '𐓅' => '𐓭', + '𐓆' => '𐓮', + '𐓇' => '𐓯', + '𐓈' => '𐓰', + '𐓉' => '𐓱', + '𐓊' => '𐓲', + '𐓋' => '𐓳', + '𐓌' => '𐓴', + '𐓍' => '𐓵', + '𐓎' => '𐓶', + '𐓏' => '𐓷', + '𐓐' => '𐓸', + '𐓑' => '𐓹', + '𐓒' => '𐓺', + '𐓓' => '𐓻', + '𐲀' => '𐳀', + '𐲁' => '𐳁', + '𐲂' => '𐳂', + '𐲃' => '𐳃', + '𐲄' => '𐳄', + '𐲅' => '𐳅', + '𐲆' => '𐳆', + '𐲇' => '𐳇', + '𐲈' => '𐳈', + '𐲉' => '𐳉', + '𐲊' => '𐳊', + '𐲋' => '𐳋', + '𐲌' => '𐳌', + '𐲍' => '𐳍', + '𐲎' => '𐳎', + '𐲏' => '𐳏', + '𐲐' => '𐳐', + '𐲑' => '𐳑', + '𐲒' => '𐳒', + '𐲓' => '𐳓', + '𐲔' => '𐳔', + '𐲕' => '𐳕', + '𐲖' => '𐳖', + '𐲗' => '𐳗', + '𐲘' => '𐳘', + '𐲙' => '𐳙', + '𐲚' => '𐳚', + '𐲛' => '𐳛', + '𐲜' => '𐳜', + '𐲝' => '𐳝', + '𐲞' => '𐳞', + '𐲟' => '𐳟', + '𐲠' => '𐳠', + '𐲡' => '𐳡', + '𐲢' => '𐳢', + '𐲣' => '𐳣', + '𐲤' => '𐳤', + '𐲥' => '𐳥', + '𐲦' => '𐳦', + '𐲧' => '𐳧', + '𐲨' => '𐳨', + '𐲩' => '𐳩', + '𐲪' => '𐳪', + '𐲫' => '𐳫', + '𐲬' => '𐳬', + '𐲭' => '𐳭', + '𐲮' => '𐳮', + '𐲯' => '𐳯', + '𐲰' => '𐳰', + '𐲱' => '𐳱', + '𐲲' => '𐳲', + '𑢠' => '𑣀', + '𑢡' => '𑣁', + '𑢢' => '𑣂', + '𑢣' => '𑣃', + '𑢤' => '𑣄', + '𑢥' => '𑣅', + '𑢦' => '𑣆', + '𑢧' => '𑣇', + '𑢨' => '𑣈', + '𑢩' => '𑣉', + '𑢪' => '𑣊', + '𑢫' => '𑣋', + '𑢬' => '𑣌', + '𑢭' => '𑣍', + '𑢮' => '𑣎', + '𑢯' => '𑣏', + '𑢰' => '𑣐', + '𑢱' => '𑣑', + '𑢲' => '𑣒', + '𑢳' => '𑣓', + '𑢴' => '𑣔', + '𑢵' => '𑣕', + '𑢶' => '𑣖', + '𑢷' => '𑣗', + '𑢸' => '𑣘', + '𑢹' => '𑣙', + '𑢺' => '𑣚', + '𑢻' => '𑣛', + '𑢼' => '𑣜', + '𑢽' => '𑣝', + '𑢾' => '𑣞', + '𑢿' => '𑣟', + '𖹀' => '𖹠', + '𖹁' => '𖹡', + '𖹂' => '𖹢', + '𖹃' => '𖹣', + '𖹄' => '𖹤', + '𖹅' => '𖹥', + '𖹆' => '𖹦', + '𖹇' => '𖹧', + '𖹈' => '𖹨', + '𖹉' => '𖹩', + '𖹊' => '𖹪', + '𖹋' => '𖹫', + '𖹌' => '𖹬', + '𖹍' => '𖹭', + '𖹎' => '𖹮', + '𖹏' => '𖹯', + '𖹐' => '𖹰', + '𖹑' => '𖹱', + '𖹒' => '𖹲', + '𖹓' => '𖹳', + '𖹔' => '𖹴', + '𖹕' => '𖹵', + '𖹖' => '𖹶', + '𖹗' => '𖹷', + '𖹘' => '𖹸', + '𖹙' => '𖹹', + '𖹚' => '𖹺', + '𖹛' => '𖹻', + '𖹜' => '𖹼', + '𖹝' => '𖹽', + '𖹞' => '𖹾', + '𖹟' => '𖹿', + '𞤀' => '𞤢', + '𞤁' => '𞤣', + '𞤂' => '𞤤', + '𞤃' => '𞤥', + '𞤄' => '𞤦', + '𞤅' => '𞤧', + '𞤆' => '𞤨', + '𞤇' => '𞤩', + '𞤈' => '𞤪', + '𞤉' => '𞤫', + '𞤊' => '𞤬', + '𞤋' => '𞤭', + '𞤌' => '𞤮', + '𞤍' => '𞤯', + '𞤎' => '𞤰', + '𞤏' => '𞤱', + '𞤐' => '𞤲', + '𞤑' => '𞤳', + '𞤒' => '𞤴', + '𞤓' => '𞤵', + '𞤔' => '𞤶', + '𞤕' => '𞤷', + '𞤖' => '𞤸', + '𞤗' => '𞤹', + '𞤘' => '𞤺', + '𞤙' => '𞤻', + '𞤚' => '𞤼', + '𞤛' => '𞤽', + '𞤜' => '𞤾', + '𞤝' => '𞤿', + '𞤞' => '𞥀', + '𞤟' => '𞥁', + '𞤠' => '𞥂', + '𞤡' => '𞥃', +); diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php new file mode 100644 index 0000000..2a8f6e7 --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -0,0 +1,5 @@ + 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + 'µ' => 'Μ', + 'à' => 'À', + 'á' => 'Á', + 'â' => 'Â', + 'ã' => 'Ã', + 'ä' => 'Ä', + 'å' => 'Å', + 'æ' => 'Æ', + 'ç' => 'Ç', + 'è' => 'È', + 'é' => 'É', + 'ê' => 'Ê', + 'ë' => 'Ë', + 'ì' => 'Ì', + 'í' => 'Í', + 'î' => 'Î', + 'ï' => 'Ï', + 'ð' => 'Ð', + 'ñ' => 'Ñ', + 'ò' => 'Ò', + 'ó' => 'Ó', + 'ô' => 'Ô', + 'õ' => 'Õ', + 'ö' => 'Ö', + 'ø' => 'Ø', + 'ù' => 'Ù', + 'ú' => 'Ú', + 'û' => 'Û', + 'ü' => 'Ü', + 'ý' => 'Ý', + 'þ' => 'Þ', + 'ÿ' => 'Ÿ', + 'ā' => 'Ā', + 'ă' => 'Ă', + 'ą' => 'Ą', + 'ć' => 'Ć', + 'ĉ' => 'Ĉ', + 'ċ' => 'Ċ', + 'č' => 'Č', + 'ď' => 'Ď', + 'đ' => 'Đ', + 'ē' => 'Ē', + 'ĕ' => 'Ĕ', + 'ė' => 'Ė', + 'ę' => 'Ę', + 'ě' => 'Ě', + 'ĝ' => 'Ĝ', + 'ğ' => 'Ğ', + 'ġ' => 'Ġ', + 'ģ' => 'Ģ', + 'ĥ' => 'Ĥ', + 'ħ' => 'Ħ', + 'ĩ' => 'Ĩ', + 'ī' => 'Ī', + 'ĭ' => 'Ĭ', + 'į' => 'Į', + 'ı' => 'I', + 'ij' => 'IJ', + 'ĵ' => 'Ĵ', + 'ķ' => 'Ķ', + 'ĺ' => 'Ĺ', + 'ļ' => 'Ļ', + 'ľ' => 'Ľ', + 'ŀ' => 'Ŀ', + 'ł' => 'Ł', + 'ń' => 'Ń', + 'ņ' => 'Ņ', + 'ň' => 'Ň', + 'ŋ' => 'Ŋ', + 'ō' => 'Ō', + 'ŏ' => 'Ŏ', + 'ő' => 'Ő', + 'œ' => 'Œ', + 'ŕ' => 'Ŕ', + 'ŗ' => 'Ŗ', + 'ř' => 'Ř', + 'ś' => 'Ś', + 'ŝ' => 'Ŝ', + 'ş' => 'Ş', + 'š' => 'Š', + 'ţ' => 'Ţ', + 'ť' => 'Ť', + 'ŧ' => 'Ŧ', + 'ũ' => 'Ũ', + 'ū' => 'Ū', + 'ŭ' => 'Ŭ', + 'ů' => 'Ů', + 'ű' => 'Ű', + 'ų' => 'Ų', + 'ŵ' => 'Ŵ', + 'ŷ' => 'Ŷ', + 'ź' => 'Ź', + 'ż' => 'Ż', + 'ž' => 'Ž', + 'ſ' => 'S', + 'ƀ' => 'Ƀ', + 'ƃ' => 'Ƃ', + 'ƅ' => 'Ƅ', + 'ƈ' => 'Ƈ', + 'ƌ' => 'Ƌ', + 'ƒ' => 'Ƒ', + 'ƕ' => 'Ƕ', + 'ƙ' => 'Ƙ', + 'ƚ' => 'Ƚ', + 'ƞ' => 'Ƞ', + 'ơ' => 'Ơ', + 'ƣ' => 'Ƣ', + 'ƥ' => 'Ƥ', + 'ƨ' => 'Ƨ', + 'ƭ' => 'Ƭ', + 'ư' => 'Ư', + 'ƴ' => 'Ƴ', + 'ƶ' => 'Ƶ', + 'ƹ' => 'Ƹ', + 'ƽ' => 'Ƽ', + 'ƿ' => 'Ƿ', + 'Dž' => 'DŽ', + 'dž' => 'DŽ', + 'Lj' => 'LJ', + 'lj' => 'LJ', + 'Nj' => 'NJ', + 'nj' => 'NJ', + 'ǎ' => 'Ǎ', + 'ǐ' => 'Ǐ', + 'ǒ' => 'Ǒ', + 'ǔ' => 'Ǔ', + 'ǖ' => 'Ǖ', + 'ǘ' => 'Ǘ', + 'ǚ' => 'Ǚ', + 'ǜ' => 'Ǜ', + 'ǝ' => 'Ǝ', + 'ǟ' => 'Ǟ', + 'ǡ' => 'Ǡ', + 'ǣ' => 'Ǣ', + 'ǥ' => 'Ǥ', + 'ǧ' => 'Ǧ', + 'ǩ' => 'Ǩ', + 'ǫ' => 'Ǫ', + 'ǭ' => 'Ǭ', + 'ǯ' => 'Ǯ', + 'Dz' => 'DZ', + 'dz' => 'DZ', + 'ǵ' => 'Ǵ', + 'ǹ' => 'Ǹ', + 'ǻ' => 'Ǻ', + 'ǽ' => 'Ǽ', + 'ǿ' => 'Ǿ', + 'ȁ' => 'Ȁ', + 'ȃ' => 'Ȃ', + 'ȅ' => 'Ȅ', + 'ȇ' => 'Ȇ', + 'ȉ' => 'Ȉ', + 'ȋ' => 'Ȋ', + 'ȍ' => 'Ȍ', + 'ȏ' => 'Ȏ', + 'ȑ' => 'Ȑ', + 'ȓ' => 'Ȓ', + 'ȕ' => 'Ȕ', + 'ȗ' => 'Ȗ', + 'ș' => 'Ș', + 'ț' => 'Ț', + 'ȝ' => 'Ȝ', + 'ȟ' => 'Ȟ', + 'ȣ' => 'Ȣ', + 'ȥ' => 'Ȥ', + 'ȧ' => 'Ȧ', + 'ȩ' => 'Ȩ', + 'ȫ' => 'Ȫ', + 'ȭ' => 'Ȭ', + 'ȯ' => 'Ȯ', + 'ȱ' => 'Ȱ', + 'ȳ' => 'Ȳ', + 'ȼ' => 'Ȼ', + 'ȿ' => 'Ȿ', + 'ɀ' => 'Ɀ', + 'ɂ' => 'Ɂ', + 'ɇ' => 'Ɇ', + 'ɉ' => 'Ɉ', + 'ɋ' => 'Ɋ', + 'ɍ' => 'Ɍ', + 'ɏ' => 'Ɏ', + 'ɐ' => 'Ɐ', + 'ɑ' => 'Ɑ', + 'ɒ' => 'Ɒ', + 'ɓ' => 'Ɓ', + 'ɔ' => 'Ɔ', + 'ɖ' => 'Ɖ', + 'ɗ' => 'Ɗ', + 'ə' => 'Ə', + 'ɛ' => 'Ɛ', + 'ɜ' => 'Ɜ', + 'ɠ' => 'Ɠ', + 'ɡ' => 'Ɡ', + 'ɣ' => 'Ɣ', + 'ɥ' => 'Ɥ', + 'ɦ' => 'Ɦ', + 'ɨ' => 'Ɨ', + 'ɩ' => 'Ɩ', + 'ɪ' => 'Ɪ', + 'ɫ' => 'Ɫ', + 'ɬ' => 'Ɬ', + 'ɯ' => 'Ɯ', + 'ɱ' => 'Ɱ', + 'ɲ' => 'Ɲ', + 'ɵ' => 'Ɵ', + 'ɽ' => 'Ɽ', + 'ʀ' => 'Ʀ', + 'ʂ' => 'Ʂ', + 'ʃ' => 'Ʃ', + 'ʇ' => 'Ʇ', + 'ʈ' => 'Ʈ', + 'ʉ' => 'Ʉ', + 'ʊ' => 'Ʊ', + 'ʋ' => 'Ʋ', + 'ʌ' => 'Ʌ', + 'ʒ' => 'Ʒ', + 'ʝ' => 'Ʝ', + 'ʞ' => 'Ʞ', + 'ͅ' => 'Ι', + 'ͱ' => 'Ͱ', + 'ͳ' => 'Ͳ', + 'ͷ' => 'Ͷ', + 'ͻ' => 'Ͻ', + 'ͼ' => 'Ͼ', + 'ͽ' => 'Ͽ', + 'ά' => 'Ά', + 'έ' => 'Έ', + 'ή' => 'Ή', + 'ί' => 'Ί', + 'α' => 'Α', + 'β' => 'Β', + 'γ' => 'Γ', + 'δ' => 'Δ', + 'ε' => 'Ε', + 'ζ' => 'Ζ', + 'η' => 'Η', + 'θ' => 'Θ', + 'ι' => 'Ι', + 'κ' => 'Κ', + 'λ' => 'Λ', + 'μ' => 'Μ', + 'ν' => 'Ν', + 'ξ' => 'Ξ', + 'ο' => 'Ο', + 'π' => 'Π', + 'ρ' => 'Ρ', + 'ς' => 'Σ', + 'σ' => 'Σ', + 'τ' => 'Τ', + 'υ' => 'Υ', + 'φ' => 'Φ', + 'χ' => 'Χ', + 'ψ' => 'Ψ', + 'ω' => 'Ω', + 'ϊ' => 'Ϊ', + 'ϋ' => 'Ϋ', + 'ό' => 'Ό', + 'ύ' => 'Ύ', + 'ώ' => 'Ώ', + 'ϐ' => 'Β', + 'ϑ' => 'Θ', + 'ϕ' => 'Φ', + 'ϖ' => 'Π', + 'ϗ' => 'Ϗ', + 'ϙ' => 'Ϙ', + 'ϛ' => 'Ϛ', + 'ϝ' => 'Ϝ', + 'ϟ' => 'Ϟ', + 'ϡ' => 'Ϡ', + 'ϣ' => 'Ϣ', + 'ϥ' => 'Ϥ', + 'ϧ' => 'Ϧ', + 'ϩ' => 'Ϩ', + 'ϫ' => 'Ϫ', + 'ϭ' => 'Ϭ', + 'ϯ' => 'Ϯ', + 'ϰ' => 'Κ', + 'ϱ' => 'Ρ', + 'ϲ' => 'Ϲ', + 'ϳ' => 'Ϳ', + 'ϵ' => 'Ε', + 'ϸ' => 'Ϸ', + 'ϻ' => 'Ϻ', + 'а' => 'А', + 'б' => 'Б', + 'в' => 'В', + 'г' => 'Г', + 'д' => 'Д', + 'е' => 'Е', + 'ж' => 'Ж', + 'з' => 'З', + 'и' => 'И', + 'й' => 'Й', + 'к' => 'К', + 'л' => 'Л', + 'м' => 'М', + 'н' => 'Н', + 'о' => 'О', + 'п' => 'П', + 'р' => 'Р', + 'с' => 'С', + 'т' => 'Т', + 'у' => 'У', + 'ф' => 'Ф', + 'х' => 'Х', + 'ц' => 'Ц', + 'ч' => 'Ч', + 'ш' => 'Ш', + 'щ' => 'Щ', + 'ъ' => 'Ъ', + 'ы' => 'Ы', + 'ь' => 'Ь', + 'э' => 'Э', + 'ю' => 'Ю', + 'я' => 'Я', + 'ѐ' => 'Ѐ', + 'ё' => 'Ё', + 'ђ' => 'Ђ', + 'ѓ' => 'Ѓ', + 'є' => 'Є', + 'ѕ' => 'Ѕ', + 'і' => 'І', + 'ї' => 'Ї', + 'ј' => 'Ј', + 'љ' => 'Љ', + 'њ' => 'Њ', + 'ћ' => 'Ћ', + 'ќ' => 'Ќ', + 'ѝ' => 'Ѝ', + 'ў' => 'Ў', + 'џ' => 'Џ', + 'ѡ' => 'Ѡ', + 'ѣ' => 'Ѣ', + 'ѥ' => 'Ѥ', + 'ѧ' => 'Ѧ', + 'ѩ' => 'Ѩ', + 'ѫ' => 'Ѫ', + 'ѭ' => 'Ѭ', + 'ѯ' => 'Ѯ', + 'ѱ' => 'Ѱ', + 'ѳ' => 'Ѳ', + 'ѵ' => 'Ѵ', + 'ѷ' => 'Ѷ', + 'ѹ' => 'Ѹ', + 'ѻ' => 'Ѻ', + 'ѽ' => 'Ѽ', + 'ѿ' => 'Ѿ', + 'ҁ' => 'Ҁ', + 'ҋ' => 'Ҋ', + 'ҍ' => 'Ҍ', + 'ҏ' => 'Ҏ', + 'ґ' => 'Ґ', + 'ғ' => 'Ғ', + 'ҕ' => 'Ҕ', + 'җ' => 'Җ', + 'ҙ' => 'Ҙ', + 'қ' => 'Қ', + 'ҝ' => 'Ҝ', + 'ҟ' => 'Ҟ', + 'ҡ' => 'Ҡ', + 'ң' => 'Ң', + 'ҥ' => 'Ҥ', + 'ҧ' => 'Ҧ', + 'ҩ' => 'Ҩ', + 'ҫ' => 'Ҫ', + 'ҭ' => 'Ҭ', + 'ү' => 'Ү', + 'ұ' => 'Ұ', + 'ҳ' => 'Ҳ', + 'ҵ' => 'Ҵ', + 'ҷ' => 'Ҷ', + 'ҹ' => 'Ҹ', + 'һ' => 'Һ', + 'ҽ' => 'Ҽ', + 'ҿ' => 'Ҿ', + 'ӂ' => 'Ӂ', + 'ӄ' => 'Ӄ', + 'ӆ' => 'Ӆ', + 'ӈ' => 'Ӈ', + 'ӊ' => 'Ӊ', + 'ӌ' => 'Ӌ', + 'ӎ' => 'Ӎ', + 'ӏ' => 'Ӏ', + 'ӑ' => 'Ӑ', + 'ӓ' => 'Ӓ', + 'ӕ' => 'Ӕ', + 'ӗ' => 'Ӗ', + 'ә' => 'Ә', + 'ӛ' => 'Ӛ', + 'ӝ' => 'Ӝ', + 'ӟ' => 'Ӟ', + 'ӡ' => 'Ӡ', + 'ӣ' => 'Ӣ', + 'ӥ' => 'Ӥ', + 'ӧ' => 'Ӧ', + 'ө' => 'Ө', + 'ӫ' => 'Ӫ', + 'ӭ' => 'Ӭ', + 'ӯ' => 'Ӯ', + 'ӱ' => 'Ӱ', + 'ӳ' => 'Ӳ', + 'ӵ' => 'Ӵ', + 'ӷ' => 'Ӷ', + 'ӹ' => 'Ӹ', + 'ӻ' => 'Ӻ', + 'ӽ' => 'Ӽ', + 'ӿ' => 'Ӿ', + 'ԁ' => 'Ԁ', + 'ԃ' => 'Ԃ', + 'ԅ' => 'Ԅ', + 'ԇ' => 'Ԇ', + 'ԉ' => 'Ԉ', + 'ԋ' => 'Ԋ', + 'ԍ' => 'Ԍ', + 'ԏ' => 'Ԏ', + 'ԑ' => 'Ԑ', + 'ԓ' => 'Ԓ', + 'ԕ' => 'Ԕ', + 'ԗ' => 'Ԗ', + 'ԙ' => 'Ԙ', + 'ԛ' => 'Ԛ', + 'ԝ' => 'Ԝ', + 'ԟ' => 'Ԟ', + 'ԡ' => 'Ԡ', + 'ԣ' => 'Ԣ', + 'ԥ' => 'Ԥ', + 'ԧ' => 'Ԧ', + 'ԩ' => 'Ԩ', + 'ԫ' => 'Ԫ', + 'ԭ' => 'Ԭ', + 'ԯ' => 'Ԯ', + 'ա' => 'Ա', + 'բ' => 'Բ', + 'գ' => 'Գ', + 'դ' => 'Դ', + 'ե' => 'Ե', + 'զ' => 'Զ', + 'է' => 'Է', + 'ը' => 'Ը', + 'թ' => 'Թ', + 'ժ' => 'Ժ', + 'ի' => 'Ի', + 'լ' => 'Լ', + 'խ' => 'Խ', + 'ծ' => 'Ծ', + 'կ' => 'Կ', + 'հ' => 'Հ', + 'ձ' => 'Ձ', + 'ղ' => 'Ղ', + 'ճ' => 'Ճ', + 'մ' => 'Մ', + 'յ' => 'Յ', + 'ն' => 'Ն', + 'շ' => 'Շ', + 'ո' => 'Ո', + 'չ' => 'Չ', + 'պ' => 'Պ', + 'ջ' => 'Ջ', + 'ռ' => 'Ռ', + 'ս' => 'Ս', + 'վ' => 'Վ', + 'տ' => 'Տ', + 'ր' => 'Ր', + 'ց' => 'Ց', + 'ւ' => 'Ւ', + 'փ' => 'Փ', + 'ք' => 'Ք', + 'օ' => 'Օ', + 'ֆ' => 'Ֆ', + 'ა' => 'Ა', + 'ბ' => 'Ბ', + 'გ' => 'Გ', + 'დ' => 'Დ', + 'ე' => 'Ე', + 'ვ' => 'Ვ', + 'ზ' => 'Ზ', + 'თ' => 'Თ', + 'ი' => 'Ი', + 'კ' => 'Კ', + 'ლ' => 'Ლ', + 'მ' => 'Მ', + 'ნ' => 'Ნ', + 'ო' => 'Ო', + 'პ' => 'Პ', + 'ჟ' => 'Ჟ', + 'რ' => 'Რ', + 'ს' => 'Ს', + 'ტ' => 'Ტ', + 'უ' => 'Უ', + 'ფ' => 'Ფ', + 'ქ' => 'Ქ', + 'ღ' => 'Ღ', + 'ყ' => 'Ყ', + 'შ' => 'Შ', + 'ჩ' => 'Ჩ', + 'ც' => 'Ც', + 'ძ' => 'Ძ', + 'წ' => 'Წ', + 'ჭ' => 'Ჭ', + 'ხ' => 'Ხ', + 'ჯ' => 'Ჯ', + 'ჰ' => 'Ჰ', + 'ჱ' => 'Ჱ', + 'ჲ' => 'Ჲ', + 'ჳ' => 'Ჳ', + 'ჴ' => 'Ჴ', + 'ჵ' => 'Ჵ', + 'ჶ' => 'Ჶ', + 'ჷ' => 'Ჷ', + 'ჸ' => 'Ჸ', + 'ჹ' => 'Ჹ', + 'ჺ' => 'Ჺ', + 'ჽ' => 'Ჽ', + 'ჾ' => 'Ჾ', + 'ჿ' => 'Ჿ', + 'ᏸ' => 'Ᏸ', + 'ᏹ' => 'Ᏹ', + 'ᏺ' => 'Ᏺ', + 'ᏻ' => 'Ᏻ', + 'ᏼ' => 'Ᏼ', + 'ᏽ' => 'Ᏽ', + 'ᲀ' => 'В', + 'ᲁ' => 'Д', + 'ᲂ' => 'О', + 'ᲃ' => 'С', + 'ᲄ' => 'Т', + 'ᲅ' => 'Т', + 'ᲆ' => 'Ъ', + 'ᲇ' => 'Ѣ', + 'ᲈ' => 'Ꙋ', + 'ᵹ' => 'Ᵹ', + 'ᵽ' => 'Ᵽ', + 'ᶎ' => 'Ᶎ', + 'ḁ' => 'Ḁ', + 'ḃ' => 'Ḃ', + 'ḅ' => 'Ḅ', + 'ḇ' => 'Ḇ', + 'ḉ' => 'Ḉ', + 'ḋ' => 'Ḋ', + 'ḍ' => 'Ḍ', + 'ḏ' => 'Ḏ', + 'ḑ' => 'Ḑ', + 'ḓ' => 'Ḓ', + 'ḕ' => 'Ḕ', + 'ḗ' => 'Ḗ', + 'ḙ' => 'Ḙ', + 'ḛ' => 'Ḛ', + 'ḝ' => 'Ḝ', + 'ḟ' => 'Ḟ', + 'ḡ' => 'Ḡ', + 'ḣ' => 'Ḣ', + 'ḥ' => 'Ḥ', + 'ḧ' => 'Ḧ', + 'ḩ' => 'Ḩ', + 'ḫ' => 'Ḫ', + 'ḭ' => 'Ḭ', + 'ḯ' => 'Ḯ', + 'ḱ' => 'Ḱ', + 'ḳ' => 'Ḳ', + 'ḵ' => 'Ḵ', + 'ḷ' => 'Ḷ', + 'ḹ' => 'Ḹ', + 'ḻ' => 'Ḻ', + 'ḽ' => 'Ḽ', + 'ḿ' => 'Ḿ', + 'ṁ' => 'Ṁ', + 'ṃ' => 'Ṃ', + 'ṅ' => 'Ṅ', + 'ṇ' => 'Ṇ', + 'ṉ' => 'Ṉ', + 'ṋ' => 'Ṋ', + 'ṍ' => 'Ṍ', + 'ṏ' => 'Ṏ', + 'ṑ' => 'Ṑ', + 'ṓ' => 'Ṓ', + 'ṕ' => 'Ṕ', + 'ṗ' => 'Ṗ', + 'ṙ' => 'Ṙ', + 'ṛ' => 'Ṛ', + 'ṝ' => 'Ṝ', + 'ṟ' => 'Ṟ', + 'ṡ' => 'Ṡ', + 'ṣ' => 'Ṣ', + 'ṥ' => 'Ṥ', + 'ṧ' => 'Ṧ', + 'ṩ' => 'Ṩ', + 'ṫ' => 'Ṫ', + 'ṭ' => 'Ṭ', + 'ṯ' => 'Ṯ', + 'ṱ' => 'Ṱ', + 'ṳ' => 'Ṳ', + 'ṵ' => 'Ṵ', + 'ṷ' => 'Ṷ', + 'ṹ' => 'Ṹ', + 'ṻ' => 'Ṻ', + 'ṽ' => 'Ṽ', + 'ṿ' => 'Ṿ', + 'ẁ' => 'Ẁ', + 'ẃ' => 'Ẃ', + 'ẅ' => 'Ẅ', + 'ẇ' => 'Ẇ', + 'ẉ' => 'Ẉ', + 'ẋ' => 'Ẋ', + 'ẍ' => 'Ẍ', + 'ẏ' => 'Ẏ', + 'ẑ' => 'Ẑ', + 'ẓ' => 'Ẓ', + 'ẕ' => 'Ẕ', + 'ẛ' => 'Ṡ', + 'ạ' => 'Ạ', + 'ả' => 'Ả', + 'ấ' => 'Ấ', + 'ầ' => 'Ầ', + 'ẩ' => 'Ẩ', + 'ẫ' => 'Ẫ', + 'ậ' => 'Ậ', + 'ắ' => 'Ắ', + 'ằ' => 'Ằ', + 'ẳ' => 'Ẳ', + 'ẵ' => 'Ẵ', + 'ặ' => 'Ặ', + 'ẹ' => 'Ẹ', + 'ẻ' => 'Ẻ', + 'ẽ' => 'Ẽ', + 'ế' => 'Ế', + 'ề' => 'Ề', + 'ể' => 'Ể', + 'ễ' => 'Ễ', + 'ệ' => 'Ệ', + 'ỉ' => 'Ỉ', + 'ị' => 'Ị', + 'ọ' => 'Ọ', + 'ỏ' => 'Ỏ', + 'ố' => 'Ố', + 'ồ' => 'Ồ', + 'ổ' => 'Ổ', + 'ỗ' => 'Ỗ', + 'ộ' => 'Ộ', + 'ớ' => 'Ớ', + 'ờ' => 'Ờ', + 'ở' => 'Ở', + 'ỡ' => 'Ỡ', + 'ợ' => 'Ợ', + 'ụ' => 'Ụ', + 'ủ' => 'Ủ', + 'ứ' => 'Ứ', + 'ừ' => 'Ừ', + 'ử' => 'Ử', + 'ữ' => 'Ữ', + 'ự' => 'Ự', + 'ỳ' => 'Ỳ', + 'ỵ' => 'Ỵ', + 'ỷ' => 'Ỷ', + 'ỹ' => 'Ỹ', + 'ỻ' => 'Ỻ', + 'ỽ' => 'Ỽ', + 'ỿ' => 'Ỿ', + 'ἀ' => 'Ἀ', + 'ἁ' => 'Ἁ', + 'ἂ' => 'Ἂ', + 'ἃ' => 'Ἃ', + 'ἄ' => 'Ἄ', + 'ἅ' => 'Ἅ', + 'ἆ' => 'Ἆ', + 'ἇ' => 'Ἇ', + 'ἐ' => 'Ἐ', + 'ἑ' => 'Ἑ', + 'ἒ' => 'Ἒ', + 'ἓ' => 'Ἓ', + 'ἔ' => 'Ἔ', + 'ἕ' => 'Ἕ', + 'ἠ' => 'Ἠ', + 'ἡ' => 'Ἡ', + 'ἢ' => 'Ἢ', + 'ἣ' => 'Ἣ', + 'ἤ' => 'Ἤ', + 'ἥ' => 'Ἥ', + 'ἦ' => 'Ἦ', + 'ἧ' => 'Ἧ', + 'ἰ' => 'Ἰ', + 'ἱ' => 'Ἱ', + 'ἲ' => 'Ἲ', + 'ἳ' => 'Ἳ', + 'ἴ' => 'Ἴ', + 'ἵ' => 'Ἵ', + 'ἶ' => 'Ἶ', + 'ἷ' => 'Ἷ', + 'ὀ' => 'Ὀ', + 'ὁ' => 'Ὁ', + 'ὂ' => 'Ὂ', + 'ὃ' => 'Ὃ', + 'ὄ' => 'Ὄ', + 'ὅ' => 'Ὅ', + 'ὑ' => 'Ὑ', + 'ὓ' => 'Ὓ', + 'ὕ' => 'Ὕ', + 'ὗ' => 'Ὗ', + 'ὠ' => 'Ὠ', + 'ὡ' => 'Ὡ', + 'ὢ' => 'Ὢ', + 'ὣ' => 'Ὣ', + 'ὤ' => 'Ὤ', + 'ὥ' => 'Ὥ', + 'ὦ' => 'Ὦ', + 'ὧ' => 'Ὧ', + 'ὰ' => 'Ὰ', + 'ά' => 'Ά', + 'ὲ' => 'Ὲ', + 'έ' => 'Έ', + 'ὴ' => 'Ὴ', + 'ή' => 'Ή', + 'ὶ' => 'Ὶ', + 'ί' => 'Ί', + 'ὸ' => 'Ὸ', + 'ό' => 'Ό', + 'ὺ' => 'Ὺ', + 'ύ' => 'Ύ', + 'ὼ' => 'Ὼ', + 'ώ' => 'Ώ', + 'ᾀ' => 'ἈΙ', + 'ᾁ' => 'ἉΙ', + 'ᾂ' => 'ἊΙ', + 'ᾃ' => 'ἋΙ', + 'ᾄ' => 'ἌΙ', + 'ᾅ' => 'ἍΙ', + 'ᾆ' => 'ἎΙ', + 'ᾇ' => 'ἏΙ', + 'ᾐ' => 'ἨΙ', + 'ᾑ' => 'ἩΙ', + 'ᾒ' => 'ἪΙ', + 'ᾓ' => 'ἫΙ', + 'ᾔ' => 'ἬΙ', + 'ᾕ' => 'ἭΙ', + 'ᾖ' => 'ἮΙ', + 'ᾗ' => 'ἯΙ', + 'ᾠ' => 'ὨΙ', + 'ᾡ' => 'ὩΙ', + 'ᾢ' => 'ὪΙ', + 'ᾣ' => 'ὫΙ', + 'ᾤ' => 'ὬΙ', + 'ᾥ' => 'ὭΙ', + 'ᾦ' => 'ὮΙ', + 'ᾧ' => 'ὯΙ', + 'ᾰ' => 'Ᾰ', + 'ᾱ' => 'Ᾱ', + 'ᾳ' => 'ΑΙ', + 'ι' => 'Ι', + 'ῃ' => 'ΗΙ', + 'ῐ' => 'Ῐ', + 'ῑ' => 'Ῑ', + 'ῠ' => 'Ῠ', + 'ῡ' => 'Ῡ', + 'ῥ' => 'Ῥ', + 'ῳ' => 'ΩΙ', + 'ⅎ' => 'Ⅎ', + 'ⅰ' => 'Ⅰ', + 'ⅱ' => 'Ⅱ', + 'ⅲ' => 'Ⅲ', + 'ⅳ' => 'Ⅳ', + 'ⅴ' => 'Ⅴ', + 'ⅵ' => 'Ⅵ', + 'ⅶ' => 'Ⅶ', + 'ⅷ' => 'Ⅷ', + 'ⅸ' => 'Ⅸ', + 'ⅹ' => 'Ⅹ', + 'ⅺ' => 'Ⅺ', + 'ⅻ' => 'Ⅻ', + 'ⅼ' => 'Ⅼ', + 'ⅽ' => 'Ⅽ', + 'ⅾ' => 'Ⅾ', + 'ⅿ' => 'Ⅿ', + 'ↄ' => 'Ↄ', + 'ⓐ' => 'Ⓐ', + 'ⓑ' => 'Ⓑ', + 'ⓒ' => 'Ⓒ', + 'ⓓ' => 'Ⓓ', + 'ⓔ' => 'Ⓔ', + 'ⓕ' => 'Ⓕ', + 'ⓖ' => 'Ⓖ', + 'ⓗ' => 'Ⓗ', + 'ⓘ' => 'Ⓘ', + 'ⓙ' => 'Ⓙ', + 'ⓚ' => 'Ⓚ', + 'ⓛ' => 'Ⓛ', + 'ⓜ' => 'Ⓜ', + 'ⓝ' => 'Ⓝ', + 'ⓞ' => 'Ⓞ', + 'ⓟ' => 'Ⓟ', + 'ⓠ' => 'Ⓠ', + 'ⓡ' => 'Ⓡ', + 'ⓢ' => 'Ⓢ', + 'ⓣ' => 'Ⓣ', + 'ⓤ' => 'Ⓤ', + 'ⓥ' => 'Ⓥ', + 'ⓦ' => 'Ⓦ', + 'ⓧ' => 'Ⓧ', + 'ⓨ' => 'Ⓨ', + 'ⓩ' => 'Ⓩ', + 'ⰰ' => 'Ⰰ', + 'ⰱ' => 'Ⰱ', + 'ⰲ' => 'Ⰲ', + 'ⰳ' => 'Ⰳ', + 'ⰴ' => 'Ⰴ', + 'ⰵ' => 'Ⰵ', + 'ⰶ' => 'Ⰶ', + 'ⰷ' => 'Ⰷ', + 'ⰸ' => 'Ⰸ', + 'ⰹ' => 'Ⰹ', + 'ⰺ' => 'Ⰺ', + 'ⰻ' => 'Ⰻ', + 'ⰼ' => 'Ⰼ', + 'ⰽ' => 'Ⰽ', + 'ⰾ' => 'Ⰾ', + 'ⰿ' => 'Ⰿ', + 'ⱀ' => 'Ⱀ', + 'ⱁ' => 'Ⱁ', + 'ⱂ' => 'Ⱂ', + 'ⱃ' => 'Ⱃ', + 'ⱄ' => 'Ⱄ', + 'ⱅ' => 'Ⱅ', + 'ⱆ' => 'Ⱆ', + 'ⱇ' => 'Ⱇ', + 'ⱈ' => 'Ⱈ', + 'ⱉ' => 'Ⱉ', + 'ⱊ' => 'Ⱊ', + 'ⱋ' => 'Ⱋ', + 'ⱌ' => 'Ⱌ', + 'ⱍ' => 'Ⱍ', + 'ⱎ' => 'Ⱎ', + 'ⱏ' => 'Ⱏ', + 'ⱐ' => 'Ⱐ', + 'ⱑ' => 'Ⱑ', + 'ⱒ' => 'Ⱒ', + 'ⱓ' => 'Ⱓ', + 'ⱔ' => 'Ⱔ', + 'ⱕ' => 'Ⱕ', + 'ⱖ' => 'Ⱖ', + 'ⱗ' => 'Ⱗ', + 'ⱘ' => 'Ⱘ', + 'ⱙ' => 'Ⱙ', + 'ⱚ' => 'Ⱚ', + 'ⱛ' => 'Ⱛ', + 'ⱜ' => 'Ⱜ', + 'ⱝ' => 'Ⱝ', + 'ⱞ' => 'Ⱞ', + 'ⱡ' => 'Ⱡ', + 'ⱥ' => 'Ⱥ', + 'ⱦ' => 'Ⱦ', + 'ⱨ' => 'Ⱨ', + 'ⱪ' => 'Ⱪ', + 'ⱬ' => 'Ⱬ', + 'ⱳ' => 'Ⱳ', + 'ⱶ' => 'Ⱶ', + 'ⲁ' => 'Ⲁ', + 'ⲃ' => 'Ⲃ', + 'ⲅ' => 'Ⲅ', + 'ⲇ' => 'Ⲇ', + 'ⲉ' => 'Ⲉ', + 'ⲋ' => 'Ⲋ', + 'ⲍ' => 'Ⲍ', + 'ⲏ' => 'Ⲏ', + 'ⲑ' => 'Ⲑ', + 'ⲓ' => 'Ⲓ', + 'ⲕ' => 'Ⲕ', + 'ⲗ' => 'Ⲗ', + 'ⲙ' => 'Ⲙ', + 'ⲛ' => 'Ⲛ', + 'ⲝ' => 'Ⲝ', + 'ⲟ' => 'Ⲟ', + 'ⲡ' => 'Ⲡ', + 'ⲣ' => 'Ⲣ', + 'ⲥ' => 'Ⲥ', + 'ⲧ' => 'Ⲧ', + 'ⲩ' => 'Ⲩ', + 'ⲫ' => 'Ⲫ', + 'ⲭ' => 'Ⲭ', + 'ⲯ' => 'Ⲯ', + 'ⲱ' => 'Ⲱ', + 'ⲳ' => 'Ⲳ', + 'ⲵ' => 'Ⲵ', + 'ⲷ' => 'Ⲷ', + 'ⲹ' => 'Ⲹ', + 'ⲻ' => 'Ⲻ', + 'ⲽ' => 'Ⲽ', + 'ⲿ' => 'Ⲿ', + 'ⳁ' => 'Ⳁ', + 'ⳃ' => 'Ⳃ', + 'ⳅ' => 'Ⳅ', + 'ⳇ' => 'Ⳇ', + 'ⳉ' => 'Ⳉ', + 'ⳋ' => 'Ⳋ', + 'ⳍ' => 'Ⳍ', + 'ⳏ' => 'Ⳏ', + 'ⳑ' => 'Ⳑ', + 'ⳓ' => 'Ⳓ', + 'ⳕ' => 'Ⳕ', + 'ⳗ' => 'Ⳗ', + 'ⳙ' => 'Ⳙ', + 'ⳛ' => 'Ⳛ', + 'ⳝ' => 'Ⳝ', + 'ⳟ' => 'Ⳟ', + 'ⳡ' => 'Ⳡ', + 'ⳣ' => 'Ⳣ', + 'ⳬ' => 'Ⳬ', + 'ⳮ' => 'Ⳮ', + 'ⳳ' => 'Ⳳ', + 'ⴀ' => 'Ⴀ', + 'ⴁ' => 'Ⴁ', + 'ⴂ' => 'Ⴂ', + 'ⴃ' => 'Ⴃ', + 'ⴄ' => 'Ⴄ', + 'ⴅ' => 'Ⴅ', + 'ⴆ' => 'Ⴆ', + 'ⴇ' => 'Ⴇ', + 'ⴈ' => 'Ⴈ', + 'ⴉ' => 'Ⴉ', + 'ⴊ' => 'Ⴊ', + 'ⴋ' => 'Ⴋ', + 'ⴌ' => 'Ⴌ', + 'ⴍ' => 'Ⴍ', + 'ⴎ' => 'Ⴎ', + 'ⴏ' => 'Ⴏ', + 'ⴐ' => 'Ⴐ', + 'ⴑ' => 'Ⴑ', + 'ⴒ' => 'Ⴒ', + 'ⴓ' => 'Ⴓ', + 'ⴔ' => 'Ⴔ', + 'ⴕ' => 'Ⴕ', + 'ⴖ' => 'Ⴖ', + 'ⴗ' => 'Ⴗ', + 'ⴘ' => 'Ⴘ', + 'ⴙ' => 'Ⴙ', + 'ⴚ' => 'Ⴚ', + 'ⴛ' => 'Ⴛ', + 'ⴜ' => 'Ⴜ', + 'ⴝ' => 'Ⴝ', + 'ⴞ' => 'Ⴞ', + 'ⴟ' => 'Ⴟ', + 'ⴠ' => 'Ⴠ', + 'ⴡ' => 'Ⴡ', + 'ⴢ' => 'Ⴢ', + 'ⴣ' => 'Ⴣ', + 'ⴤ' => 'Ⴤ', + 'ⴥ' => 'Ⴥ', + 'ⴧ' => 'Ⴧ', + 'ⴭ' => 'Ⴭ', + 'ꙁ' => 'Ꙁ', + 'ꙃ' => 'Ꙃ', + 'ꙅ' => 'Ꙅ', + 'ꙇ' => 'Ꙇ', + 'ꙉ' => 'Ꙉ', + 'ꙋ' => 'Ꙋ', + 'ꙍ' => 'Ꙍ', + 'ꙏ' => 'Ꙏ', + 'ꙑ' => 'Ꙑ', + 'ꙓ' => 'Ꙓ', + 'ꙕ' => 'Ꙕ', + 'ꙗ' => 'Ꙗ', + 'ꙙ' => 'Ꙙ', + 'ꙛ' => 'Ꙛ', + 'ꙝ' => 'Ꙝ', + 'ꙟ' => 'Ꙟ', + 'ꙡ' => 'Ꙡ', + 'ꙣ' => 'Ꙣ', + 'ꙥ' => 'Ꙥ', + 'ꙧ' => 'Ꙧ', + 'ꙩ' => 'Ꙩ', + 'ꙫ' => 'Ꙫ', + 'ꙭ' => 'Ꙭ', + 'ꚁ' => 'Ꚁ', + 'ꚃ' => 'Ꚃ', + 'ꚅ' => 'Ꚅ', + 'ꚇ' => 'Ꚇ', + 'ꚉ' => 'Ꚉ', + 'ꚋ' => 'Ꚋ', + 'ꚍ' => 'Ꚍ', + 'ꚏ' => 'Ꚏ', + 'ꚑ' => 'Ꚑ', + 'ꚓ' => 'Ꚓ', + 'ꚕ' => 'Ꚕ', + 'ꚗ' => 'Ꚗ', + 'ꚙ' => 'Ꚙ', + 'ꚛ' => 'Ꚛ', + 'ꜣ' => 'Ꜣ', + 'ꜥ' => 'Ꜥ', + 'ꜧ' => 'Ꜧ', + 'ꜩ' => 'Ꜩ', + 'ꜫ' => 'Ꜫ', + 'ꜭ' => 'Ꜭ', + 'ꜯ' => 'Ꜯ', + 'ꜳ' => 'Ꜳ', + 'ꜵ' => 'Ꜵ', + 'ꜷ' => 'Ꜷ', + 'ꜹ' => 'Ꜹ', + 'ꜻ' => 'Ꜻ', + 'ꜽ' => 'Ꜽ', + 'ꜿ' => 'Ꜿ', + 'ꝁ' => 'Ꝁ', + 'ꝃ' => 'Ꝃ', + 'ꝅ' => 'Ꝅ', + 'ꝇ' => 'Ꝇ', + 'ꝉ' => 'Ꝉ', + 'ꝋ' => 'Ꝋ', + 'ꝍ' => 'Ꝍ', + 'ꝏ' => 'Ꝏ', + 'ꝑ' => 'Ꝑ', + 'ꝓ' => 'Ꝓ', + 'ꝕ' => 'Ꝕ', + 'ꝗ' => 'Ꝗ', + 'ꝙ' => 'Ꝙ', + 'ꝛ' => 'Ꝛ', + 'ꝝ' => 'Ꝝ', + 'ꝟ' => 'Ꝟ', + 'ꝡ' => 'Ꝡ', + 'ꝣ' => 'Ꝣ', + 'ꝥ' => 'Ꝥ', + 'ꝧ' => 'Ꝧ', + 'ꝩ' => 'Ꝩ', + 'ꝫ' => 'Ꝫ', + 'ꝭ' => 'Ꝭ', + 'ꝯ' => 'Ꝯ', + 'ꝺ' => 'Ꝺ', + 'ꝼ' => 'Ꝼ', + 'ꝿ' => 'Ꝿ', + 'ꞁ' => 'Ꞁ', + 'ꞃ' => 'Ꞃ', + 'ꞅ' => 'Ꞅ', + 'ꞇ' => 'Ꞇ', + 'ꞌ' => 'Ꞌ', + 'ꞑ' => 'Ꞑ', + 'ꞓ' => 'Ꞓ', + 'ꞔ' => 'Ꞔ', + 'ꞗ' => 'Ꞗ', + 'ꞙ' => 'Ꞙ', + 'ꞛ' => 'Ꞛ', + 'ꞝ' => 'Ꞝ', + 'ꞟ' => 'Ꞟ', + 'ꞡ' => 'Ꞡ', + 'ꞣ' => 'Ꞣ', + 'ꞥ' => 'Ꞥ', + 'ꞧ' => 'Ꞧ', + 'ꞩ' => 'Ꞩ', + 'ꞵ' => 'Ꞵ', + 'ꞷ' => 'Ꞷ', + 'ꞹ' => 'Ꞹ', + 'ꞻ' => 'Ꞻ', + 'ꞽ' => 'Ꞽ', + 'ꞿ' => 'Ꞿ', + 'ꟃ' => 'Ꟃ', + 'ꟈ' => 'Ꟈ', + 'ꟊ' => 'Ꟊ', + 'ꟶ' => 'Ꟶ', + 'ꭓ' => 'Ꭓ', + 'ꭰ' => 'Ꭰ', + 'ꭱ' => 'Ꭱ', + 'ꭲ' => 'Ꭲ', + 'ꭳ' => 'Ꭳ', + 'ꭴ' => 'Ꭴ', + 'ꭵ' => 'Ꭵ', + 'ꭶ' => 'Ꭶ', + 'ꭷ' => 'Ꭷ', + 'ꭸ' => 'Ꭸ', + 'ꭹ' => 'Ꭹ', + 'ꭺ' => 'Ꭺ', + 'ꭻ' => 'Ꭻ', + 'ꭼ' => 'Ꭼ', + 'ꭽ' => 'Ꭽ', + 'ꭾ' => 'Ꭾ', + 'ꭿ' => 'Ꭿ', + 'ꮀ' => 'Ꮀ', + 'ꮁ' => 'Ꮁ', + 'ꮂ' => 'Ꮂ', + 'ꮃ' => 'Ꮃ', + 'ꮄ' => 'Ꮄ', + 'ꮅ' => 'Ꮅ', + 'ꮆ' => 'Ꮆ', + 'ꮇ' => 'Ꮇ', + 'ꮈ' => 'Ꮈ', + 'ꮉ' => 'Ꮉ', + 'ꮊ' => 'Ꮊ', + 'ꮋ' => 'Ꮋ', + 'ꮌ' => 'Ꮌ', + 'ꮍ' => 'Ꮍ', + 'ꮎ' => 'Ꮎ', + 'ꮏ' => 'Ꮏ', + 'ꮐ' => 'Ꮐ', + 'ꮑ' => 'Ꮑ', + 'ꮒ' => 'Ꮒ', + 'ꮓ' => 'Ꮓ', + 'ꮔ' => 'Ꮔ', + 'ꮕ' => 'Ꮕ', + 'ꮖ' => 'Ꮖ', + 'ꮗ' => 'Ꮗ', + 'ꮘ' => 'Ꮘ', + 'ꮙ' => 'Ꮙ', + 'ꮚ' => 'Ꮚ', + 'ꮛ' => 'Ꮛ', + 'ꮜ' => 'Ꮜ', + 'ꮝ' => 'Ꮝ', + 'ꮞ' => 'Ꮞ', + 'ꮟ' => 'Ꮟ', + 'ꮠ' => 'Ꮠ', + 'ꮡ' => 'Ꮡ', + 'ꮢ' => 'Ꮢ', + 'ꮣ' => 'Ꮣ', + 'ꮤ' => 'Ꮤ', + 'ꮥ' => 'Ꮥ', + 'ꮦ' => 'Ꮦ', + 'ꮧ' => 'Ꮧ', + 'ꮨ' => 'Ꮨ', + 'ꮩ' => 'Ꮩ', + 'ꮪ' => 'Ꮪ', + 'ꮫ' => 'Ꮫ', + 'ꮬ' => 'Ꮬ', + 'ꮭ' => 'Ꮭ', + 'ꮮ' => 'Ꮮ', + 'ꮯ' => 'Ꮯ', + 'ꮰ' => 'Ꮰ', + 'ꮱ' => 'Ꮱ', + 'ꮲ' => 'Ꮲ', + 'ꮳ' => 'Ꮳ', + 'ꮴ' => 'Ꮴ', + 'ꮵ' => 'Ꮵ', + 'ꮶ' => 'Ꮶ', + 'ꮷ' => 'Ꮷ', + 'ꮸ' => 'Ꮸ', + 'ꮹ' => 'Ꮹ', + 'ꮺ' => 'Ꮺ', + 'ꮻ' => 'Ꮻ', + 'ꮼ' => 'Ꮼ', + 'ꮽ' => 'Ꮽ', + 'ꮾ' => 'Ꮾ', + 'ꮿ' => 'Ꮿ', + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + '𐐨' => '𐐀', + '𐐩' => '𐐁', + '𐐪' => '𐐂', + '𐐫' => '𐐃', + '𐐬' => '𐐄', + '𐐭' => '𐐅', + '𐐮' => '𐐆', + '𐐯' => '𐐇', + '𐐰' => '𐐈', + '𐐱' => '𐐉', + '𐐲' => '𐐊', + '𐐳' => '𐐋', + '𐐴' => '𐐌', + '𐐵' => '𐐍', + '𐐶' => '𐐎', + '𐐷' => '𐐏', + '𐐸' => '𐐐', + '𐐹' => '𐐑', + '𐐺' => '𐐒', + '𐐻' => '𐐓', + '𐐼' => '𐐔', + '𐐽' => '𐐕', + '𐐾' => '𐐖', + '𐐿' => '𐐗', + '𐑀' => '𐐘', + '𐑁' => '𐐙', + '𐑂' => '𐐚', + '𐑃' => '𐐛', + '𐑄' => '𐐜', + '𐑅' => '𐐝', + '𐑆' => '𐐞', + '𐑇' => '𐐟', + '𐑈' => '𐐠', + '𐑉' => '𐐡', + '𐑊' => '𐐢', + '𐑋' => '𐐣', + '𐑌' => '𐐤', + '𐑍' => '𐐥', + '𐑎' => '𐐦', + '𐑏' => '𐐧', + '𐓘' => '𐒰', + '𐓙' => '𐒱', + '𐓚' => '𐒲', + '𐓛' => '𐒳', + '𐓜' => '𐒴', + '𐓝' => '𐒵', + '𐓞' => '𐒶', + '𐓟' => '𐒷', + '𐓠' => '𐒸', + '𐓡' => '𐒹', + '𐓢' => '𐒺', + '𐓣' => '𐒻', + '𐓤' => '𐒼', + '𐓥' => '𐒽', + '𐓦' => '𐒾', + '𐓧' => '𐒿', + '𐓨' => '𐓀', + '𐓩' => '𐓁', + '𐓪' => '𐓂', + '𐓫' => '𐓃', + '𐓬' => '𐓄', + '𐓭' => '𐓅', + '𐓮' => '𐓆', + '𐓯' => '𐓇', + '𐓰' => '𐓈', + '𐓱' => '𐓉', + '𐓲' => '𐓊', + '𐓳' => '𐓋', + '𐓴' => '𐓌', + '𐓵' => '𐓍', + '𐓶' => '𐓎', + '𐓷' => '𐓏', + '𐓸' => '𐓐', + '𐓹' => '𐓑', + '𐓺' => '𐓒', + '𐓻' => '𐓓', + '𐳀' => '𐲀', + '𐳁' => '𐲁', + '𐳂' => '𐲂', + '𐳃' => '𐲃', + '𐳄' => '𐲄', + '𐳅' => '𐲅', + '𐳆' => '𐲆', + '𐳇' => '𐲇', + '𐳈' => '𐲈', + '𐳉' => '𐲉', + '𐳊' => '𐲊', + '𐳋' => '𐲋', + '𐳌' => '𐲌', + '𐳍' => '𐲍', + '𐳎' => '𐲎', + '𐳏' => '𐲏', + '𐳐' => '𐲐', + '𐳑' => '𐲑', + '𐳒' => '𐲒', + '𐳓' => '𐲓', + '𐳔' => '𐲔', + '𐳕' => '𐲕', + '𐳖' => '𐲖', + '𐳗' => '𐲗', + '𐳘' => '𐲘', + '𐳙' => '𐲙', + '𐳚' => '𐲚', + '𐳛' => '𐲛', + '𐳜' => '𐲜', + '𐳝' => '𐲝', + '𐳞' => '𐲞', + '𐳟' => '𐲟', + '𐳠' => '𐲠', + '𐳡' => '𐲡', + '𐳢' => '𐲢', + '𐳣' => '𐲣', + '𐳤' => '𐲤', + '𐳥' => '𐲥', + '𐳦' => '𐲦', + '𐳧' => '𐲧', + '𐳨' => '𐲨', + '𐳩' => '𐲩', + '𐳪' => '𐲪', + '𐳫' => '𐲫', + '𐳬' => '𐲬', + '𐳭' => '𐲭', + '𐳮' => '𐲮', + '𐳯' => '𐲯', + '𐳰' => '𐲰', + '𐳱' => '𐲱', + '𐳲' => '𐲲', + '𑣀' => '𑢠', + '𑣁' => '𑢡', + '𑣂' => '𑢢', + '𑣃' => '𑢣', + '𑣄' => '𑢤', + '𑣅' => '𑢥', + '𑣆' => '𑢦', + '𑣇' => '𑢧', + '𑣈' => '𑢨', + '𑣉' => '𑢩', + '𑣊' => '𑢪', + '𑣋' => '𑢫', + '𑣌' => '𑢬', + '𑣍' => '𑢭', + '𑣎' => '𑢮', + '𑣏' => '𑢯', + '𑣐' => '𑢰', + '𑣑' => '𑢱', + '𑣒' => '𑢲', + '𑣓' => '𑢳', + '𑣔' => '𑢴', + '𑣕' => '𑢵', + '𑣖' => '𑢶', + '𑣗' => '𑢷', + '𑣘' => '𑢸', + '𑣙' => '𑢹', + '𑣚' => '𑢺', + '𑣛' => '𑢻', + '𑣜' => '𑢼', + '𑣝' => '𑢽', + '𑣞' => '𑢾', + '𑣟' => '𑢿', + '𖹠' => '𖹀', + '𖹡' => '𖹁', + '𖹢' => '𖹂', + '𖹣' => '𖹃', + '𖹤' => '𖹄', + '𖹥' => '𖹅', + '𖹦' => '𖹆', + '𖹧' => '𖹇', + '𖹨' => '𖹈', + '𖹩' => '𖹉', + '𖹪' => '𖹊', + '𖹫' => '𖹋', + '𖹬' => '𖹌', + '𖹭' => '𖹍', + '𖹮' => '𖹎', + '𖹯' => '𖹏', + '𖹰' => '𖹐', + '𖹱' => '𖹑', + '𖹲' => '𖹒', + '𖹳' => '𖹓', + '𖹴' => '𖹔', + '𖹵' => '𖹕', + '𖹶' => '𖹖', + '𖹷' => '𖹗', + '𖹸' => '𖹘', + '𖹹' => '𖹙', + '𖹺' => '𖹚', + '𖹻' => '𖹛', + '𖹼' => '𖹜', + '𖹽' => '𖹝', + '𖹾' => '𖹞', + '𖹿' => '𖹟', + '𞤢' => '𞤀', + '𞤣' => '𞤁', + '𞤤' => '𞤂', + '𞤥' => '𞤃', + '𞤦' => '𞤄', + '𞤧' => '𞤅', + '𞤨' => '𞤆', + '𞤩' => '𞤇', + '𞤪' => '𞤈', + '𞤫' => '𞤉', + '𞤬' => '𞤊', + '𞤭' => '𞤋', + '𞤮' => '𞤌', + '𞤯' => '𞤍', + '𞤰' => '𞤎', + '𞤱' => '𞤏', + '𞤲' => '𞤐', + '𞤳' => '𞤑', + '𞤴' => '𞤒', + '𞤵' => '𞤓', + '𞤶' => '𞤔', + '𞤷' => '𞤕', + '𞤸' => '𞤖', + '𞤹' => '𞤗', + '𞤺' => '𞤘', + '𞤻' => '𞤙', + '𞤼' => '𞤚', + '𞤽' => '𞤛', + '𞤾' => '𞤜', + '𞤿' => '𞤝', + '𞥀' => '𞤞', + '𞥁' => '𞤟', + '𞥂' => '𞤠', + '𞥃' => '𞤡', + 'ß' => 'SS', + 'ff' => 'FF', + 'fi' => 'FI', + 'fl' => 'FL', + 'ffi' => 'FFI', + 'ffl' => 'FFL', + 'ſt' => 'ST', + 'st' => 'ST', + 'և' => 'ԵՒ', + 'ﬓ' => 'ՄՆ', + 'ﬔ' => 'ՄԵ', + 'ﬕ' => 'ՄԻ', + 'ﬖ' => 'ՎՆ', + 'ﬗ' => 'ՄԽ', + 'ʼn' => 'ʼN', + 'ΐ' => 'Ϊ́', + 'ΰ' => 'Ϋ́', + 'ǰ' => 'J̌', + 'ẖ' => 'H̱', + 'ẗ' => 'T̈', + 'ẘ' => 'W̊', + 'ẙ' => 'Y̊', + 'ẚ' => 'Aʾ', + 'ὐ' => 'Υ̓', + 'ὒ' => 'Υ̓̀', + 'ὔ' => 'Υ̓́', + 'ὖ' => 'Υ̓͂', + 'ᾶ' => 'Α͂', + 'ῆ' => 'Η͂', + 'ῒ' => 'Ϊ̀', + 'ΐ' => 'Ϊ́', + 'ῖ' => 'Ι͂', + 'ῗ' => 'Ϊ͂', + 'ῢ' => 'Ϋ̀', + 'ΰ' => 'Ϋ́', + 'ῤ' => 'Ρ̓', + 'ῦ' => 'Υ͂', + 'ῧ' => 'Ϋ͂', + 'ῶ' => 'Ω͂', + 'ᾈ' => 'ἈΙ', + 'ᾉ' => 'ἉΙ', + 'ᾊ' => 'ἊΙ', + 'ᾋ' => 'ἋΙ', + 'ᾌ' => 'ἌΙ', + 'ᾍ' => 'ἍΙ', + 'ᾎ' => 'ἎΙ', + 'ᾏ' => 'ἏΙ', + 'ᾘ' => 'ἨΙ', + 'ᾙ' => 'ἩΙ', + 'ᾚ' => 'ἪΙ', + 'ᾛ' => 'ἫΙ', + 'ᾜ' => 'ἬΙ', + 'ᾝ' => 'ἭΙ', + 'ᾞ' => 'ἮΙ', + 'ᾟ' => 'ἯΙ', + 'ᾨ' => 'ὨΙ', + 'ᾩ' => 'ὩΙ', + 'ᾪ' => 'ὪΙ', + 'ᾫ' => 'ὫΙ', + 'ᾬ' => 'ὬΙ', + 'ᾭ' => 'ὭΙ', + 'ᾮ' => 'ὮΙ', + 'ᾯ' => 'ὯΙ', + 'ᾼ' => 'ΑΙ', + 'ῌ' => 'ΗΙ', + 'ῼ' => 'ΩΙ', + 'ᾲ' => 'ᾺΙ', + 'ᾴ' => 'ΆΙ', + 'ῂ' => 'ῊΙ', + 'ῄ' => 'ΉΙ', + 'ῲ' => 'ῺΙ', + 'ῴ' => 'ΏΙ', + 'ᾷ' => 'Α͂Ι', + 'ῇ' => 'Η͂Ι', + 'ῷ' => 'Ω͂Ι', +); diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap.php b/upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap.php new file mode 100644 index 0000000..ff51ae0 --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language($language = null) { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } +} + +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + +if (!function_exists('mb_ucfirst')) { + function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } +} + +if (!function_exists('mb_lcfirst')) { + function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } +} + +if (!function_exists('mb_trim')) { + function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } +} + +if (!function_exists('mb_ltrim')) { + function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } +} + +if (!function_exists('mb_rtrim')) { + function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } +} + + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap80.php b/upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap80.php new file mode 100644 index 0000000..5236e6d --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -0,0 +1,167 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\Mbstring::mb_get_info((string) $type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } +} + +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + +if (!function_exists('mb_ucfirst')) { + function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } +} + +if (!function_exists('mb_lcfirst')) { + function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } +} + +if (!function_exists('mb_trim')) { + function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } +} + +if (!function_exists('mb_ltrim')) { + function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } +} + +if (!function_exists('mb_rtrim')) { + function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } +} + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/upLoadImage/vendor/symfony/polyfill-mbstring/composer.json b/upLoadImage/vendor/symfony/polyfill-mbstring/composer.json new file mode 100644 index 0000000..daa07f8 --- /dev/null +++ b/upLoadImage/vendor/symfony/polyfill-mbstring/composer.json @@ -0,0 +1,39 @@ +{ + "name": "symfony/polyfill-mbstring", + "type": "library", + "description": "Symfony polyfill for the Mbstring extension", + "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2", + "ext-iconv": "*" + }, + "provide": { + "ext-mbstring": "*" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/CHANGELOG.md b/upLoadImage/vendor/symfony/var-dumper/CHANGELOG.md new file mode 100644 index 0000000..209bd96 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/CHANGELOG.md @@ -0,0 +1,122 @@ +CHANGELOG +========= + +7.4 +--- + + * Add support for adding more default casters to `AbstractCloner::addDefaultCasters()` + * Select HtmlDumper only if `Accept` header contains "html" + +7.3 +--- + + * Add casters for `Dba\Connection`, `SQLite3Result`, `OpenSSLAsymmetricKey` and `OpenSSLCertificateSigningRequest` + * Deprecate `ResourceCaster::castCurl()`, `ResourceCaster::castGd()` and `ResourceCaster::castOpensslX509()` + * Mark all casters as `@internal` + +7.2 +--- + + * Add support for `FORCE_COLOR` environment variable + * Add support for virtual properties + +7.1 +--- + + * Add support for new DOM extension classes in `DOMCaster` + +7.0 +--- + + * Add argument `$label` to `VarDumper::dump()` + * Require explicit argument when calling `VarDumper::setHandler()` + * Remove display of backtrace in `Twig_Template`, only `Twig\Template` is supported + +6.4 +--- + + * Dump uninitialized properties + +6.3 +--- + + * Add caster for `WeakMap` + * Add support of named arguments to `dd()` and `dump()` to display the argument name + * Add support for `Relay\Relay` + * Add display of invisible characters + +6.2 +--- + + * Add support for `FFI\CData` and `FFI\CType` + * Deprecate calling `VarDumper::setHandler()` without arguments + +5.4 +--- + + * Add ability to style integer and double values independently + * Add casters for Symfony's UUIDs and ULIDs + * Add support for `Fiber` + +5.2.0 +----- + + * added support for PHPUnit `--colors` option + * added `VAR_DUMPER_FORMAT=server` env var value support + * prevent replacing the handler when the `VAR_DUMPER_FORMAT` env var is set + +5.1.0 +----- + + * added `RdKafka` support + +4.4.0 +----- + + * added `VarDumperTestTrait::setUpVarDumper()` and `VarDumperTestTrait::tearDownVarDumper()` + to configure casters & flags to use in tests + * added `ImagineCaster` and infrastructure to dump images + * added the stamps of a message after it is dispatched in `TraceableMessageBus` and `MessengerDataCollector` collected data + * added `UuidCaster` + * made all casters final + * added support for the `NO_COLOR` env var (https://no-color.org/) + +4.3.0 +----- + + * added `DsCaster` to support dumping the contents of data structures from the Ds extension + +4.2.0 +----- + + * support selecting the format to use by setting the environment variable `VAR_DUMPER_FORMAT` to `html` or `cli` + +4.1.0 +----- + + * added a `ServerDumper` to send serialized Data clones to a server + * added a `ServerDumpCommand` and `DumpServer` to run a server collecting + and displaying dumps on a single place with multiple formats support + * added `CliDescriptor` and `HtmlDescriptor` descriptors for `server:dump` CLI and HTML formats support + +4.0.0 +----- + + * support for passing `\ReflectionClass` instances to the `Caster::castObject()` + method has been dropped, pass class names as strings instead + * the `Data::getRawData()` method has been removed + * the `VarDumperTestTrait::assertDumpEquals()` method expects a 3rd `$filter = 0` + argument and moves `$message = ''` argument at 4th position. + * the `VarDumperTestTrait::assertDumpMatchesFormat()` method expects a 3rd `$filter = 0` + argument and moves `$message = ''` argument at 4th position. + +3.4.0 +----- + + * added `AbstractCloner::setMinDepth()` function to ensure minimum tree depth + * deprecated `MongoCaster` + +2.7.0 +----- + + * deprecated `Cloner\Data::getLimitedClone()`. Use `withMaxDepth`, `withMaxItemsPerDepth` or `withRefHandles` instead. diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/AddressInfoCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/AddressInfoCaster.php new file mode 100644 index 0000000..f341c68 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/AddressInfoCaster.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * + * @internal since Symfony 7.3 + */ +final class AddressInfoCaster +{ + private const MAPS = [ + 'ai_flags' => [ + 1 => 'AI_PASSIVE', + 2 => 'AI_CANONNAME', + 4 => 'AI_NUMERICHOST', + 8 => 'AI_V4MAPPED', + 16 => 'AI_ALL', + 32 => 'AI_ADDRCONFIG', + 64 => 'AI_IDN', + 128 => 'AI_CANONIDN', + 1024 => 'AI_NUMERICSERV', + ], + 'ai_family' => [ + 1 => 'AF_UNIX', + 2 => 'AF_INET', + 10 => 'AF_INET6', + 44 => 'AF_DIVERT', + ], + 'ai_socktype' => [ + 1 => 'SOCK_STREAM', + 2 => 'SOCK_DGRAM', + 3 => 'SOCK_RAW', + 4 => 'SOCK_RDM', + 5 => 'SOCK_SEQPACKET', + ], + 'ai_protocol' => [ + 1 => 'SOL_SOCKET', + 6 => 'SOL_TCP', + 17 => 'SOL_UDP', + 136 => 'SOL_UDPLITE', + ], + ]; + + public static function castAddressInfo(\AddressInfo $h, array $a, Stub $stub, bool $isNested): array + { + static $resolvedMaps; + + if (!$resolvedMaps) { + foreach (self::MAPS as $k => $map) { + foreach ($map as $v => $name) { + if (\defined($name)) { + $resolvedMaps[$k][\constant($name)] = $name; + } elseif (!isset($resolvedMaps[$k][$v])) { + $resolvedMaps[$k][$v] = $name; + } + } + } + } + + foreach (socket_addrinfo_explain($h) as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = match (true) { + 'ai_flags' === $k => ConstStub::fromBitfield($v, $resolvedMaps[$k]), + isset($resolvedMaps[$k][$v]) => new ConstStub($resolvedMaps[$k][$v], $v), + default => $v, + }; + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/AmqpCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/AmqpCaster.php new file mode 100644 index 0000000..ff56288 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/AmqpCaster.php @@ -0,0 +1,214 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Amqp related classes to array representation. + * + * @author Grégoire Pineau + * + * @final + * + * @internal since Symfony 7.3 + */ +class AmqpCaster +{ + private const FLAGS = [ + \AMQP_DURABLE => 'AMQP_DURABLE', + \AMQP_PASSIVE => 'AMQP_PASSIVE', + \AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE', + \AMQP_AUTODELETE => 'AMQP_AUTODELETE', + \AMQP_INTERNAL => 'AMQP_INTERNAL', + \AMQP_NOLOCAL => 'AMQP_NOLOCAL', + \AMQP_AUTOACK => 'AMQP_AUTOACK', + \AMQP_IFEMPTY => 'AMQP_IFEMPTY', + \AMQP_IFUNUSED => 'AMQP_IFUNUSED', + \AMQP_MANDATORY => 'AMQP_MANDATORY', + \AMQP_IMMEDIATE => 'AMQP_IMMEDIATE', + \AMQP_MULTIPLE => 'AMQP_MULTIPLE', + \AMQP_NOWAIT => 'AMQP_NOWAIT', + \AMQP_REQUEUE => 'AMQP_REQUEUE', + ]; + + private const EXCHANGE_TYPES = [ + \AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT', + \AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT', + \AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC', + \AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS', + ]; + + public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPConnection\x00login"])) { + return $a; + } + + // BC layer in the amqp lib + if (method_exists($c, 'getReadTimeout')) { + $timeout = $c->getReadTimeout(); + } else { + $timeout = $c->getTimeout(); + } + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + $prefix.'login' => $c->getLogin(), + $prefix.'password' => $c->getPassword(), + $prefix.'host' => $c->getHost(), + $prefix.'vhost' => $c->getVhost(), + $prefix.'port' => $c->getPort(), + $prefix.'read_timeout' => $timeout, + ]; + + return $a; + } + + public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + $prefix.'channel_id' => $c->getChannelId(), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPChannel\x00connection"])) { + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'prefetch_size' => $c->getPrefetchSize(), + $prefix.'prefetch_count' => $c->getPrefetchCount(), + ]; + + return $a; + } + + public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'flags' => self::extractFlags($c->getFlags()), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPQueue\x00name"])) { + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'channel' => $c->getChannel(), + $prefix.'name' => $c->getName(), + $prefix.'arguments' => $c->getArguments(), + ]; + + return $a; + } + + public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'flags' => self::extractFlags($c->getFlags()), + ]; + + $type = isset(self::EXCHANGE_TYPES[$c->getType()]) ? new ConstStub(self::EXCHANGE_TYPES[$c->getType()], $c->getType()) : $c->getType(); + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPExchange\x00name"])) { + $a["\x00AMQPExchange\x00type"] = $type; + + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'channel' => $c->getChannel(), + $prefix.'name' => $c->getName(), + $prefix.'type' => $type, + $prefix.'arguments' => $c->getArguments(), + ]; + + return $a; + } + + public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $deliveryMode = new ConstStub($c->getDeliveryMode().(2 === $c->getDeliveryMode() ? ' (persistent)' : ' (non-persistent)'), $c->getDeliveryMode()); + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPEnvelope\x00body"])) { + $a["\0AMQPEnvelope\0delivery_mode"] = $deliveryMode; + + return $a; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $a += [$prefix.'body' => $c->getBody()]; + } + + $a += [ + $prefix.'delivery_tag' => $c->getDeliveryTag(), + $prefix.'is_redelivery' => $c->isRedelivery(), + $prefix.'exchange_name' => $c->getExchangeName(), + $prefix.'routing_key' => $c->getRoutingKey(), + $prefix.'content_type' => $c->getContentType(), + $prefix.'content_encoding' => $c->getContentEncoding(), + $prefix.'headers' => $c->getHeaders(), + $prefix.'delivery_mode' => $deliveryMode, + $prefix.'priority' => $c->getPriority(), + $prefix.'correlation_id' => $c->getCorrelationId(), + $prefix.'reply_to' => $c->getReplyTo(), + $prefix.'expiration' => $c->getExpiration(), + $prefix.'message_id' => $c->getMessageId(), + $prefix.'timestamp' => $c->getTimeStamp(), + $prefix.'type' => $c->getType(), + $prefix.'user_id' => $c->getUserId(), + $prefix.'app_id' => $c->getAppId(), + ]; + + return $a; + } + + private static function extractFlags(int $flags): ConstStub + { + $flagsArray = []; + + foreach (self::FLAGS as $value => $name) { + if ($flags & $value) { + $flagsArray[] = $name; + } + } + + if (!$flagsArray) { + $flagsArray = ['AMQP_NOPARAM']; + } + + return new ConstStub(implode('|', $flagsArray), $flags); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ArgsStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ArgsStub.php new file mode 100644 index 0000000..aadd033 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ArgsStub.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a list of function arguments. + * + * @author Nicolas Grekas + */ +class ArgsStub extends EnumStub +{ + private static array $parameters = []; + + public function __construct(array $args, string $function, ?string $class) + { + [$variadic, $params] = self::getParameters($function, $class); + + $values = []; + foreach ($args as $k => $v) { + $values[$k] = !\is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v; + } + if (null === $params) { + parent::__construct($values, false); + + return; + } + if (\count($values) < \count($params)) { + $params = \array_slice($params, 0, \count($values)); + } elseif (\count($values) > \count($params)) { + $values[] = new EnumStub(array_splice($values, \count($params)), false); + $params[] = $variadic; + } + if (['...'] === $params) { + parent::__construct($values[0]->value, false); + } else { + parent::__construct(array_combine($params, $values)); + } + } + + private static function getParameters(string $function, ?string $class): array + { + if (isset(self::$parameters[$k = $class.'::'.$function])) { + return self::$parameters[$k]; + } + + try { + $r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function); + } catch (\ReflectionException) { + return [null, null]; + } + + $variadic = '...'; + $params = []; + foreach ($r->getParameters() as $v) { + $k = '$'.$v->name; + if ($v->isPassedByReference()) { + $k = '&'.$k; + } + if ($v->isVariadic()) { + $variadic .= $k; + } else { + $params[] = $k; + } + } + + return self::$parameters[$k] = [$variadic, $params]; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/Caster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/Caster.php new file mode 100644 index 0000000..c3bc54e --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/Caster.php @@ -0,0 +1,203 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Helper for filtering out properties in casters. + * + * @author Nicolas Grekas + * + * @final + */ +class Caster +{ + public const EXCLUDE_VERBOSE = 1; + public const EXCLUDE_VIRTUAL = 2; + public const EXCLUDE_DYNAMIC = 4; + public const EXCLUDE_PUBLIC = 8; + public const EXCLUDE_PROTECTED = 16; + public const EXCLUDE_PRIVATE = 32; + public const EXCLUDE_NULL = 64; + public const EXCLUDE_EMPTY = 128; + public const EXCLUDE_NOT_IMPORTANT = 256; + public const EXCLUDE_STRICT = 512; + public const EXCLUDE_UNINITIALIZED = 1024; + + public const PREFIX_VIRTUAL = "\0~\0"; + public const PREFIX_DYNAMIC = "\0+\0"; + public const PREFIX_PROTECTED = "\0*\0"; + // usage: sprintf(Caster::PATTERN_PRIVATE, $class, $property) + public const PATTERN_PRIVATE = "\0%s\0%s"; + + private static array $classProperties = []; + + /** + * Casts objects to arrays and adds the dynamic property prefix. + * + * @param bool $hasDebugInfo Whether the __debugInfo method exists on $obj or not + * + * @internal since Symfony 7.3 + */ + public static function castObject(object $obj, string $class, bool $hasDebugInfo = false, ?string $debugClass = null): array + { + if ($hasDebugInfo) { + try { + $debugInfo = $obj->__debugInfo(); + } catch (\Throwable) { + // ignore failing __debugInfo() + $hasDebugInfo = false; + } + } + + $a = $obj instanceof \Closure ? [] : (array) $obj; + + if ($obj instanceof \__PHP_Incomplete_Class) { + return $a; + } + + $classProperties = self::$classProperties[$class] ??= self::getClassProperties(new \ReflectionClass($class)); + $a = array_replace($classProperties, $a); + + if ($a) { + $debugClass ??= get_debug_type($obj); + + $i = 0; + $prefixedKeys = []; + foreach ($a as $k => $v) { + if ("\0" !== ($k[0] ?? '')) { + if (!isset($classProperties[$k])) { + $prefixedKeys[$i] = self::PREFIX_DYNAMIC.$k; + } + } elseif ($debugClass !== $class && 1 === strpos($k, $class)) { + $prefixedKeys[$i] = "\0".$debugClass.strrchr($k, "\0"); + } + ++$i; + } + if ($prefixedKeys) { + $keys = array_keys($a); + foreach ($prefixedKeys as $i => $k) { + $keys[$i] = $k; + } + $a = array_combine($keys, $a); + } + } + + if ($hasDebugInfo && \is_array($debugInfo)) { + foreach ($debugInfo as $k => $v) { + if (!isset($k[0]) || "\0" !== $k[0]) { + if (\array_key_exists(self::PREFIX_DYNAMIC.$k, $a)) { + continue; + } + $k = self::PREFIX_VIRTUAL.$k; + } + + unset($a[$k]); + $a[$k] = $v; + } + } + + return $a; + } + + /** + * Filters out the specified properties. + * + * By default, a single match in the $filter bit field filters properties out, following an "or" logic. + * When EXCLUDE_STRICT is set, an "and" logic is applied: all bits must match for a property to be removed. + * + * @param array $a The array containing the properties to filter + * @param int $filter A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out + * @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set + * @param int|null &$count Set to the number of removed properties + */ + public static function filter(array $a, int $filter, array $listedProperties = [], ?int &$count = 0): array + { + $count = 0; + + foreach ($a as $k => $v) { + $type = self::EXCLUDE_STRICT & $filter; + + if (null === $v) { + $type |= self::EXCLUDE_NULL & $filter; + $type |= self::EXCLUDE_EMPTY & $filter; + } elseif (false === $v || '' === $v || '0' === $v || 0 === $v || 0.0 === $v || [] === $v) { + $type |= self::EXCLUDE_EMPTY & $filter; + } elseif ($v instanceof UninitializedStub) { + $type |= self::EXCLUDE_UNINITIALIZED & $filter; + } + if ((self::EXCLUDE_NOT_IMPORTANT & $filter) && !\in_array($k, $listedProperties, true)) { + $type |= self::EXCLUDE_NOT_IMPORTANT; + } + if ((self::EXCLUDE_VERBOSE & $filter) && \in_array($k, $listedProperties, true)) { + $type |= self::EXCLUDE_VERBOSE; + } + + if (!isset($k[1]) || "\0" !== $k[0]) { + $type |= self::EXCLUDE_PUBLIC & $filter; + } elseif ('~' === $k[1]) { + $type |= self::EXCLUDE_VIRTUAL & $filter; + } elseif ('+' === $k[1]) { + $type |= self::EXCLUDE_DYNAMIC & $filter; + } elseif ('*' === $k[1]) { + $type |= self::EXCLUDE_PROTECTED & $filter; + } else { + $type |= self::EXCLUDE_PRIVATE & $filter; + } + + if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) { + unset($a[$k]); + ++$count; + } + } + + return $a; + } + + /** + * @internal since Symfony 7.3 + */ + public static function castPhpIncompleteClass(\__PHP_Incomplete_Class $c, array $a, Stub $stub, bool $isNested): array + { + if (isset($a['__PHP_Incomplete_Class_Name'])) { + $stub->class .= '('.$a['__PHP_Incomplete_Class_Name'].')'; + unset($a['__PHP_Incomplete_Class_Name']); + } + + return $a; + } + + private static function getClassProperties(\ReflectionClass $class): array + { + $classProperties = []; + $className = $class->name; + + if ($parent = $class->getParentClass()) { + $classProperties += self::$classProperties[$parent->name] ??= self::getClassProperties($parent); + } + + foreach ($class->getProperties() as $p) { + if ($p->isStatic()) { + continue; + } + + $classProperties[match (true) { + $p->isPublic() => $p->name, + $p->isProtected() => self::PREFIX_PROTECTED.$p->name, + default => "\0".$className."\0".$p->name, + }] = \PHP_VERSION_ID >= 80400 && $p->isVirtual() ? new VirtualStub($p) : new UninitializedStub($p); + } + + return $classProperties; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ClassStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ClassStub.php new file mode 100644 index 0000000..265baa5 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ClassStub.php @@ -0,0 +1,104 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a PHP class identifier. + * + * @author Nicolas Grekas + */ +class ClassStub extends ConstStub +{ + /** + * @param string $identifier A PHP identifier, e.g. a class, method, interface, etc. name + * @param callable $callable The callable targeted by the identifier when it is ambiguous or not a real PHP identifier + */ + public function __construct(string $identifier, callable|array|string|null $callable = null) + { + $this->value = $identifier; + + try { + if (null !== $callable) { + if ($callable instanceof \Closure) { + $r = new \ReflectionFunction($callable); + } elseif (\is_object($callable)) { + $r = [$callable, '__invoke']; + } elseif (\is_array($callable)) { + $r = $callable; + } elseif (false !== $i = strpos($callable, '::')) { + $r = [substr($callable, 0, $i), substr($callable, 2 + $i)]; + } else { + $r = new \ReflectionFunction($callable); + } + } elseif (0 < $i = strpos($identifier, '::') ?: strpos($identifier, '->')) { + $r = [substr($identifier, 0, $i), substr($identifier, 2 + $i)]; + } else { + $r = new \ReflectionClass($identifier); + } + + if (\is_array($r)) { + try { + $r = new \ReflectionMethod($r[0], $r[1]); + } catch (\ReflectionException) { + $r = new \ReflectionClass($r[0]); + } + } + + if (str_contains($identifier, "@anonymous\0")) { + $this->value = $identifier = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $identifier); + } + + if (null !== $callable && $r instanceof \ReflectionFunctionAbstract) { + $s = ReflectionCaster::castFunctionAbstract($r, [], new Stub(), true, Caster::EXCLUDE_VERBOSE); + $s = ReflectionCaster::getSignature($s); + + if (str_ends_with($identifier, '()')) { + $this->value = substr_replace($identifier, $s, -2); + } else { + $this->value .= $s; + } + } + } catch (\ReflectionException) { + return; + } finally { + if (0 < $i = strrpos($this->value, '\\')) { + $this->attr['ellipsis'] = \strlen($this->value) - $i; + $this->attr['ellipsis-type'] = 'class'; + $this->attr['ellipsis-tail'] = 1; + } + } + + if ($f = $r->getFileName()) { + $this->attr['file'] = $f; + $this->attr['line'] = $r->getStartLine(); + } + } + + public static function wrapCallable(mixed $callable): mixed + { + if (\is_object($callable) || !\is_callable($callable)) { + return $callable; + } + + if (!\is_array($callable)) { + $callable = new static($callable, $callable); + } elseif (\is_string($callable[0])) { + $callable[0] = new static($callable[0], $callable); + } else { + $callable[1] = new static($callable[1], $callable); + } + + return $callable; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ConstStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ConstStub.php new file mode 100644 index 0000000..adea786 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ConstStub.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a PHP constant and its value. + * + * @author Nicolas Grekas + */ +class ConstStub extends Stub +{ + public function __construct(string $name, string|int|float|null $value = null) + { + $this->class = $name; + $this->value = 1 < \func_num_args() ? $value : $name; + } + + public function __toString(): string + { + return (string) $this->value; + } + + /** + * @param array $values + */ + public static function fromBitfield(int $value, array $values): self + { + $names = []; + foreach ($values as $v => $name) { + if ($value & $v) { + $names[] = $name; + } + } + + if (!$names) { + $names[] = $values[0] ?? 0; + } + + return new self(implode(' | ', $names), $value); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/CurlCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/CurlCaster.php new file mode 100644 index 0000000..fe4ec52 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/CurlCaster.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * + * @internal + */ +final class CurlCaster +{ + public static function castCurl(\CurlHandle $h, array $a, Stub $stub, bool $isNested): array + { + foreach (curl_getinfo($h) as $key => $val) { + $a[Caster::PREFIX_VIRTUAL.$key] = $val; + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/CutArrayStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/CutArrayStub.php new file mode 100644 index 0000000..5912e13 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/CutArrayStub.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a cut array. + * + * @author Nicolas Grekas + */ +class CutArrayStub extends CutStub +{ + public array $preservedSubset; + + public function __construct(array $value, array $preservedKeys) + { + parent::__construct($value); + + $this->preservedSubset = array_intersect_key($value, array_flip($preservedKeys)); + $this->cut -= \count($this->preservedSubset); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/CutStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/CutStub.php new file mode 100644 index 0000000..6870a9c --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/CutStub.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents the main properties of a PHP variable, pre-casted by a caster. + * + * @author Nicolas Grekas + */ +class CutStub extends Stub +{ + public function __construct(mixed $value) + { + $this->value = $value; + + switch (\gettype($value)) { + case 'object': + $this->type = self::TYPE_OBJECT; + $this->class = get_debug_type($value); + + if ($value instanceof \Closure) { + ReflectionCaster::castClosure($value, [], $this, true, Caster::EXCLUDE_VERBOSE); + } + + $this->cut = -1; + break; + + case 'array': + $this->type = self::TYPE_ARRAY; + $this->class = self::ARRAY_ASSOC; + $this->cut = $this->value = \count($value); + break; + + case 'resource': + case 'unknown type': + case 'resource (closed)': + $this->type = self::TYPE_RESOURCE; + $this->handle = (int) $value; + if ('Unknown' === $this->class = @get_resource_type($value)) { + $this->class = 'Closed'; + } + $this->cut = -1; + break; + + case 'string': + $this->type = self::TYPE_STRING; + $this->class = preg_match('//u', $value) ? self::STRING_UTF8 : self::STRING_BINARY; + $this->cut = self::STRING_BINARY === $this->class ? \strlen($value) : mb_strlen($value, 'UTF-8'); + $this->value = ''; + break; + } + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/DOMCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/DOMCaster.php new file mode 100644 index 0000000..10fefed --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/DOMCaster.php @@ -0,0 +1,209 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts DOM related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class DOMCaster +{ + private const ERROR_CODES = [ + 0 => 'DOM_PHP_ERR', + \DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR', + \DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR', + \DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR', + \DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR', + \DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR', + \DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR', + \DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR', + \DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR', + \DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR', + \DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR', + \DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR', + \DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR', + \DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR', + \DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR', + \DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR', + \DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR', + ]; + + private const NODE_TYPES = [ + \XML_ELEMENT_NODE => 'XML_ELEMENT_NODE', + \XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE', + \XML_TEXT_NODE => 'XML_TEXT_NODE', + \XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE', + \XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE', + \XML_ENTITY_NODE => 'XML_ENTITY_NODE', + \XML_PI_NODE => 'XML_PI_NODE', + \XML_COMMENT_NODE => 'XML_COMMENT_NODE', + \XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE', + \XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE', + \XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE', + \XML_NOTATION_NODE => 'XML_NOTATION_NODE', + \XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE', + \XML_DTD_NODE => 'XML_DTD_NODE', + \XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE', + \XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE', + \XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE', + \XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE', + ]; + + public static function castException(\DOMException|\Dom\Exception $e, array $a, Stub $stub, bool $isNested): array + { + $k = Caster::PREFIX_PROTECTED.'code'; + if (isset($a[$k], self::ERROR_CODES[$a[$k]])) { + $a[$k] = new ConstStub(self::ERROR_CODES[$a[$k]], $a[$k]); + } + + return $a; + } + + public static function castLength($dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castImplementation(\DOMImplementation|\Dom\Implementation $dom, array $a, Stub $stub, bool $isNested): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'Core' => '1.0', + Caster::PREFIX_VIRTUAL.'XML' => '2.0', + ]; + + return $a; + } + + public static function castNode(\DOMNode|\Dom\Node $dom, array $a, Stub $stub, bool $isNested): array + { + return self::castDom($dom, $a, $stub, $isNested); + } + + public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, bool $isNested): array + { + return self::castDom($dom, $a, $stub, $isNested); + } + + public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $formatOutput = $dom->formatOutput; + $dom->formatOutput = true; + $a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()]; + $dom->formatOutput = $formatOutput; + } + + return $a; + } + + public static function castXMLDocument(\Dom\XMLDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $formatOutput = $dom->formatOutput; + $dom->formatOutput = true; + $a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()]; + $dom->formatOutput = $formatOutput; + } + + return $a; + } + + public static function castHTMLDocument(\Dom\HTMLDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $a += [Caster::PREFIX_VIRTUAL.'html' => $dom->saveHTML()]; + } + + return $a; + } + + public static function castCharacterData(\DOMCharacterData|\Dom\CharacterData $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castAttr(\DOMAttr|\Dom\Attr $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castElement(\DOMElement|\Dom\Element $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castText(\DOMText|\Dom\Text $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castDocumentType(\DOMDocumentType|\Dom\DocumentType $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castNotation(\DOMNotation|\Dom\Notation $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castEntity(\DOMEntity|\Dom\Entity $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castProcessingInstruction(\DOMProcessingInstruction|\Dom\ProcessingInstruction $dom, array $a, Stub $stub, bool $isNested): array + { + return $a; + } + + public static function castXPath(\DOMXPath|\Dom\XPath $dom, array $a, Stub $stub, bool $isNested): array + { + return self::castDom($dom, $a, $stub, $isNested); + } + + public static function castDom($dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + foreach ($a as $k => $v) { + if ('encoding' === $k && $dom instanceof \DOMEntity + || \in_array($k, ['actualEncoding', 'config', 'standalone', 'version'], true) + ) { + continue; // deprecated properties + } + + $v = $dom->$k; + + $a[$k] = match (true) { + $v instanceof \DOMNode || $v instanceof \Dom\Node => new CutStub($v), + 'nodeType' === $k => new ConstStub(self::NODE_TYPES[$v], $v), + 'baseURI' === $k && $v, + 'documentURI' === $k && $v => new LinkStub($v), + default => $v, + }; + } + + if ($dom instanceof \IteratorAggregate) { + foreach ($dom as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/DateCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/DateCaster.php new file mode 100644 index 0000000..453d0cb --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/DateCaster.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts DateTimeInterface related classes to array representation. + * + * @author Dany Maillard + * + * @final + * + * @internal since Symfony 7.3 + */ +class DateCaster +{ + private const PERIOD_LIMIT = 3; + + public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, bool $isNested, int $filter): array + { + $prefix = Caster::PREFIX_VIRTUAL; + $location = $d->getTimezone() ? $d->getTimezone()->getLocation() : null; + $fromNow = (new \DateTimeImmutable())->diff($d); + + $title = $d->format('l, F j, Y') + ."\n".self::formatInterval($fromNow).' from now' + .($location ? ($d->format('I') ? "\nDST On" : "\nDST Off") : '') + ; + + unset( + $a[Caster::PREFIX_DYNAMIC.'date'], + $a[Caster::PREFIX_DYNAMIC.'timezone'], + $a[Caster::PREFIX_DYNAMIC.'timezone_type'] + ); + $a[$prefix.'date'] = new ConstStub(self::formatDateTime($d, $location ? ' e (P)' : ' P'), $title); + + $stub->class .= $d->format(' @U'); + + return $a; + } + + public static function castInterval(\DateInterval $interval, array $a, Stub $stub, bool $isNested, int $filter): array + { + $now = new \DateTimeImmutable('@0', new \DateTimeZone('UTC')); + $numberOfSeconds = $now->add($interval)->getTimestamp() - $now->getTimestamp(); + $title = number_format($numberOfSeconds, 0, '.', ' ').'s'; + + $i = [Caster::PREFIX_VIRTUAL.'interval' => new ConstStub(self::formatInterval($interval), $title)]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $i : $i + $a; + } + + private static function formatInterval(\DateInterval $i): string + { + $format = '%R '; + + if (0 === $i->y && 0 === $i->m && ($i->h >= 24 || $i->i >= 60 || $i->s >= 60)) { + $d = new \DateTimeImmutable('@0', new \DateTimeZone('UTC')); + $i = $d->diff($d->add($i)); // recalculate carry over points + $format .= 0 < $i->days ? '%ad ' : ''; + } else { + $format .= ($i->y ? '%yy ' : '').($i->m ? '%mm ' : '').($i->d ? '%dd ' : ''); + } + + $format .= $i->h || $i->i || $i->s || $i->f ? '%H:%I:'.self::formatSeconds($i->s, substr($i->f, 2)) : ''; + $format = '%R ' === $format ? '0s' : $format; + + return $i->format(rtrim($format)); + } + + public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stub, bool $isNested, int $filter): array + { + $location = $timeZone->getLocation(); + $formatted = (new \DateTimeImmutable('now', $timeZone))->format($location ? 'e (P)' : 'P'); + $title = $location && \extension_loaded('intl') ? \Locale::getDisplayRegion('-'.$location['country_code']) : ''; + + $z = [Caster::PREFIX_VIRTUAL.'timezone' => new ConstStub($formatted, $title)]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $z : $z + $a; + } + + public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, bool $isNested, int $filter): array + { + $dates = []; + foreach (clone $p as $i => $d) { + if (self::PERIOD_LIMIT === $i) { + $now = new \DateTimeImmutable('now', new \DateTimeZone('UTC')); + $dates[] = \sprintf('%s more', ($end = $p->getEndDate()) + ? ceil(($end->format('U.u') - $d->format('U.u')) / ((int) $now->add($p->getDateInterval())->format('U.u') - (int) $now->format('U.u'))) + : $p->recurrences - $i + ); + break; + } + $dates[] = \sprintf('%s) %s', $i + 1, self::formatDateTime($d)); + } + + $period = \sprintf( + 'every %s, from %s%s %s', + self::formatInterval($p->getDateInterval()), + $p->include_start_date ? '[' : ']', + self::formatDateTime($p->getStartDate()), + ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end).($p->include_end_date ? ']' : '[') : 'recurring '.$p->recurrences.' time/s' + ); + + $p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $p : $p + $a; + } + + private static function formatDateTime(\DateTimeInterface $d, string $extra = ''): string + { + return $d->format('Y-m-d H:i:'.self::formatSeconds($d->format('s'), $d->format('u')).$extra); + } + + private static function formatSeconds(string $s, string $us): string + { + return \sprintf('%02d.%s', $s, 0 === ($len = \strlen($t = rtrim($us, '0'))) ? '0' : ($len <= 3 ? str_pad($t, 3, '0') : $us)); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/DoctrineCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/DoctrineCaster.php new file mode 100644 index 0000000..b963112 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/DoctrineCaster.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Doctrine\Common\Proxy\Proxy as CommonProxy; +use Doctrine\ORM\PersistentCollection; +use Doctrine\ORM\Proxy\Proxy as OrmProxy; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Doctrine related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class DoctrineCaster +{ + public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, bool $isNested): array + { + foreach (['__cloner__', '__initializer__'] as $k) { + if (\array_key_exists($k, $a)) { + unset($a[$k]); + ++$stub->cut; + } + } + + return $a; + } + + public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, bool $isNested): array + { + foreach (['_entityPersister', '_identifier'] as $k) { + if (\array_key_exists($k = "\0Doctrine\\ORM\\Proxy\\Proxy\0".$k, $a)) { + unset($a[$k]); + ++$stub->cut; + } + } + + return $a; + } + + public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, bool $isNested): array + { + foreach (['snapshot', 'association', 'typeClass'] as $k) { + if (\array_key_exists($k = "\0Doctrine\\ORM\\PersistentCollection\0".$k, $a)) { + $a[$k] = new CutStub($a[$k]); + } + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/DsCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/DsCaster.php new file mode 100644 index 0000000..b34b670 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/DsCaster.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Ds\Collection; +use Ds\Map; +use Ds\Pair; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Ds extension classes to array representation. + * + * @author Jáchym Toušek + * + * @final + */ +class DsCaster +{ + public static function castCollection(Collection $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'count'] = $c->count(); + $a[Caster::PREFIX_VIRTUAL.'capacity'] = $c->capacity(); + + if (!$c instanceof Map) { + $a += $c->toArray(); + } + + return $a; + } + + public static function castMap(Map $c, array $a, Stub $stub, bool $isNested): array + { + foreach ($c as $k => $v) { + $a[] = new DsPairStub($k, $v); + } + + return $a; + } + + public static function castPair(Pair $c, array $a, Stub $stub, bool $isNested): array + { + foreach ($c->toArray() as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + + return $a; + } + + public static function castPairStub(DsPairStub $c, array $a, Stub $stub, bool $isNested): array + { + if ($isNested) { + $stub->class = Pair::class; + $stub->value = null; + $stub->handle = 0; + + $a = $c->value; + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/DsPairStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/DsPairStub.php new file mode 100644 index 0000000..afa2727 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/DsPairStub.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + */ +class DsPairStub extends Stub +{ + public function __construct(mixed $key, mixed $value) + { + $this->value = [ + Caster::PREFIX_VIRTUAL.'key' => $key, + Caster::PREFIX_VIRTUAL.'value' => $value, + ]; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/EnumStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/EnumStub.php new file mode 100644 index 0000000..11e0cd9 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/EnumStub.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents an enumeration of values. + * + * @author Nicolas Grekas + */ +class EnumStub extends Stub +{ + public function __construct( + array $values, + public bool $dumpKeys = true, + ) { + $this->value = $values; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ExceptionCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ExceptionCaster.php new file mode 100644 index 0000000..4473bdc --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ExceptionCaster.php @@ -0,0 +1,397 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext; +use Symfony\Component\VarDumper\Cloner\Stub; +use Symfony\Component\VarDumper\Exception\ThrowingCasterException; + +/** + * Casts common Exception classes to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class ExceptionCaster +{ + public static int $srcContext = 1; + public static bool $traceArgs = true; + public static array $errorTypes = [ + \E_DEPRECATED => 'E_DEPRECATED', + \E_USER_DEPRECATED => 'E_USER_DEPRECATED', + \E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', + \E_ERROR => 'E_ERROR', + \E_WARNING => 'E_WARNING', + \E_PARSE => 'E_PARSE', + \E_NOTICE => 'E_NOTICE', + \E_CORE_ERROR => 'E_CORE_ERROR', + \E_CORE_WARNING => 'E_CORE_WARNING', + \E_COMPILE_ERROR => 'E_COMPILE_ERROR', + \E_COMPILE_WARNING => 'E_COMPILE_WARNING', + \E_USER_ERROR => 'E_USER_ERROR', + \E_USER_WARNING => 'E_USER_WARNING', + \E_USER_NOTICE => 'E_USER_NOTICE', + 2048 => 'E_STRICT', + ]; + + private static array $framesCache = []; + + public static function castError(\Error $e, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + return self::filterExceptionArray($stub->class, $a, "\0Error\0", $filter); + } + + public static function castException(\Exception $e, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + return self::filterExceptionArray($stub->class, $a, "\0Exception\0", $filter); + } + + public static function castErrorException(\ErrorException $e, array $a, Stub $stub, bool $isNested): array + { + if (isset($a[$s = Caster::PREFIX_PROTECTED.'severity'], self::$errorTypes[$a[$s]])) { + $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); + } + + return $a; + } + + public static function castThrowingCasterException(ThrowingCasterException $e, array $a, Stub $stub, bool $isNested): array + { + $trace = Caster::PREFIX_VIRTUAL.'trace'; + $prefix = Caster::PREFIX_PROTECTED; + $xPrefix = "\0Exception\0"; + + if (isset($a[$xPrefix.'previous'], $a[$trace]) && $a[$xPrefix.'previous'] instanceof \Exception) { + $b = (array) $a[$xPrefix.'previous']; + $class = get_debug_type($a[$xPrefix.'previous']); + self::traceUnshift($b[$xPrefix.'trace'], $class, $b[$prefix.'file'], $b[$prefix.'line']); + $a[$trace] = new TraceStub($b[$xPrefix.'trace'], false, 0, -\count($a[$trace]->value)); + } + + unset($a[$xPrefix.'previous'], $a[$prefix.'code'], $a[$prefix.'file'], $a[$prefix.'line']); + + return $a; + } + + public static function castSilencedErrorContext(SilencedErrorContext $e, array $a, Stub $stub, bool $isNested): array + { + $sPrefix = "\0".SilencedErrorContext::class."\0"; + + if (!isset($a[$s = $sPrefix.'severity'])) { + return $a; + } + + if (isset(self::$errorTypes[$a[$s]])) { + $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); + } + + $trace = [[ + 'file' => $a[$sPrefix.'file'], + 'line' => $a[$sPrefix.'line'], + ]]; + + if (isset($a[$sPrefix.'trace'])) { + $trace = array_merge($trace, $a[$sPrefix.'trace']); + } + + unset($a[$sPrefix.'file'], $a[$sPrefix.'line'], $a[$sPrefix.'trace']); + $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); + + return $a; + } + + public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, bool $isNested): array + { + if (!$isNested) { + return $a; + } + $stub->class = ''; + $stub->handle = 0; + $frames = $trace->value; + $prefix = Caster::PREFIX_VIRTUAL; + + $a = []; + $j = \count($frames); + if (0 > $i = $trace->sliceOffset) { + $i = max(0, $j + $i); + } + if (!isset($trace->value[$i])) { + return []; + } + $lastCall = isset($frames[$i]['function']) ? (isset($frames[$i]['class']) ? $frames[0]['class'].$frames[$i]['type'] : '').$frames[$i]['function'].'()' : ''; + $frames[] = ['function' => '']; + $collapse = false; + + for ($j += $trace->numberingOffset - $i++; isset($frames[$i]); ++$i, --$j) { + $f = $frames[$i]; + $call = isset($f['function']) ? (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'] : '???'; + + $frame = new FrameStub( + [ + 'object' => $f['object'] ?? null, + 'class' => $f['class'] ?? null, + 'type' => $f['type'] ?? null, + 'function' => $f['function'] ?? null, + ] + $frames[$i - 1], + false, + true + ); + $f = self::castFrameStub($frame, [], $frame, true); + if (isset($f[$prefix.'src'])) { + foreach ($f[$prefix.'src']->value as $label => $frame) { + if (str_starts_with($label, "\0~collapse=0")) { + if ($collapse) { + $label = substr_replace($label, '1', 11, 1); + } else { + $collapse = true; + } + } + $label = substr_replace($label, "title=Stack level $j.&", 2, 0); + } + $f = $frames[$i - 1]; + if ($trace->keepArgs && !empty($f['args']) && $frame instanceof EnumStub) { + $frame->value['arguments'] = new ArgsStub($f['args'], $f['function'] ?? null, $f['class'] ?? null); + } + } elseif ('???' !== $lastCall) { + $label = new ClassStub($lastCall); + if (isset($label->attr['ellipsis'])) { + $label->attr['ellipsis'] += 2; + $label = substr_replace($prefix, "ellipsis-type=class&ellipsis={$label->attr['ellipsis']}&ellipsis-tail=1&title=Stack level $j.", 2, 0).$label->value.'()'; + } else { + $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$label->value.'()'; + } + } else { + $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$lastCall; + } + $a[substr_replace($label, \sprintf('separator=%s&', $frame instanceof EnumStub ? ' ' : ':'), 2, 0)] = $frame; + + $lastCall = $call; + } + if (null !== $trace->sliceLength) { + $a = \array_slice($a, 0, $trace->sliceLength, true); + } + + return $a; + } + + public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, bool $isNested): array + { + if (!$isNested) { + return $a; + } + $f = $frame->value; + $prefix = Caster::PREFIX_VIRTUAL; + + if (isset($f['file'], $f['line'])) { + $cacheKey = $f; + unset($cacheKey['object'], $cacheKey['args']); + $cacheKey[] = self::$srcContext; + $cacheKey = implode('-', $cacheKey); + + if (isset(self::$framesCache[$cacheKey])) { + $a[$prefix.'src'] = self::$framesCache[$cacheKey]; + } else { + if (preg_match('/\((\d+)\)(?:\([\da-f]{32}\))? : (?:eval\(\)\'d code|runtime-created function)$/', $f['file'], $match)) { + $f['file'] = substr($f['file'], 0, -\strlen($match[0])); + $f['line'] = (int) $match[1]; + } + $src = $f['line']; + $srcKey = $f['file']; + $ellipsis = new LinkStub($srcKey, 0); + $srcAttr = 'collapse='.(int) $ellipsis->inVendor; + $ellipsisTail = $ellipsis->attr['ellipsis-tail'] ?? 0; + $ellipsis = $ellipsis->attr['ellipsis'] ?? 0; + + if (is_file($f['file']) && 0 <= self::$srcContext) { + if (!empty($f['class']) && is_subclass_of($f['class'], 'Twig\Template')) { + $template = null; + if (isset($f['object'])) { + $template = $f['object']; + } elseif ((new \ReflectionClass($f['class']))->isInstantiable()) { + $template = unserialize(\sprintf('O:%d:"%s":0:{}', \strlen($f['class']), $f['class'])); + } + if (null !== $template) { + $ellipsis = 0; + $templateSrc = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : ''); + $templateInfo = $template->getDebugInfo(); + if (isset($templateInfo[$f['line']])) { + if (!method_exists($template, 'getSourceContext') || !is_file($templatePath = $template->getSourceContext()->getPath())) { + $templatePath = null; + } + if ($templateSrc) { + $src = self::extractSource($templateSrc, $templateInfo[$f['line']], self::$srcContext, 'twig', $templatePath, $f); + $srcKey = ($templatePath ?: $template->getTemplateName()).':'.$templateInfo[$f['line']]; + } + } + } + } + if ($srcKey == $f['file']) { + $src = self::extractSource(file_get_contents($f['file']), $f['line'], self::$srcContext, 'php', $f['file'], $f); + $srcKey .= ':'.$f['line']; + if ($ellipsis) { + $ellipsis += 1 + \strlen($f['line']); + } + } + $srcAttr .= \sprintf('&separator= &file=%s&line=%d', rawurlencode($f['file']), $f['line']); + } else { + $srcAttr .= '&separator=:'; + } + $srcAttr .= $ellipsis ? '&ellipsis-type=path&ellipsis='.$ellipsis.'&ellipsis-tail='.$ellipsisTail : ''; + self::$framesCache[$cacheKey] = $a[$prefix.'src'] = new EnumStub(["\0~$srcAttr\0$srcKey" => $src]); + } + } + + unset($a[$prefix.'args'], $a[$prefix.'line'], $a[$prefix.'file']); + if ($frame->inTraceStub) { + unset($a[$prefix.'class'], $a[$prefix.'type'], $a[$prefix.'function']); + } + foreach ($a as $k => $v) { + if (!$v) { + unset($a[$k]); + } + } + if ($frame->keepArgs && !empty($f['args'])) { + $a[$prefix.'arguments'] = new ArgsStub($f['args'], $f['function'], $f['class']); + } + + return $a; + } + + public static function castFlattenException(FlattenException $e, array $a, Stub $stub, bool $isNested): array + { + if ($isNested) { + $k = \sprintf(Caster::PATTERN_PRIVATE, FlattenException::class, 'traceAsString'); + $a[$k] = new CutStub($a[$k]); + } + + return $a; + } + + private static function filterExceptionArray(string $xClass, array $a, string $xPrefix, int $filter): array + { + if (isset($a[$xPrefix.'trace'])) { + $trace = $a[$xPrefix.'trace']; + unset($a[$xPrefix.'trace']); // Ensures the trace is always last + } else { + $trace = []; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && $trace) { + if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { + self::traceUnshift($trace, $xClass, $a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); + } + $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); + } + if (empty($a[$xPrefix.'previous'])) { + unset($a[$xPrefix.'previous']); + } + unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message']); + + if (isset($a[Caster::PREFIX_PROTECTED.'message']) && str_contains($a[Caster::PREFIX_PROTECTED.'message'], "@anonymous\0")) { + $a[Caster::PREFIX_PROTECTED.'message'] = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $a[Caster::PREFIX_PROTECTED.'message']); + } + + if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { + $a[Caster::PREFIX_PROTECTED.'file'] = new LinkStub($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); + } + + return $a; + } + + private static function traceUnshift(array &$trace, ?string $class, string $file, int $line): void + { + if (isset($trace[0]['file'], $trace[0]['line']) && $trace[0]['file'] === $file && $trace[0]['line'] === $line) { + return; + } + array_unshift($trace, [ + 'function' => $class ? 'new '.$class : null, + 'file' => $file, + 'line' => $line, + ]); + } + + private static function extractSource(string $srcLines, int $line, int $srcContext, string $lang, ?string $file, array $frame): EnumStub + { + $srcLines = explode("\n", $srcLines); + $src = []; + + for ($i = $line - 1 - $srcContext; $i <= $line - 1 + $srcContext; ++$i) { + $src[] = ($srcLines[$i] ?? '')."\n"; + } + + if ($frame['function'] ?? false) { + $stub = new CutStub(new \stdClass()); + $stub->class = (isset($frame['class']) ? $frame['class'].$frame['type'] : '').$frame['function']; + $stub->type = Stub::TYPE_OBJECT; + $stub->attr['cut_hash'] = true; + $stub->attr['file'] = $frame['file']; + $stub->attr['line'] = $frame['line']; + + try { + $caller = isset($frame['class']) ? new \ReflectionMethod($frame['class'], $frame['function']) : new \ReflectionFunction($frame['function']); + $stub->class .= ReflectionCaster::getSignature(ReflectionCaster::castFunctionAbstract($caller, [], $stub, true, Caster::EXCLUDE_VERBOSE)); + + if ($f = $caller->getFileName()) { + $stub->attr['file'] = $f; + $stub->attr['line'] = $caller->getStartLine(); + } + } catch (\ReflectionException) { + // ignore fake class/function + } + + $srcLines = ["\0~separator=\0" => $stub]; + } else { + $stub = null; + $srcLines = []; + } + + $ltrim = 0; + do { + $pad = null; + for ($i = $srcContext << 1; $i >= 0; --$i) { + if (isset($src[$i][$ltrim]) && "\r" !== ($c = $src[$i][$ltrim]) && "\n" !== $c) { + $pad ??= $c; + if ((' ' !== $c && "\t" !== $c) || $pad !== $c) { + break; + } + } + } + ++$ltrim; + } while (0 > $i && null !== $pad); + + --$ltrim; + + foreach ($src as $i => $c) { + if ($ltrim) { + $c = isset($c[$ltrim]) && "\r" !== $c[$ltrim] ? substr($c, $ltrim) : ltrim($c, " \t"); + } + $c = substr($c, 0, -1); + if ($i !== $srcContext) { + $c = new ConstStub('default', $c); + } else { + $c = new ConstStub($c, $stub ? 'in '.$stub->class : ''); + if (null !== $file) { + $c->attr['file'] = $file; + $c->attr['line'] = $line; + } + } + $c->attr['lang'] = $lang; + $srcLines[\sprintf("\0~separator=› &%d\0", $i + $line - $srcContext)] = $c; + } + + return new EnumStub($srcLines); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/FFICaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/FFICaster.php new file mode 100644 index 0000000..165d0cf --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/FFICaster.php @@ -0,0 +1,171 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use FFI\CData; +use FFI\CType; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts FFI extension classes to array representation. + * + * @author Nesmeyanov Kirill + */ +final class FFICaster +{ + /** + * In case of "char*" contains a string, the length of which depends on + * some other parameter, then during the generation of the string it is + * possible to go beyond the allowable memory area. + * + * This restriction serves to ensure that processing does not take + * up the entire allowable PHP memory limit. + */ + private const MAX_STRING_LENGTH = 255; + + public static function castCTypeOrCData(CData|CType $data, array $args, Stub $stub): array + { + if ($data instanceof CType) { + $type = $data; + $data = null; + } else { + $type = \FFI::typeof($data); + } + + $stub->class = \sprintf('%s<%s> size %d align %d', ($data ?? $type)::class, $type->getName(), $type->getSize(), $type->getAlignment()); + + return match ($type->getKind()) { + CType::TYPE_FLOAT, + CType::TYPE_DOUBLE, + \defined('\FFI\CType::TYPE_LONGDOUBLE') ? CType::TYPE_LONGDOUBLE : -1, + CType::TYPE_UINT8, + CType::TYPE_SINT8, + CType::TYPE_UINT16, + CType::TYPE_SINT16, + CType::TYPE_UINT32, + CType::TYPE_SINT32, + CType::TYPE_UINT64, + CType::TYPE_SINT64, + CType::TYPE_BOOL, + CType::TYPE_CHAR, + CType::TYPE_ENUM => null !== $data ? [Caster::PREFIX_VIRTUAL.'cdata' => $data->cdata] : [], + CType::TYPE_POINTER => self::castFFIPointer($stub, $type, $data), + CType::TYPE_STRUCT => self::castFFIStructLike($type, $data), + CType::TYPE_FUNC => self::castFFIFunction($stub, $type), + default => $args, + }; + } + + private static function castFFIFunction(Stub $stub, CType $type): array + { + $arguments = []; + + for ($i = 0, $count = $type->getFuncParameterCount(); $i < $count; ++$i) { + $param = $type->getFuncParameterType($i); + + $arguments[] = $param->getName(); + } + + $abi = match ($type->getFuncABI()) { + CType::ABI_DEFAULT, + CType::ABI_CDECL => '[cdecl]', + CType::ABI_FASTCALL => '[fastcall]', + CType::ABI_THISCALL => '[thiscall]', + CType::ABI_STDCALL => '[stdcall]', + CType::ABI_PASCAL => '[pascal]', + CType::ABI_REGISTER => '[register]', + CType::ABI_MS => '[ms]', + CType::ABI_SYSV => '[sysv]', + CType::ABI_VECTORCALL => '[vectorcall]', + default => '[unknown abi]', + }; + + $returnType = $type->getFuncReturnType(); + + $stub->class = $abi.' callable('.implode(', ', $arguments).'): ' + .$returnType->getName(); + + return [Caster::PREFIX_VIRTUAL.'returnType' => $returnType]; + } + + private static function castFFIPointer(Stub $stub, CType $type, ?CData $data = null): array + { + $ptr = $type->getPointerType(); + + if (null === $data) { + return [Caster::PREFIX_VIRTUAL.'0' => $ptr]; + } + + return match ($ptr->getKind()) { + CType::TYPE_CHAR => [Caster::PREFIX_VIRTUAL.'cdata' => self::castFFIStringValue($data)], + CType::TYPE_FUNC => self::castFFIFunction($stub, $ptr), + default => [Caster::PREFIX_VIRTUAL.'cdata' => $data[0]], + }; + } + + private static function castFFIStringValue(CData $data): string|CutStub + { + $result = []; + $ffi = \FFI::cdef(<<zend_get_page_size(); + + // get cdata address + $start = $ffi->cast('uintptr_t', $ffi->cast('char*', $data))->cdata; + // accessing memory in the same page as $start is safe + $max = min(self::MAX_STRING_LENGTH, ($start | ($pageSize - 1)) - $start); + + for ($i = 0; $i < $max; ++$i) { + $result[$i] = $data[$i]; + + if ("\0" === $data[$i]) { + return implode('', $result); + } + } + + $string = implode('', $result); + $stub = new CutStub($string); + $stub->cut = -1; + $stub->value = $string; + + return $stub; + } + + private static function castFFIStructLike(CType $type, ?CData $data = null): array + { + $isUnion = ($type->getAttributes() & CType::ATTR_UNION) === CType::ATTR_UNION; + + $result = []; + + foreach ($type->getStructFieldNames() as $name) { + $field = $type->getStructFieldType($name); + + // Retrieving the value of a field from a union containing + // a pointer is not a safe operation, because may contain + // incorrect data. + $isUnsafe = $isUnion && CType::TYPE_POINTER === $field->getKind(); + + if ($isUnsafe) { + $result[Caster::PREFIX_VIRTUAL.$name.'?'] = $field; + } elseif (null === $data) { + $result[Caster::PREFIX_VIRTUAL.$name] = $field; + } else { + $fieldName = $data->{$name} instanceof CData ? '' : $field->getName().' '; + $result[Caster::PREFIX_VIRTUAL.$fieldName.$name] = $data->{$name}; + } + } + + return $result; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/FiberCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/FiberCaster.php new file mode 100644 index 0000000..c9df708 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/FiberCaster.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Fiber related classes to array representation. + * + * @author Grégoire Pineau + */ +final class FiberCaster +{ + public static function castFiber(\Fiber $fiber, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($fiber->isTerminated()) { + $status = 'terminated'; + } elseif ($fiber->isRunning()) { + $status = 'running'; + } elseif ($fiber->isSuspended()) { + $status = 'suspended'; + } elseif ($fiber->isStarted()) { + $status = 'started'; + } else { + $status = 'not started'; + } + + $a[$prefix.'status'] = $status; + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/FrameStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/FrameStub.php new file mode 100644 index 0000000..e57aa46 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/FrameStub.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a single backtrace frame as returned by debug_backtrace() or Exception->getTrace(). + * + * @author Nicolas Grekas + */ +class FrameStub extends EnumStub +{ + public function __construct( + array $frame, + public bool $keepArgs = true, + public bool $inTraceStub = false, + ) { + parent::__construct($frame); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/GdCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/GdCaster.php new file mode 100644 index 0000000..db87653 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/GdCaster.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * + * @internal + */ +final class GdCaster +{ + public static function castGd(\GdImage $gd, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'size'] = imagesx($gd).'x'.imagesy($gd); + $a[Caster::PREFIX_VIRTUAL.'trueColor'] = imageistruecolor($gd); + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/GmpCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/GmpCaster.php new file mode 100644 index 0000000..325d2e9 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/GmpCaster.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts GMP objects to array representation. + * + * @author Hamza Amrouche + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class GmpCaster +{ + public static function castGmp(\GMP $gmp, array $a, Stub $stub, bool $isNested, int $filter): array + { + $a[Caster::PREFIX_VIRTUAL.'value'] = new ConstStub(gmp_strval($gmp), gmp_strval($gmp)); + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ImagineCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ImagineCaster.php new file mode 100644 index 0000000..0fb2a90 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ImagineCaster.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Imagine\Image\ImageInterface; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Grégoire Pineau + * + * @internal since Symfony 7.3 + */ +final class ImagineCaster +{ + public static function castImage(ImageInterface $c, array $a, Stub $stub, bool $isNested): array + { + $imgData = $c->get('png'); + if (\strlen($imgData) > 1 * 1000 * 1000) { + $a += [ + Caster::PREFIX_VIRTUAL.'image' => new ConstStub($c->getSize()), + ]; + } else { + $a += [ + Caster::PREFIX_VIRTUAL.'image' => new ImgStub($imgData, 'image/png', $c->getSize()), + ]; + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ImgStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ImgStub.php new file mode 100644 index 0000000..a16681f --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ImgStub.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * @author Grégoire Pineau + */ +class ImgStub extends ConstStub +{ + public function __construct(string $data, string $contentType, string $size = '') + { + $this->value = ''; + $this->attr['img-data'] = $data; + $this->attr['img-size'] = $size; + $this->attr['content-type'] = $contentType; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/IntlCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/IntlCaster.php new file mode 100644 index 0000000..529c8f7 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/IntlCaster.php @@ -0,0 +1,174 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * @author Jan Schädlich + * + * @final + * + * @internal since Symfony 7.3 + */ +class IntlCaster +{ + public static function castMessageFormatter(\MessageFormatter $c, array $a, Stub $stub, bool $isNested): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + ]; + + return self::castError($c, $a); + } + + public static function castNumberFormatter(\NumberFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + ]; + + if ($filter & Caster::EXCLUDE_VERBOSE) { + $stub->cut += 3; + + return self::castError($c, $a); + } + + $a += [ + Caster::PREFIX_VIRTUAL.'attributes' => new EnumStub( + [ + 'PARSE_INT_ONLY' => $c->getAttribute(\NumberFormatter::PARSE_INT_ONLY), + 'GROUPING_USED' => $c->getAttribute(\NumberFormatter::GROUPING_USED), + 'DECIMAL_ALWAYS_SHOWN' => $c->getAttribute(\NumberFormatter::DECIMAL_ALWAYS_SHOWN), + 'MAX_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_INTEGER_DIGITS), + 'MIN_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_INTEGER_DIGITS), + 'INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::INTEGER_DIGITS), + 'MAX_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_FRACTION_DIGITS), + 'MIN_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_FRACTION_DIGITS), + 'FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::FRACTION_DIGITS), + 'MULTIPLIER' => $c->getAttribute(\NumberFormatter::MULTIPLIER), + 'GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::GROUPING_SIZE), + 'ROUNDING_MODE' => $c->getAttribute(\NumberFormatter::ROUNDING_MODE), + 'ROUNDING_INCREMENT' => $c->getAttribute(\NumberFormatter::ROUNDING_INCREMENT), + 'FORMAT_WIDTH' => $c->getAttribute(\NumberFormatter::FORMAT_WIDTH), + 'PADDING_POSITION' => $c->getAttribute(\NumberFormatter::PADDING_POSITION), + 'SECONDARY_GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::SECONDARY_GROUPING_SIZE), + 'SIGNIFICANT_DIGITS_USED' => $c->getAttribute(\NumberFormatter::SIGNIFICANT_DIGITS_USED), + 'MIN_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS), + 'MAX_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS), + 'LENIENT_PARSE' => $c->getAttribute(\NumberFormatter::LENIENT_PARSE), + ] + ), + Caster::PREFIX_VIRTUAL.'text_attributes' => new EnumStub( + [ + 'POSITIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_PREFIX), + 'POSITIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_SUFFIX), + 'NEGATIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_PREFIX), + 'NEGATIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_SUFFIX), + 'PADDING_CHARACTER' => $c->getTextAttribute(\NumberFormatter::PADDING_CHARACTER), + 'CURRENCY_CODE' => $c->getTextAttribute(\NumberFormatter::CURRENCY_CODE), + 'DEFAULT_RULESET' => $c->getTextAttribute(\NumberFormatter::DEFAULT_RULESET), + 'PUBLIC_RULESETS' => $c->getTextAttribute(\NumberFormatter::PUBLIC_RULESETS), + ] + ), + Caster::PREFIX_VIRTUAL.'symbols' => new EnumStub( + [ + 'DECIMAL_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), + 'GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL), + 'PATTERN_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::PATTERN_SEPARATOR_SYMBOL), + 'PERCENT_SYMBOL' => $c->getSymbol(\NumberFormatter::PERCENT_SYMBOL), + 'ZERO_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::ZERO_DIGIT_SYMBOL), + 'DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::DIGIT_SYMBOL), + 'MINUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL), + 'PLUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::PLUS_SIGN_SYMBOL), + 'CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::CURRENCY_SYMBOL), + 'INTL_CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL), + 'MONETARY_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_SEPARATOR_SYMBOL), + 'EXPONENTIAL_SYMBOL' => $c->getSymbol(\NumberFormatter::EXPONENTIAL_SYMBOL), + 'PERMILL_SYMBOL' => $c->getSymbol(\NumberFormatter::PERMILL_SYMBOL), + 'PAD_ESCAPE_SYMBOL' => $c->getSymbol(\NumberFormatter::PAD_ESCAPE_SYMBOL), + 'INFINITY_SYMBOL' => $c->getSymbol(\NumberFormatter::INFINITY_SYMBOL), + 'NAN_SYMBOL' => $c->getSymbol(\NumberFormatter::NAN_SYMBOL), + 'SIGNIFICANT_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL), + 'MONETARY_GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL), + ] + ), + ]; + + return self::castError($c, $a); + } + + public static function castIntlTimeZone(\IntlTimeZone $c, array $a, Stub $stub, bool $isNested): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'display_name' => $c->getDisplayName(), + Caster::PREFIX_VIRTUAL.'id' => $c->getID(), + Caster::PREFIX_VIRTUAL.'raw_offset' => $c->getRawOffset(), + ]; + + if ($c->useDaylightTime()) { + $a += [ + Caster::PREFIX_VIRTUAL.'dst_savings' => $c->getDSTSavings(), + ]; + } + + return self::castError($c, $a); + } + + public static function castIntlCalendar(\IntlCalendar $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'type' => $c->getType(), + Caster::PREFIX_VIRTUAL.'first_day_of_week' => $c->getFirstDayOfWeek(), + Caster::PREFIX_VIRTUAL.'minimal_days_in_first_week' => $c->getMinimalDaysInFirstWeek(), + Caster::PREFIX_VIRTUAL.'repeated_wall_time_option' => $c->getRepeatedWallTimeOption(), + Caster::PREFIX_VIRTUAL.'skipped_wall_time_option' => $c->getSkippedWallTimeOption(), + Caster::PREFIX_VIRTUAL.'time' => $c->getTime(), + Caster::PREFIX_VIRTUAL.'in_daylight_time' => $c->inDaylightTime(), + Caster::PREFIX_VIRTUAL.'is_lenient' => $c->isLenient(), + Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), + ]; + + return self::castError($c, $a); + } + + public static function castIntlDateFormatter(\IntlDateFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), + Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), + Caster::PREFIX_VIRTUAL.'calendar' => $c->getCalendar(), + Caster::PREFIX_VIRTUAL.'time_zone_id' => $c->getTimeZoneId(), + Caster::PREFIX_VIRTUAL.'time_type' => $c->getTimeType(), + Caster::PREFIX_VIRTUAL.'date_type' => $c->getDateType(), + Caster::PREFIX_VIRTUAL.'calendar_object' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getCalendarObject()) : $c->getCalendarObject(), + Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), + ]; + + return self::castError($c, $a); + } + + private static function castError(object $c, array $a): array + { + if ($errorCode = $c->getErrorCode()) { + $a += [ + Caster::PREFIX_VIRTUAL.'error_code' => $errorCode, + Caster::PREFIX_VIRTUAL.'error_message' => $c->getErrorMessage(), + ]; + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/LinkStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/LinkStub.php new file mode 100644 index 0000000..3acd4fd --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/LinkStub.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a file or a URL. + * + * @author Nicolas Grekas + */ +class LinkStub extends ConstStub +{ + public bool $inVendor = false; + + private static array $vendorRoots; + private static array $composerRoots = []; + + public function __construct(string $label, int $line = 0, ?string $href = null) + { + $this->value = $label; + + if (!\is_string($href ??= $label)) { + return; + } + if (str_starts_with($href, 'file://')) { + if ($href === $label) { + $label = substr($label, 7); + } + $href = substr($href, 7); + } elseif (str_contains($href, '://')) { + $this->attr['href'] = $href; + + return; + } + if (!is_file($href)) { + return; + } + if ($line) { + $this->attr['line'] = $line; + } + if ($label !== $this->attr['file'] = realpath($href) ?: $href) { + return; + } + if ($composerRoot = $this->getComposerRoot($href, $this->inVendor)) { + $this->attr['ellipsis'] = \strlen($href) - \strlen($composerRoot) + 1; + $this->attr['ellipsis-type'] = 'path'; + $this->attr['ellipsis-tail'] = 1 + ($this->inVendor ? 2 + \strlen(implode('', \array_slice(explode(\DIRECTORY_SEPARATOR, substr($href, 1 - $this->attr['ellipsis'])), 0, 2))) : 0); + } elseif (3 < \count($ellipsis = explode(\DIRECTORY_SEPARATOR, $href))) { + $this->attr['ellipsis'] = 2 + \strlen(implode('', \array_slice($ellipsis, -2))); + $this->attr['ellipsis-type'] = 'path'; + $this->attr['ellipsis-tail'] = 1; + } + } + + private function getComposerRoot(string $file, bool &$inVendor): string|false + { + if (!isset(self::$vendorRoots)) { + self::$vendorRoots = []; + + foreach (get_declared_classes() as $class) { + if ('C' === $class[0] && str_starts_with($class, 'ComposerAutoloaderInit')) { + $r = new \ReflectionClass($class); + $v = \dirname($r->getFileName(), 2); + if (is_file($v.'/composer/installed.json')) { + self::$vendorRoots[] = $v.\DIRECTORY_SEPARATOR; + } + } + } + } + $inVendor = false; + + if (isset(self::$composerRoots[$dir = \dirname($file)])) { + return self::$composerRoots[$dir]; + } + + foreach (self::$vendorRoots as $root) { + if ($inVendor = str_starts_with($file, $root)) { + return $root; + } + } + + $parent = $dir; + while (!@is_file($parent.'/composer.json')) { + if (!@file_exists($parent)) { + // open_basedir restriction in effect + break; + } + if ($parent === \dirname($parent)) { + return self::$composerRoots[$dir] = false; + } + + $parent = \dirname($parent); + } + + return self::$composerRoots[$dir] = $parent.\DIRECTORY_SEPARATOR; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/MemcachedCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/MemcachedCaster.php new file mode 100644 index 0000000..4e4f611 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/MemcachedCaster.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Jan Schädlich + * + * @final + * + * @internal since Symfony 7.3 + */ +class MemcachedCaster +{ + private static array $optionConstants; + private static array $defaultOptions; + + public static function castMemcached(\Memcached $c, array $a, Stub $stub, bool $isNested): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'servers' => $c->getServerList(), + Caster::PREFIX_VIRTUAL.'options' => new EnumStub( + self::getNonDefaultOptions($c) + ), + ]; + + return $a; + } + + private static function getNonDefaultOptions(\Memcached $c): array + { + self::$defaultOptions ??= self::discoverDefaultOptions(); + self::$optionConstants ??= self::getOptionConstants(); + + $nonDefaultOptions = []; + foreach (self::$optionConstants as $constantKey => $value) { + if (self::$defaultOptions[$constantKey] !== $option = $c->getOption($value)) { + $nonDefaultOptions[$constantKey] = $option; + } + } + + return $nonDefaultOptions; + } + + private static function discoverDefaultOptions(): array + { + $defaultMemcached = new \Memcached(); + $defaultMemcached->addServer('127.0.0.1', 11211); + + $defaultOptions = []; + self::$optionConstants ??= self::getOptionConstants(); + + foreach (self::$optionConstants as $constantKey => $value) { + $defaultOptions[$constantKey] = $defaultMemcached->getOption($value); + } + + return $defaultOptions; + } + + private static function getOptionConstants(): array + { + $reflectedMemcached = new \ReflectionClass(\Memcached::class); + + $optionConstants = []; + foreach ($reflectedMemcached->getConstants() as $constantKey => $value) { + if (str_starts_with($constantKey, 'OPT_')) { + $optionConstants[$constantKey] = $value; + } + } + + return $optionConstants; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/MysqliCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/MysqliCaster.php new file mode 100644 index 0000000..bfe6f08 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/MysqliCaster.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * + * @internal + */ +final class MysqliCaster +{ + public static function castMysqliDriver(\mysqli_driver $c, array $a, Stub $stub, bool $isNested): array + { + foreach ($a as $k => $v) { + if (isset($c->$k)) { + $a[$k] = $c->$k; + } + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/OpenSSLCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/OpenSSLCaster.php new file mode 100644 index 0000000..4c311ac --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/OpenSSLCaster.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * @author Alexandre Daubois + * + * @internal + */ +final class OpenSSLCaster +{ + public static function castOpensslX509(\OpenSSLCertificate $h, array $a, Stub $stub, bool $isNested): array + { + $stub->cut = -1; + $info = openssl_x509_parse($h, false); + + $pin = openssl_pkey_get_public($h); + $pin = openssl_pkey_get_details($pin)['key']; + $pin = \array_slice(explode("\n", $pin), 1, -2); + $pin = base64_decode(implode('', $pin)); + $pin = base64_encode(hash('sha256', $pin, true)); + + $a += [ + Caster::PREFIX_VIRTUAL.'subject' => new EnumStub(array_intersect_key($info['subject'], ['organizationName' => true, 'commonName' => true])), + Caster::PREFIX_VIRTUAL.'issuer' => new EnumStub(array_intersect_key($info['issuer'], ['organizationName' => true, 'commonName' => true])), + Caster::PREFIX_VIRTUAL.'expiry' => new ConstStub(date(\DateTimeInterface::ISO8601, $info['validTo_time_t']), $info['validTo_time_t']), + Caster::PREFIX_VIRTUAL.'fingerprint' => new EnumStub([ + 'md5' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'md5')), 2, ':', true)), + 'sha1' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha1')), 2, ':', true)), + 'sha256' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha256')), 2, ':', true)), + 'pin-sha256' => new ConstStub($pin), + ]), + ]; + + return $a; + } + + public static function castOpensslAsymmetricKey(\OpenSSLAsymmetricKey $key, array $a, Stub $stub, bool $isNested): array + { + foreach (openssl_pkey_get_details($key) as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + + unset($a[Caster::PREFIX_VIRTUAL.'rsa']); // binary data + + return $a; + } + + public static function castOpensslCsr(\OpenSSLCertificateSigningRequest $csr, array $a, Stub $stub, bool $isNested): array + { + foreach (openssl_csr_get_subject($csr, false) as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/PdoCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/PdoCaster.php new file mode 100644 index 0000000..697e412 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/PdoCaster.php @@ -0,0 +1,124 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts PDO related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class PdoCaster +{ + private const PDO_ATTRIBUTES = [ + 'CASE' => [ + \PDO::CASE_LOWER => 'LOWER', + \PDO::CASE_NATURAL => 'NATURAL', + \PDO::CASE_UPPER => 'UPPER', + ], + 'ERRMODE' => [ + \PDO::ERRMODE_SILENT => 'SILENT', + \PDO::ERRMODE_WARNING => 'WARNING', + \PDO::ERRMODE_EXCEPTION => 'EXCEPTION', + ], + 'TIMEOUT', + 'PREFETCH', + 'AUTOCOMMIT', + 'PERSISTENT', + 'DRIVER_NAME', + 'SERVER_INFO', + 'ORACLE_NULLS' => [ + \PDO::NULL_NATURAL => 'NATURAL', + \PDO::NULL_EMPTY_STRING => 'EMPTY_STRING', + \PDO::NULL_TO_STRING => 'TO_STRING', + ], + 'CLIENT_VERSION', + 'SERVER_VERSION', + 'STATEMENT_CLASS', + 'EMULATE_PREPARES', + 'CONNECTION_STATUS', + 'STRINGIFY_FETCHES', + 'DEFAULT_FETCH_MODE' => [ + \PDO::FETCH_ASSOC => 'ASSOC', + \PDO::FETCH_BOTH => 'BOTH', + \PDO::FETCH_LAZY => 'LAZY', + \PDO::FETCH_NUM => 'NUM', + \PDO::FETCH_OBJ => 'OBJ', + ], + ]; + + public static function castPdo(\PDO $c, array $a, Stub $stub, bool $isNested): array + { + $attr = []; + $errmode = $c->getAttribute(\PDO::ATTR_ERRMODE); + $c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + + foreach (self::PDO_ATTRIBUTES as $k => $v) { + if (!isset($k[0])) { + $k = $v; + $v = []; + } + + try { + $attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k)); + if ($v && isset($v[$attr[$k]])) { + $attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]); + } + } catch (\Exception) { + } + } + if (isset($attr[$k = 'STATEMENT_CLASS'][1])) { + if ($attr[$k][1]) { + $attr[$k][1] = new ArgsStub($attr[$k][1], '__construct', $attr[$k][0]); + } + $attr[$k][0] = new ClassStub($attr[$k][0]); + } + + $prefix = Caster::PREFIX_VIRTUAL; + $a += [ + $prefix.'inTransaction' => method_exists($c, 'inTransaction'), + $prefix.'errorInfo' => $c->errorInfo(), + $prefix.'attributes' => new EnumStub($attr), + ]; + + if ($a[$prefix.'inTransaction']) { + $a[$prefix.'inTransaction'] = $c->inTransaction(); + } else { + unset($a[$prefix.'inTransaction']); + } + + if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { + unset($a[$prefix.'errorInfo']); + } + + $c->setAttribute(\PDO::ATTR_ERRMODE, $errmode); + + return $a; + } + + public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + $a[$prefix.'errorInfo'] = $c->errorInfo(); + + if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { + unset($a[$prefix.'errorInfo']); + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/PgSqlCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/PgSqlCaster.php new file mode 100644 index 0000000..3d6cb7d --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/PgSqlCaster.php @@ -0,0 +1,158 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts pgsql resources to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class PgSqlCaster +{ + private const PARAM_CODES = [ + 'server_encoding', + 'client_encoding', + 'is_superuser', + 'session_authorization', + 'DateStyle', + 'TimeZone', + 'IntervalStyle', + 'integer_datetimes', + 'application_name', + 'standard_conforming_strings', + ]; + + private const TRANSACTION_STATUS = [ + \PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE', + \PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE', + \PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS', + \PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR', + \PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN', + ]; + + private const RESULT_STATUS = [ + \PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY', + \PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK', + \PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK', + \PGSQL_COPY_OUT => 'PGSQL_COPY_OUT', + \PGSQL_COPY_IN => 'PGSQL_COPY_IN', + \PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE', + \PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR', + \PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR', + ]; + + private const DIAG_CODES = [ + 'severity' => \PGSQL_DIAG_SEVERITY, + 'sqlstate' => \PGSQL_DIAG_SQLSTATE, + 'message' => \PGSQL_DIAG_MESSAGE_PRIMARY, + 'detail' => \PGSQL_DIAG_MESSAGE_DETAIL, + 'hint' => \PGSQL_DIAG_MESSAGE_HINT, + 'statement position' => \PGSQL_DIAG_STATEMENT_POSITION, + 'internal position' => \PGSQL_DIAG_INTERNAL_POSITION, + 'internal query' => \PGSQL_DIAG_INTERNAL_QUERY, + 'context' => \PGSQL_DIAG_CONTEXT, + 'file' => \PGSQL_DIAG_SOURCE_FILE, + 'line' => \PGSQL_DIAG_SOURCE_LINE, + 'function' => \PGSQL_DIAG_SOURCE_FUNCTION, + ]; + + public static function castLargeObject($lo, array $a, Stub $stub, bool $isNested): array + { + $a['seek position'] = pg_lo_tell($lo); + + return $a; + } + + public static function castLink($link, array $a, Stub $stub, bool $isNested): array + { + $a['status'] = pg_connection_status($link); + $a['status'] = new ConstStub(\PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']); + $a['busy'] = pg_connection_busy($link); + + $a['transaction'] = pg_transaction_status($link); + if (isset(self::TRANSACTION_STATUS[$a['transaction']])) { + $a['transaction'] = new ConstStub(self::TRANSACTION_STATUS[$a['transaction']], $a['transaction']); + } + + $a['pid'] = pg_get_pid($link); + $a['last error'] = pg_last_error($link); + $a['last notice'] = pg_last_notice($link); + $a['host'] = pg_host($link); + $a['port'] = pg_port($link); + $a['dbname'] = pg_dbname($link); + $a['options'] = pg_options($link); + $a['version'] = pg_version($link); + + foreach (self::PARAM_CODES as $v) { + if (false !== $s = pg_parameter_status($link, $v)) { + $a['param'][$v] = $s; + } + } + + $a['param']['client_encoding'] = pg_client_encoding($link); + $a['param'] = new EnumStub($a['param']); + + return $a; + } + + public static function castResult($result, array $a, Stub $stub, bool $isNested): array + { + $a['num rows'] = pg_num_rows($result); + $a['status'] = pg_result_status($result); + if (isset(self::RESULT_STATUS[$a['status']])) { + $a['status'] = new ConstStub(self::RESULT_STATUS[$a['status']], $a['status']); + } + $a['command-completion tag'] = pg_result_status($result, \PGSQL_STATUS_STRING); + + if (-1 === $a['num rows']) { + foreach (self::DIAG_CODES as $k => $v) { + $a['error'][$k] = pg_result_error_field($result, $v); + } + } + + $a['affected rows'] = pg_affected_rows($result); + $a['last OID'] = pg_last_oid($result); + + $fields = pg_num_fields($result); + + for ($i = 0; $i < $fields; ++$i) { + $field = [ + 'name' => pg_field_name($result, $i), + 'table' => \sprintf('%s (OID: %s)', pg_field_table($result, $i), pg_field_table($result, $i, true)), + 'type' => \sprintf('%s (OID: %s)', pg_field_type($result, $i), pg_field_type_oid($result, $i)), + 'nullable' => (bool) (\PHP_VERSION_ID >= 80300 ? pg_field_is_null($result, null, $i) : pg_field_is_null($result, $i)), + 'storage' => pg_field_size($result, $i).' bytes', + 'display' => (\PHP_VERSION_ID >= 80300 ? pg_field_prtlen($result, null, $i) : pg_field_prtlen($result, $i)).' chars', + ]; + if (' (OID: )' === $field['table']) { + $field['table'] = null; + } + if ('-1 bytes' === $field['storage']) { + $field['storage'] = 'variable size'; + } elseif ('1 bytes' === $field['storage']) { + $field['storage'] = '1 byte'; + } + if ('1 chars' === $field['display']) { + $field['display'] = '1 char'; + } + $a['fields'][] = new EnumStub($field); + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php new file mode 100644 index 0000000..0d954f4 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use ProxyManager\Proxy\ProxyInterface; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class ProxyManagerCaster +{ + public static function castProxy(ProxyInterface $c, array $a, Stub $stub, bool $isNested): array + { + if ($parent = get_parent_class($c)) { + $stub->class .= ' - '.$parent; + } + $stub->class .= '@proxy'; + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php new file mode 100644 index 0000000..bfadef2 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php @@ -0,0 +1,188 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use RdKafka\Conf; +use RdKafka\Exception as RdKafkaException; +use RdKafka\KafkaConsumer; +use RdKafka\Message; +use RdKafka\Metadata\Broker as BrokerMetadata; +use RdKafka\Metadata\Collection as CollectionMetadata; +use RdKafka\Metadata\Partition as PartitionMetadata; +use RdKafka\Metadata\Topic as TopicMetadata; +use RdKafka\Topic; +use RdKafka\TopicConf; +use RdKafka\TopicPartition; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts RdKafka related classes to array representation. + * + * @author Romain Neutron + * + * @internal since Symfony 7.3 + */ +class RdKafkaCaster +{ + public static function castKafkaConsumer(KafkaConsumer $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + try { + $assignment = $c->getAssignment(); + } catch (RdKafkaException) { + $assignment = []; + } + + $a += [ + $prefix.'subscription' => $c->getSubscription(), + $prefix.'assignment' => $assignment, + ]; + + $a += self::extractMetadata($c); + + return $a; + } + + public static function castTopic(Topic $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'name' => $c->getName(), + ]; + + return $a; + } + + public static function castTopicPartition(TopicPartition $c, array $a): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'offset' => $c->getOffset(), + $prefix.'partition' => $c->getPartition(), + $prefix.'topic' => $c->getTopic(), + ]; + + return $a; + } + + public static function castMessage(Message $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'errstr' => $c->errstr(), + ]; + + return $a; + } + + public static function castConf(Conf $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + foreach ($c->dump() as $key => $value) { + $a[$prefix.$key] = $value; + } + + return $a; + } + + public static function castTopicConf(TopicConf $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + foreach ($c->dump() as $key => $value) { + $a[$prefix.$key] = $value; + } + + return $a; + } + + public static function castRdKafka(\RdKafka $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'out_q_len' => $c->getOutQLen(), + ]; + + $a += self::extractMetadata($c); + + return $a; + } + + public static function castCollectionMetadata(CollectionMetadata $c, array $a, Stub $stub, bool $isNested): array + { + $a += iterator_to_array($c); + + return $a; + } + + public static function castTopicMetadata(TopicMetadata $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'name' => $c->getTopic(), + $prefix.'partitions' => $c->getPartitions(), + ]; + + return $a; + } + + public static function castPartitionMetadata(PartitionMetadata $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'id' => $c->getId(), + $prefix.'err' => $c->getErr(), + $prefix.'leader' => $c->getLeader(), + ]; + + return $a; + } + + public static function castBrokerMetadata(BrokerMetadata $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'id' => $c->getId(), + $prefix.'host' => $c->getHost(), + $prefix.'port' => $c->getPort(), + ]; + + return $a; + } + + private static function extractMetadata(KafkaConsumer|\RdKafka $c): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + try { + $m = $c->getMetadata(true, null, 500); + } catch (RdKafkaException) { + return []; + } + + return [ + $prefix.'orig_broker_id' => $m->getOrigBrokerId(), + $prefix.'orig_broker_name' => $m->getOrigBrokerName(), + $prefix.'brokers' => $m->getBrokers(), + $prefix.'topics' => $m->getTopics(), + ]; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/RedisCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/RedisCaster.php new file mode 100644 index 0000000..a1ed95d --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/RedisCaster.php @@ -0,0 +1,152 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Relay\Relay; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Redis class from ext-redis to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class RedisCaster +{ + private const SERIALIZERS = [ + 0 => 'NONE', // Redis::SERIALIZER_NONE + 1 => 'PHP', // Redis::SERIALIZER_PHP + 2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY + ]; + + private const MODES = [ + 0 => 'ATOMIC', // Redis::ATOMIC + 1 => 'MULTI', // Redis::MULTI + 2 => 'PIPELINE', // Redis::PIPELINE + ]; + + private const COMPRESSION_MODES = [ + 0 => 'NONE', // Redis::COMPRESSION_NONE + 1 => 'LZF', // Redis::COMPRESSION_LZF + ]; + + private const FAILOVER_OPTIONS = [ + \RedisCluster::FAILOVER_NONE => 'NONE', + \RedisCluster::FAILOVER_ERROR => 'ERROR', + \RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE', + \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES', + ]; + + public static function castRedis(\Redis|Relay $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + if (!$connected = $c->isConnected()) { + return $a + [ + $prefix.'isConnected' => $connected, + ]; + } + + $mode = $c->getMode(); + + return $a + [ + $prefix.'isConnected' => $connected, + $prefix.'host' => $c->getHost(), + $prefix.'port' => $c->getPort(), + $prefix.'auth' => $c->getAuth(), + $prefix.'mode' => isset(self::MODES[$mode]) ? new ConstStub(self::MODES[$mode], $mode) : $mode, + $prefix.'dbNum' => $c->getDbNum(), + $prefix.'timeout' => $c->getTimeout(), + $prefix.'lastError' => $c->getLastError(), + $prefix.'persistentId' => $c->getPersistentID(), + $prefix.'options' => self::getRedisOptions($c), + ]; + } + + public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + return $a + [ + $prefix.'hosts' => $c->_hosts(), + $prefix.'function' => ClassStub::wrapCallable($c->_function()), + $prefix.'lastError' => $c->getLastError(), + $prefix.'options' => self::getRedisOptions($c), + ]; + } + + public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + $failover = $c->getOption(\RedisCluster::OPT_SLAVE_FAILOVER); + + $a += [ + $prefix.'_masters' => $c->_masters(), + $prefix.'_redir' => $c->_redir(), + $prefix.'mode' => new ConstStub($c->getMode() ? 'MULTI' : 'ATOMIC', $c->getMode()), + $prefix.'lastError' => $c->getLastError(), + $prefix.'options' => self::getRedisOptions($c, [ + 'SLAVE_FAILOVER' => isset(self::FAILOVER_OPTIONS[$failover]) ? new ConstStub(self::FAILOVER_OPTIONS[$failover], $failover) : $failover, + ]), + ]; + + return $a; + } + + private static function getRedisOptions(\Redis|Relay|\RedisArray|\RedisCluster $redis, array $options = []): EnumStub + { + $serializer = $redis->getOption(\defined('Redis::OPT_SERIALIZER') ? \Redis::OPT_SERIALIZER : 1); + if (\is_array($serializer)) { + foreach ($serializer as &$v) { + if (isset(self::SERIALIZERS[$v])) { + $v = new ConstStub(self::SERIALIZERS[$v], $v); + } + } + } elseif (isset(self::SERIALIZERS[$serializer])) { + $serializer = new ConstStub(self::SERIALIZERS[$serializer], $serializer); + } + + $compression = \defined('Redis::OPT_COMPRESSION') ? $redis->getOption(\Redis::OPT_COMPRESSION) : 0; + if (\is_array($compression)) { + foreach ($compression as &$v) { + if (isset(self::COMPRESSION_MODES[$v])) { + $v = new ConstStub(self::COMPRESSION_MODES[$v], $v); + } + } + } elseif (isset(self::COMPRESSION_MODES[$compression])) { + $compression = new ConstStub(self::COMPRESSION_MODES[$compression], $compression); + } + + $retry = \defined('Redis::OPT_SCAN') ? $redis->getOption(\Redis::OPT_SCAN) : 0; + if (\is_array($retry)) { + foreach ($retry as &$v) { + $v = new ConstStub($v ? 'RETRY' : 'NORETRY', $v); + } + } else { + $retry = new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry); + } + + $options += [ + 'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : Relay::OPT_TCP_KEEPALIVE, + 'READ_TIMEOUT' => $redis->getOption(\defined('Redis::OPT_READ_TIMEOUT') ? \Redis::OPT_READ_TIMEOUT : Relay::OPT_READ_TIMEOUT), + 'COMPRESSION' => $compression, + 'SERIALIZER' => $serializer, + 'PREFIX' => $redis->getOption(\defined('Redis::OPT_PREFIX') ? \Redis::OPT_PREFIX : Relay::OPT_PREFIX), + 'SCAN' => $retry, + ]; + + return new EnumStub($options); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ReflectionCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ReflectionCaster.php new file mode 100644 index 0000000..e7310f4 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ReflectionCaster.php @@ -0,0 +1,448 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Reflector related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class ReflectionCaster +{ + public const UNSET_CLOSURE_FILE_INFO = ['Closure' => __CLASS__.'::unsetClosureFileInfo']; + + private const EXTRA_MAP = [ + 'docComment' => 'getDocComment', + 'extension' => 'getExtensionName', + 'isDisabled' => 'isDisabled', + 'isDeprecated' => 'isDeprecated', + 'isInternal' => 'isInternal', + 'isUserDefined' => 'isUserDefined', + 'isGenerator' => 'isGenerator', + 'isVariadic' => 'isVariadic', + ]; + + public static function castClosure(\Closure $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $prefix = Caster::PREFIX_VIRTUAL; + $c = new \ReflectionFunction($c); + + $a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter); + + if (!$c->isAnonymous()) { + $stub->class = isset($a[$prefix.'class']) ? $a[$prefix.'class']->value.'::'.$c->name : $c->name; + unset($a[$prefix.'class']); + } + unset($a[$prefix.'extra']); + + $stub->class .= self::getSignature($a); + + if ($f = $c->getFileName()) { + $stub->attr['file'] = $f; + $stub->attr['line'] = $c->getStartLine(); + } + + unset($a[$prefix.'parameters']); + + if ($filter & Caster::EXCLUDE_VERBOSE) { + $stub->cut += ($c->getFileName() ? 2 : 0) + \count($a); + + return []; + } + + if ($f) { + $a[$prefix.'file'] = new LinkStub($f, $c->getStartLine()); + $a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine(); + } + + return $a; + } + + public static function unsetClosureFileInfo(\Closure $c, array $a): array + { + unset($a[Caster::PREFIX_VIRTUAL.'file'], $a[Caster::PREFIX_VIRTUAL.'line']); + + return $a; + } + + public static function castGenerator(\Generator $c, array $a, Stub $stub, bool $isNested): array + { + // Cannot create ReflectionGenerator based on a terminated Generator + try { + $reflectionGenerator = new \ReflectionGenerator($c); + + return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested); + } catch (\Exception) { + $a[Caster::PREFIX_VIRTUAL.'closed'] = true; + + return $a; + } + } + + public static function castType(\ReflectionType $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($c instanceof \ReflectionNamedType) { + $a += [ + $prefix.'name' => $c->getName(), + $prefix.'allowsNull' => $c->allowsNull(), + $prefix.'isBuiltin' => $c->isBuiltin(), + ]; + } elseif ($c instanceof \ReflectionUnionType || $c instanceof \ReflectionIntersectionType) { + $a[$prefix.'allowsNull'] = $c->allowsNull(); + self::addMap($a, $c, [ + 'types' => 'getTypes', + ]); + } else { + $a[$prefix.'allowsNull'] = $c->allowsNull(); + } + + return $a; + } + + public static function castAttribute(\ReflectionAttribute $c, array $a, Stub $stub, bool $isNested): array + { + $map = [ + 'name' => 'getName', + 'arguments' => 'getArguments', + ]; + + if (\PHP_VERSION_ID >= 80400) { + unset($map['name']); + } + + self::addMap($a, $c, $map); + + return $a; + } + + public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($c->getThis()) { + $a[$prefix.'this'] = new CutStub($c->getThis()); + } + $function = $c->getFunction(); + $frame = [ + 'class' => $function->class ?? null, + 'type' => isset($function->class) ? ($function->isStatic() ? '::' : '->') : null, + 'function' => $function->name, + 'file' => $c->getExecutingFile(), + 'line' => $c->getExecutingLine(), + ]; + if ($trace = $c->getTrace(\DEBUG_BACKTRACE_IGNORE_ARGS)) { + $function = new \ReflectionGenerator($c->getExecutingGenerator()); + array_unshift($trace, [ + 'function' => 'yield', + 'file' => $function->getExecutingFile(), + 'line' => $function->getExecutingLine(), + ]); + $trace[] = $frame; + $a[$prefix.'trace'] = new TraceStub($trace, false, 0, -1, -1); + } else { + $function = new FrameStub($frame, false, true); + $function = ExceptionCaster::castFrameStub($function, [], $function, true); + $a[$prefix.'executing'] = $function[$prefix.'src']; + } + + $a[Caster::PREFIX_VIRTUAL.'closed'] = false; + + return $a; + } + + public static function castClass(\ReflectionClass $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($n = \Reflection::getModifierNames($c->getModifiers())) { + $a[$prefix.'modifiers'] = implode(' ', $n); + } + + self::addMap($a, $c, [ + 'extends' => 'getParentClass', + 'implements' => 'getInterfaceNames', + 'constants' => 'getReflectionConstants', + ]); + + foreach ($c->getProperties() as $n) { + $a[$prefix.'properties'][$n->name] = $n; + } + + foreach ($c->getMethods() as $n) { + $a[$prefix.'methods'][$n->name] = $n; + } + + self::addAttributes($a, $c, $prefix); + + if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { + self::addExtra($a, $c); + } + + return $a; + } + + public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + self::addMap($a, $c, [ + 'returnsReference' => 'returnsReference', + 'returnType' => 'getReturnType', + 'class' => 'getClosureCalledClass', + 'this' => 'getClosureThis', + ]); + + if (isset($a[$prefix.'returnType'])) { + $v = $a[$prefix.'returnType']; + $v = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; + $a[$prefix.'returnType'] = new ClassStub($a[$prefix.'returnType'] instanceof \ReflectionNamedType && $a[$prefix.'returnType']->allowsNull() && !\in_array($v, ['mixed', 'null'], true) ? '?'.$v : $v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); + } + if (isset($a[$prefix.'class'])) { + $a[$prefix.'class'] = new ClassStub($a[$prefix.'class']); + } + if (isset($a[$prefix.'this'])) { + $a[$prefix.'this'] = new CutStub($a[$prefix.'this']); + } + + foreach ($c->getParameters() as $v) { + $k = '$'.$v->name; + if ($v->isVariadic()) { + $k = '...'.$k; + } + if ($v->isPassedByReference()) { + $k = '&'.$k; + } + $a[$prefix.'parameters'][$k] = $v; + } + if (isset($a[$prefix.'parameters'])) { + $a[$prefix.'parameters'] = new EnumStub($a[$prefix.'parameters']); + } + + self::addAttributes($a, $c, $prefix); + + if (!($filter & Caster::EXCLUDE_VERBOSE) && $v = $c->getStaticVariables()) { + foreach ($v as $k => &$v) { + if (\is_object($v)) { + $a[$prefix.'use']['$'.$k] = new CutStub($v); + } else { + $a[$prefix.'use']['$'.$k] = &$v; + } + } + unset($v); + $a[$prefix.'use'] = new EnumStub($a[$prefix.'use']); + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { + self::addExtra($a, $c); + } + + return $a; + } + + public static function castClassConstant(\ReflectionClassConstant $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); + $a[Caster::PREFIX_VIRTUAL.'value'] = $c->getValue(); + + self::addAttributes($a, $c); + + return $a; + } + + public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); + + return $a; + } + + public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + + self::addMap($a, $c, [ + 'position' => 'getPosition', + 'isVariadic' => 'isVariadic', + 'byReference' => 'isPassedByReference', + 'allowsNull' => 'allowsNull', + ]); + + self::addAttributes($a, $c, $prefix); + + if ($v = $c->getType()) { + $a[$prefix.'typeHint'] = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; + } + + if (isset($a[$prefix.'typeHint'])) { + $v = $a[$prefix.'typeHint']; + $a[$prefix.'typeHint'] = new ClassStub($v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); + } else { + unset($a[$prefix.'allowsNull']); + } + + if ($c->isOptional()) { + try { + $a[$prefix.'default'] = $v = $c->getDefaultValue(); + if ($c->isDefaultValueConstant() && !\is_object($v)) { + $a[$prefix.'default'] = new ConstStub($c->getDefaultValueConstantName(), $v); + } + if (null === $v) { + unset($a[$prefix.'allowsNull']); + } + } catch (\ReflectionException) { + } + } + + return $a; + } + + public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); + + self::addAttributes($a, $c); + self::addExtra($a, $c); + + return $a; + } + + public static function castReference(\ReflectionReference $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'id'] = $c->getId(); + + return $a; + } + + public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, bool $isNested): array + { + self::addMap($a, $c, [ + 'version' => 'getVersion', + 'dependencies' => 'getDependencies', + 'iniEntries' => 'getIniEntries', + 'isPersistent' => 'isPersistent', + 'isTemporary' => 'isTemporary', + 'constants' => 'getConstants', + 'functions' => 'getFunctions', + 'classes' => 'getClasses', + ]); + + return $a; + } + + public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, bool $isNested): array + { + self::addMap($a, $c, [ + 'version' => 'getVersion', + 'author' => 'getAuthor', + 'copyright' => 'getCopyright', + 'url' => 'getURL', + ]); + + return $a; + } + + public static function getSignature(array $a): string + { + $prefix = Caster::PREFIX_VIRTUAL; + $signature = ''; + + if (isset($a[$prefix.'parameters'])) { + foreach ($a[$prefix.'parameters']->value as $k => $param) { + $signature .= ', '; + if ($type = $param->getType()) { + if (!$type instanceof \ReflectionNamedType) { + $signature .= $type.' '; + } else { + if ($param->allowsNull() && !\in_array($type->getName(), ['mixed', 'null'], true)) { + $signature .= '?'; + } + $signature .= substr(strrchr('\\'.$type->getName(), '\\'), 1).' '; + } + } + $signature .= $k; + + if (!$param->isDefaultValueAvailable()) { + continue; + } + $v = $param->getDefaultValue(); + $signature .= ' = '; + + if ($param->isDefaultValueConstant()) { + $signature .= substr(strrchr('\\'.$param->getDefaultValueConstantName(), '\\'), 1); + } elseif (null === $v) { + $signature .= 'null'; + } elseif (\is_array($v)) { + $signature .= $v ? '[…'.\count($v).']' : '[]'; + } elseif (\is_string($v)) { + $signature .= 10 > \strlen($v) && !str_contains($v, '\\') ? "'{$v}'" : "'…".\strlen($v)."'"; + } elseif (\is_bool($v)) { + $signature .= $v ? 'true' : 'false'; + } elseif (\is_object($v)) { + $signature .= 'new '.substr(strrchr('\\'.get_debug_type($v), '\\'), 1); + } else { + $signature .= $v; + } + } + } + $signature = (empty($a[$prefix.'returnsReference']) ? '' : '&').'('.substr($signature, 2).')'; + + if (isset($a[$prefix.'returnType'])) { + $signature .= ': '.substr(strrchr('\\'.$a[$prefix.'returnType'], '\\'), 1); + } + + return $signature; + } + + private static function addExtra(array &$a, \Reflector $c): void + { + $x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : []; + + if (method_exists($c, 'getFileName') && $m = $c->getFileName()) { + $x['file'] = new LinkStub($m, $c->getStartLine()); + $x['line'] = $c->getStartLine().' to '.$c->getEndLine(); + } + + self::addMap($x, $c, self::EXTRA_MAP, ''); + + if ($x) { + $a[Caster::PREFIX_VIRTUAL.'extra'] = new EnumStub($x); + } + } + + private static function addMap(array &$a, object $c, array $map, string $prefix = Caster::PREFIX_VIRTUAL): void + { + foreach ($map as $k => $m) { + if ('isDisabled' === $k) { + continue; + } + + if (method_exists($c, $m) && false !== ($m = $c->$m()) && null !== $m) { + $a[$prefix.$k] = $m instanceof \Reflector ? $m->name : $m; + } + } + } + + private static function addAttributes(array &$a, \Reflector $c, string $prefix = Caster::PREFIX_VIRTUAL): void + { + foreach ($c->getAttributes() as $n) { + $a[$prefix.'attributes'][] = $n; + } + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ResourceCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ResourceCaster.php new file mode 100644 index 0000000..47c2efc --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ResourceCaster.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts common resource types to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class ResourceCaster +{ + /** + * @deprecated since Symfony 7.3 + */ + public static function castCurl(\CurlHandle $h, array $a, Stub $stub, bool $isNested): array + { + trigger_deprecation('symfony/var-dumper', '7.3', 'The "%s()" method is deprecated without replacement.', __METHOD__); + + return CurlCaster::castCurl($h, $a, $stub, $isNested); + } + + /** + * @param resource|\Dba\Connection $dba + */ + public static function castDba(mixed $dba, array $a, Stub $stub, bool $isNested): array + { + if (\PHP_VERSION_ID < 80402 && !\is_resource($dba)) { + // @see https://github.com/php/php-src/issues/16990 + return $a; + } + + $list = dba_list(); + $a['file'] = $list[(int) $dba]; + + return $a; + } + + public static function castProcess($process, array $a, Stub $stub, bool $isNested): array + { + return proc_get_status($process); + } + + public static function castStream($stream, array $a, Stub $stub, bool $isNested): array + { + $a = stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested); + if ($a['uri'] ?? false) { + $a['uri'] = new LinkStub($a['uri']); + } + + return $a; + } + + public static function castStreamContext($stream, array $a, Stub $stub, bool $isNested): array + { + return @stream_context_get_params($stream) ?: $a; + } + + /** + * @deprecated since Symfony 7.3 + */ + public static function castGd(\GdImage $gd, array $a, Stub $stub, bool $isNested): array + { + trigger_deprecation('symfony/var-dumper', '7.3', 'The "%s()" method is deprecated without replacement.', __METHOD__); + + return GdCaster::castGd($gd, $a, $stub, $isNested); + } + + /** + * @deprecated since Symfony 7.3 + */ + public static function castOpensslX509(\OpenSSLCertificate $h, array $a, Stub $stub, bool $isNested): array + { + trigger_deprecation('symfony/var-dumper', '7.3', 'The "%s()" method is deprecated without replacement.', __METHOD__); + + return OpenSSLCaster::castOpensslX509($h, $a, $stub, $isNested); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/ScalarStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/ScalarStub.php new file mode 100644 index 0000000..3bb1935 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/ScalarStub.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents any arbitrary value. + * + * @author Alexandre Daubois + */ +class ScalarStub extends Stub +{ + public function __construct(mixed $value) + { + $this->value = $value; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/SocketCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/SocketCaster.php new file mode 100644 index 0000000..6b95cd1 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/SocketCaster.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Nicolas Grekas + * @author Alexandre Daubois + * + * @internal + */ +final class SocketCaster +{ + public static function castSocket(\Socket $socket, array $a, Stub $stub, bool $isNested): array + { + socket_getsockname($socket, $addr, $port); + $info = stream_get_meta_data(socket_export_stream($socket)); + + if (\PHP_VERSION_ID >= 80300) { + $uri = ($info['uri'] ?? '//'); + if (str_starts_with($uri, 'unix://')) { + $uri .= $addr; + } else { + $uri .= \sprintf(str_contains($addr, ':') ? '[%s]:%s' : '%s:%s', $addr, $port); + } + + $a[Caster::PREFIX_VIRTUAL.'uri'] = $uri; + + if (@socket_atmark($socket)) { + $a[Caster::PREFIX_VIRTUAL.'atmark'] = true; + } + } + + $a += [ + Caster::PREFIX_VIRTUAL.'timed_out' => $info['timed_out'], + Caster::PREFIX_VIRTUAL.'blocked' => $info['blocked'], + ]; + + if (!$lastError = socket_last_error($socket)) { + return $a; + } + + static $errors; + + if (!$errors) { + $errors = get_defined_constants(true)['sockets'] ?? []; + $errors = array_flip(array_filter($errors, static fn ($k) => str_starts_with($k, 'SOCKET_E'), \ARRAY_FILTER_USE_KEY)); + } + + $a[Caster::PREFIX_VIRTUAL.'last_error'] = new ConstStub($errors[$lastError], socket_strerror($lastError)); + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/SplCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/SplCaster.php new file mode 100644 index 0000000..31f4b11 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/SplCaster.php @@ -0,0 +1,258 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts SPL related classes to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class SplCaster +{ + private const SPL_FILE_OBJECT_FLAGS = [ + \SplFileObject::DROP_NEW_LINE => 'DROP_NEW_LINE', + \SplFileObject::READ_AHEAD => 'READ_AHEAD', + \SplFileObject::SKIP_EMPTY => 'SKIP_EMPTY', + \SplFileObject::READ_CSV => 'READ_CSV', + ]; + + public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, bool $isNested): array + { + return self::castSplArray($c, $a, $stub, $isNested); + } + + public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, bool $isNested): array + { + return self::castSplArray($c, $a, $stub, $isNested); + } + + public static function castHeap(\Iterator $c, array $a, Stub $stub, bool $isNested): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'heap' => iterator_to_array(clone $c), + ]; + + return $a; + } + + public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + $mode = $c->getIteratorMode(); + $c->setIteratorMode(\SplDoublyLinkedList::IT_MODE_KEEP | $mode & ~\SplDoublyLinkedList::IT_MODE_DELETE); + + $a += [ + $prefix.'mode' => new ConstStub((($mode & \SplDoublyLinkedList::IT_MODE_LIFO) ? 'IT_MODE_LIFO' : 'IT_MODE_FIFO').' | '.(($mode & \SplDoublyLinkedList::IT_MODE_DELETE) ? 'IT_MODE_DELETE' : 'IT_MODE_KEEP'), $mode), + $prefix.'dllist' => iterator_to_array($c), + ]; + $c->setIteratorMode($mode); + + return $a; + } + + public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, bool $isNested): array + { + static $map = [ + 'path' => 'getPath', + 'filename' => 'getFilename', + 'basename' => 'getBasename', + 'pathname' => 'getPathname', + 'extension' => 'getExtension', + 'realPath' => 'getRealPath', + 'aTime' => 'getATime', + 'mTime' => 'getMTime', + 'cTime' => 'getCTime', + 'inode' => 'getInode', + 'size' => 'getSize', + 'perms' => 'getPerms', + 'owner' => 'getOwner', + 'group' => 'getGroup', + 'type' => 'getType', + 'writable' => 'isWritable', + 'readable' => 'isReadable', + 'executable' => 'isExecutable', + 'file' => 'isFile', + 'dir' => 'isDir', + 'link' => 'isLink', + 'linkTarget' => 'getLinkTarget', + ]; + + $prefix = Caster::PREFIX_VIRTUAL; + unset($a["\0SplFileInfo\0fileName"]); + unset($a["\0SplFileInfo\0pathName"]); + + try { + $c->isReadable(); + } catch (\RuntimeException $e) { + if ('Object not initialized' !== $e->getMessage()) { + throw $e; + } + + $a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state'; + + return $a; + } catch (\Error $e) { + if ('Object not initialized' !== $e->getMessage()) { + throw $e; + } + + $a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state'; + + return $a; + } + + foreach ($map as $key => $accessor) { + try { + $a[$prefix.$key] = $c->$accessor(); + } catch (\Exception) { + } + } + + if ($a[$prefix.'realPath'] ?? false) { + $a[$prefix.'realPath'] = new LinkStub($a[$prefix.'realPath']); + } + + if (isset($a[$prefix.'perms'])) { + $a[$prefix.'perms'] = new ConstStub(\sprintf('0%o', $a[$prefix.'perms']), $a[$prefix.'perms']); + } + + static $mapDate = ['aTime', 'mTime', 'cTime']; + foreach ($mapDate as $key) { + if (isset($a[$prefix.$key])) { + $a[$prefix.$key] = new ConstStub(date('Y-m-d H:i:s', $a[$prefix.$key]), $a[$prefix.$key]); + } + } + + return $a; + } + + public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, bool $isNested): array + { + static $map = [ + 'csvControl' => 'getCsvControl', + 'flags' => 'getFlags', + 'maxLineLen' => 'getMaxLineLen', + 'fstat' => 'fstat', + 'eof' => 'eof', + 'key' => 'key', + ]; + + $prefix = Caster::PREFIX_VIRTUAL; + + foreach ($map as $key => $accessor) { + try { + $a[$prefix.$key] = $c->$accessor(); + } catch (\Exception) { + } + } + + if (isset($a[$prefix.'flags'])) { + $flagsArray = []; + foreach (self::SPL_FILE_OBJECT_FLAGS as $value => $name) { + if ($a[$prefix.'flags'] & $value) { + $flagsArray[] = $name; + } + } + $a[$prefix.'flags'] = new ConstStub(implode('|', $flagsArray), $a[$prefix.'flags']); + } + + if (isset($a[$prefix.'fstat'])) { + $a[$prefix.'fstat'] = new CutArrayStub($a[$prefix.'fstat'], ['dev', 'ino', 'nlink', 'rdev', 'blksize', 'blocks']); + } + + return $a; + } + + public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, bool $isNested): array + { + $storage = []; + unset($a[Caster::PREFIX_DYNAMIC."\0gcdata"]); // Don't hit https://bugs.php.net/65967 + unset($a["\0SplObjectStorage\0storage"]); + + $clone = clone $c; + foreach ($clone as $obj) { + $storage[] = new EnumStub([ + 'object' => $obj, + 'info' => $clone->getInfo(), + ]); + } + + $a += [ + Caster::PREFIX_VIRTUAL.'storage' => $storage, + ]; + + return $a; + } + + public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator(); + + return $a; + } + + public static function castWeakReference(\WeakReference $c, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'object'] = $c->get(); + + return $a; + } + + public static function castWeakMap(\WeakMap $c, array $a, Stub $stub, bool $isNested): array + { + $map = []; + + foreach (clone $c as $obj => $data) { + $map[] = new EnumStub([ + 'object' => $obj, + 'data' => $data, + ]); + } + + $a += [ + Caster::PREFIX_VIRTUAL.'map' => $map, + ]; + + return $a; + } + + private static function castSplArray(\ArrayObject|\ArrayIterator $c, array $a, Stub $stub, bool $isNested): array + { + $prefix = Caster::PREFIX_VIRTUAL; + $flags = $c->getFlags(); + + if (!($flags & \ArrayObject::STD_PROP_LIST)) { + $c->setFlags(\ArrayObject::STD_PROP_LIST); + $a = Caster::castObject($c, $c::class, method_exists($c, '__debugInfo'), $stub->class); + $c->setFlags($flags); + } + + unset($a["\0ArrayObject\0storage"], $a["\0ArrayIterator\0storage"]); + + $a += [ + $prefix.'storage' => $c->getArrayCopy(), + $prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST), + $prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS), + ]; + if ($c instanceof \ArrayObject) { + $a[$prefix.'iteratorClass'] = new ClassStub($c->getIteratorClass()); + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/SqliteCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/SqliteCaster.php new file mode 100644 index 0000000..25d47ac --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/SqliteCaster.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Alexandre Daubois + * + * @internal + */ +final class SqliteCaster +{ + public static function castSqlite3Result(\SQLite3Result $result, array $a, Stub $stub, bool $isNested): array + { + $numColumns = $result->numColumns(); + for ($i = 0; $i < $numColumns; ++$i) { + $a[Caster::PREFIX_VIRTUAL.'columnNames'][$i] = $result->columnName($i); + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/StubCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/StubCaster.php new file mode 100644 index 0000000..85cf997 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/StubCaster.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts a caster's Stub. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class StubCaster +{ + public static function castStub(Stub $c, array $a, Stub $stub, bool $isNested): array + { + if ($isNested) { + $stub->type = $c->type; + $stub->class = $c->class; + $stub->value = $c->value; + $stub->handle = $c->handle; + $stub->cut = $c->cut; + $stub->attr = $c->attr; + + if (Stub::TYPE_REF === $c->type && !$c->class && \is_string($c->value) && !preg_match('//u', $c->value)) { + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_BINARY; + } + + $a = []; + } + + return $a; + } + + public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, bool $isNested): array + { + return $isNested ? $c->preservedSubset : $a; + } + + public static function cutInternals($obj, array $a, Stub $stub, bool $isNested): array + { + if ($isNested) { + $stub->cut += \count($a); + + return []; + } + + return $a; + } + + public static function castEnum(EnumStub $c, array $a, Stub $stub, bool $isNested): array + { + if ($isNested) { + $stub->class = $c->dumpKeys ? '' : null; + $stub->handle = 0; + $stub->value = null; + $stub->cut = $c->cut; + $stub->attr = $c->attr; + + $a = []; + + if ($c->value) { + foreach (array_keys($c->value) as $k) { + $keys[] = !isset($k[0]) || "\0" !== $k[0] ? Caster::PREFIX_VIRTUAL.$k : $k; + } + // Preserve references with array_combine() + $a = array_combine($keys, $c->value); + } + } + + return $a; + } + + public static function castScalar(ScalarStub $scalarStub, array $a, Stub $stub): array + { + $stub->type = Stub::TYPE_SCALAR; + $stub->attr['value'] = $scalarStub->value; + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/SymfonyCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/SymfonyCaster.php new file mode 100644 index 0000000..a81d399 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/SymfonyCaster.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Uid\Ulid; +use Symfony\Component\Uid\Uuid; +use Symfony\Component\VarDumper\Cloner\Stub; +use Symfony\Component\VarExporter\Internal\LazyObjectState; + +/** + * @final + * + * @internal since Symfony 7.3 + */ +class SymfonyCaster +{ + private const REQUEST_GETTERS = [ + 'pathInfo' => 'getPathInfo', + 'requestUri' => 'getRequestUri', + 'baseUrl' => 'getBaseUrl', + 'basePath' => 'getBasePath', + 'method' => 'getMethod', + 'format' => 'getRequestFormat', + ]; + + public static function castRequest(Request $request, array $a, Stub $stub, bool $isNested): array + { + $clone = null; + + foreach (self::REQUEST_GETTERS as $prop => $getter) { + $key = Caster::PREFIX_PROTECTED.$prop; + if (\array_key_exists($key, $a) && null === $a[$key]) { + $clone ??= clone $request; + $a[Caster::PREFIX_VIRTUAL.$prop] = $clone->{$getter}(); + } + } + + return $a; + } + + public static function castHttpClient($client, array $a, Stub $stub, bool $isNested): array + { + $multiKey = \sprintf("\0%s\0multi", $client::class); + if (isset($a[$multiKey]) && !$a[$multiKey] instanceof Stub) { + $a[$multiKey] = new CutStub($a[$multiKey]); + } + + return $a; + } + + public static function castHttpClientResponse($response, array $a, Stub $stub, bool $isNested): array + { + $stub->cut += \count($a); + $a = []; + + foreach ($response->getInfo() as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + + return $a; + } + + public static function castLazyObjectState($state, array $a, Stub $stub, bool $isNested): array + { + if (!$isNested) { + return $a; + } + + $stub->cut += \count($a) - 1; + + $instance = $a['realInstance'] ?? null; + + if (isset($a['status'])) { // forward-compat with Symfony 8 + $a = ['status' => new ConstStub(match ($a['status']) { + LazyObjectState::STATUS_INITIALIZED_FULL => 'INITIALIZED_FULL', + LazyObjectState::STATUS_INITIALIZED_PARTIAL => 'INITIALIZED_PARTIAL', + LazyObjectState::STATUS_UNINITIALIZED_FULL => 'UNINITIALIZED_FULL', + LazyObjectState::STATUS_UNINITIALIZED_PARTIAL => 'UNINITIALIZED_PARTIAL', + }, $a['status'])]; + } + + if ($instance) { + $a['realInstance'] = $instance; + --$stub->cut; + } + + return $a; + } + + public static function castUuid(Uuid $uuid, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'toBase58'] = $uuid->toBase58(); + $a[Caster::PREFIX_VIRTUAL.'toBase32'] = $uuid->toBase32(); + + // symfony/uid >= 5.3 + if (method_exists($uuid, 'getDateTime')) { + $a[Caster::PREFIX_VIRTUAL.'time'] = $uuid->getDateTime()->format('Y-m-d H:i:s.u \U\T\C'); + } + + return $a; + } + + public static function castUlid(Ulid $ulid, array $a, Stub $stub, bool $isNested): array + { + $a[Caster::PREFIX_VIRTUAL.'toBase58'] = $ulid->toBase58(); + $a[Caster::PREFIX_VIRTUAL.'toRfc4122'] = $ulid->toRfc4122(); + + // symfony/uid >= 5.3 + if (method_exists($ulid, 'getDateTime')) { + $a[Caster::PREFIX_VIRTUAL.'time'] = $ulid->getDateTime()->format('Y-m-d H:i:s.v \U\T\C'); + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/TraceStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/TraceStub.php new file mode 100644 index 0000000..b732eb2 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/TraceStub.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a backtrace as returned by debug_backtrace() or Exception->getTrace(). + * + * @author Nicolas Grekas + */ +class TraceStub extends Stub +{ + public function __construct( + array $trace, + public bool $keepArgs = true, + public int $sliceOffset = 0, + public ?int $sliceLength = null, + public int $numberingOffset = 0, + ) { + $this->value = $trace; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/UninitializedStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/UninitializedStub.php new file mode 100644 index 0000000..a9bdd9b --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/UninitializedStub.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents an uninitialized property. + * + * @author Nicolas Grekas + */ +class UninitializedStub extends ConstStub +{ + public function __construct(\ReflectionProperty $property) + { + parent::__construct('?'.($property->hasType() ? ' '.$property->getType() : ''), 'Uninitialized property'); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/UuidCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/UuidCaster.php new file mode 100644 index 0000000..732ad7c --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/UuidCaster.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Ramsey\Uuid\UuidInterface; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * @author Grégoire Pineau + * + * @internal since Symfony 7.3 + */ +final class UuidCaster +{ + public static function castRamseyUuid(UuidInterface $c, array $a, Stub $stub, bool $isNested): array + { + $a += [ + Caster::PREFIX_VIRTUAL.'uuid' => (string) $c, + ]; + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/VirtualStub.php b/upLoadImage/vendor/symfony/var-dumper/Caster/VirtualStub.php new file mode 100644 index 0000000..60b58fa --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/VirtualStub.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +class VirtualStub extends ConstStub +{ + public function __construct(\ReflectionProperty $property) + { + parent::__construct('~'.($property->hasType() ? ' '.$property->getType() : ''), 'Virtual property'); + $this->attr['virtual'] = true; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php new file mode 100644 index 0000000..00420c7 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts XmlReader class to array representation. + * + * @author Baptiste Clavié + * + * @final + * + * @internal since Symfony 7.3 + */ +class XmlReaderCaster +{ + private const NODE_TYPES = [ + \XMLReader::NONE => 'NONE', + \XMLReader::ELEMENT => 'ELEMENT', + \XMLReader::ATTRIBUTE => 'ATTRIBUTE', + \XMLReader::TEXT => 'TEXT', + \XMLReader::CDATA => 'CDATA', + \XMLReader::ENTITY_REF => 'ENTITY_REF', + \XMLReader::ENTITY => 'ENTITY', + \XMLReader::PI => 'PI (Processing Instruction)', + \XMLReader::COMMENT => 'COMMENT', + \XMLReader::DOC => 'DOC', + \XMLReader::DOC_TYPE => 'DOC_TYPE', + \XMLReader::DOC_FRAGMENT => 'DOC_FRAGMENT', + \XMLReader::NOTATION => 'NOTATION', + \XMLReader::WHITESPACE => 'WHITESPACE', + \XMLReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE', + \XMLReader::END_ELEMENT => 'END_ELEMENT', + \XMLReader::END_ENTITY => 'END_ENTITY', + \XMLReader::XML_DECLARATION => 'XML_DECLARATION', + ]; + + public static function castXmlReader(\XMLReader $reader, array $a, Stub $stub, bool $isNested): array + { + try { + $properties = [ + 'LOADDTD' => @$reader->getParserProperty(\XMLReader::LOADDTD), + 'DEFAULTATTRS' => @$reader->getParserProperty(\XMLReader::DEFAULTATTRS), + 'VALIDATE' => @$reader->getParserProperty(\XMLReader::VALIDATE), + 'SUBST_ENTITIES' => @$reader->getParserProperty(\XMLReader::SUBST_ENTITIES), + ]; + } catch (\Error) { + $properties = [ + 'LOADDTD' => false, + 'DEFAULTATTRS' => false, + 'VALIDATE' => false, + 'SUBST_ENTITIES' => false, + ]; + } + + $props = Caster::PREFIX_VIRTUAL.'parserProperties'; + $info = [ + 'localName' => $reader->localName, + 'prefix' => $reader->prefix, + 'nodeType' => new ConstStub(self::NODE_TYPES[$reader->nodeType], $reader->nodeType), + 'depth' => $reader->depth, + 'isDefault' => $reader->isDefault, + 'isEmptyElement' => \XMLReader::NONE === $reader->nodeType ? null : $reader->isEmptyElement, + 'xmlLang' => $reader->xmlLang, + 'attributeCount' => $reader->attributeCount, + 'value' => $reader->value, + 'namespaceURI' => $reader->namespaceURI, + 'baseURI' => $reader->baseURI ? new LinkStub($reader->baseURI) : $reader->baseURI, + $props => $properties, + ]; + + if ($info[$props] = Caster::filter($info[$props], Caster::EXCLUDE_EMPTY, [], $count)) { + $info[$props] = new EnumStub($info[$props]); + $info[$props]->cut = $count; + } + + $a = Caster::filter($a, Caster::EXCLUDE_UNINITIALIZED, [], $count); + $info = Caster::filter($info, Caster::EXCLUDE_EMPTY, [], $count); + // +2 because hasValue and hasAttributes are always filtered + $stub->cut += $count + 2; + + return $a + $info; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php b/upLoadImage/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php new file mode 100644 index 0000000..f6b0896 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts XML resources to array representation. + * + * @author Nicolas Grekas + * + * @final + * + * @internal since Symfony 7.3 + */ +class XmlResourceCaster +{ + private const XML_ERRORS = [ + \XML_ERROR_NONE => 'XML_ERROR_NONE', + \XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY', + \XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX', + \XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS', + \XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN', + \XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN', + \XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR', + \XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH', + \XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE', + \XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT', + \XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF', + \XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY', + \XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF', + \XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY', + \XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF', + \XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF', + \XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF', + \XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI', + \XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING', + \XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING', + \XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION', + \XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING', + ]; + + public static function castXml($h, array $a, Stub $stub, bool $isNested): array + { + $a['current_byte_index'] = xml_get_current_byte_index($h); + $a['current_column_number'] = xml_get_current_column_number($h); + $a['current_line_number'] = xml_get_current_line_number($h); + $a['error_code'] = xml_get_error_code($h); + + if (isset(self::XML_ERRORS[$a['error_code']])) { + $a['error_code'] = new ConstStub(self::XML_ERRORS[$a['error_code']], $a['error_code']); + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/upLoadImage/vendor/symfony/var-dumper/Cloner/AbstractCloner.php new file mode 100644 index 0000000..2f7d940 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Cloner/AbstractCloner.php @@ -0,0 +1,413 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Exception\ThrowingCasterException; + +/** + * AbstractCloner implements a generic caster mechanism for objects and resources. + * + * @author Nicolas Grekas + */ +abstract class AbstractCloner implements ClonerInterface +{ + public static array $defaultCasters = [ + '__PHP_Incomplete_Class' => ['Symfony\Component\VarDumper\Caster\Caster', 'castPhpIncompleteClass'], + + 'AddressInfo' => ['Symfony\Component\VarDumper\Caster\AddressInfoCaster', 'castAddressInfo'], + 'Socket' => ['Symfony\Component\VarDumper\Caster\SocketCaster', 'castSocket'], + + 'Symfony\Component\VarDumper\Caster\CutStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], + 'Symfony\Component\VarDumper\Caster\CutArrayStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'], + 'Symfony\Component\VarDumper\Caster\ConstStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], + 'Symfony\Component\VarDumper\Caster\EnumStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'], + 'Symfony\Component\VarDumper\Caster\ScalarStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castScalar'], + + 'Fiber' => ['Symfony\Component\VarDumper\Caster\FiberCaster', 'castFiber'], + + 'Closure' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClosure'], + 'Generator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castGenerator'], + 'ReflectionType' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castType'], + 'ReflectionAttribute' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castAttribute'], + 'ReflectionGenerator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReflectionGenerator'], + 'ReflectionClass' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClass'], + 'ReflectionClassConstant' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClassConstant'], + 'ReflectionFunctionAbstract' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castFunctionAbstract'], + 'ReflectionMethod' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castMethod'], + 'ReflectionParameter' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castParameter'], + 'ReflectionProperty' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castProperty'], + 'ReflectionReference' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReference'], + 'ReflectionExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castExtension'], + 'ReflectionZendExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castZendExtension'], + + 'Doctrine\Common\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Doctrine\Common\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castCommonProxy'], + 'Doctrine\ORM\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castOrmProxy'], + 'Doctrine\ORM\PersistentCollection' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castPersistentCollection'], + 'Doctrine\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + + 'DOMException' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'], + 'Dom\Exception' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'], + 'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'DOMImplementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'], + 'Dom\Implementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'], + 'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'Dom\Node' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'DOMDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'], + 'Dom\XMLDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXMLDocument'], + 'Dom\HTMLDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castHTMLDocument'], + 'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'Dom\NodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'Dom\DTDNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'Dom\XPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'Dom\HTMLCollection' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + 'Dom\TokenList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'], + + 'XMLReader' => ['Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'], + + 'ErrorException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castErrorException'], + 'Exception' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castException'], + 'Error' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castError'], + 'Symfony\Bridge\Monolog\Logger' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\EventDispatcher\EventDispatcherInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\HttpClient\AmpHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'], + 'Symfony\Component\HttpClient\CurlHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'], + 'Symfony\Component\HttpClient\NativeHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'], + 'Symfony\Component\HttpClient\Response\AmpResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], + 'Symfony\Component\HttpClient\Response\AmpResponseV4' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], + 'Symfony\Component\HttpClient\Response\AmpResponseV5' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], + 'Symfony\Component\HttpClient\Response\CurlResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], + 'Symfony\Component\HttpClient\Response\NativeResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], + 'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'], + 'Symfony\Component\Uid\Ulid' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castUlid'], + 'Symfony\Component\Uid\Uuid' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castUuid'], + 'Symfony\Component\VarExporter\Internal\LazyObjectState' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castLazyObjectState'], + 'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'], + 'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'], + 'Symfony\Component\VarDumper\Caster\FrameStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'], + 'Symfony\Component\VarDumper\Cloner\AbstractCloner' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\ErrorHandler\Exception\FlattenException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFlattenException'], + 'Symfony\Component\ErrorHandler\Exception\SilencedErrorContext' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'], + + 'Imagine\Image\ImageInterface' => ['Symfony\Component\VarDumper\Caster\ImagineCaster', 'castImage'], + + 'Ramsey\Uuid\UuidInterface' => ['Symfony\Component\VarDumper\Caster\UuidCaster', 'castRamseyUuid'], + + 'ProxyManager\Proxy\ProxyInterface' => ['Symfony\Component\VarDumper\Caster\ProxyManagerCaster', 'castProxy'], + 'PHPUnit_Framework_MockObject_MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'PHPUnit\Framework\MockObject\MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'PHPUnit\Framework\MockObject\Stub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Prophecy\Prophecy\ProphecySubjectInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Mockery\MockInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + + 'PDO' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdo'], + 'PDOStatement' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdoStatement'], + + 'AMQPConnection' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castConnection'], + 'AMQPChannel' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castChannel'], + 'AMQPQueue' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castQueue'], + 'AMQPExchange' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castExchange'], + 'AMQPEnvelope' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castEnvelope'], + + 'ArrayObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayObject'], + 'ArrayIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayIterator'], + 'SplDoublyLinkedList' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castDoublyLinkedList'], + 'SplFileInfo' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileInfo'], + 'SplFileObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileObject'], + 'SplHeap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], + 'SplObjectStorage' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'], + 'SplPriorityQueue' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], + 'OuterIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'], + 'WeakMap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakMap'], + 'WeakReference' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakReference'], + + 'Redis' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'], + 'Relay\Relay' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'], + 'RedisArray' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'], + 'RedisCluster' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisCluster'], + + 'DateTimeInterface' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castDateTime'], + 'DateInterval' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castInterval'], + 'DateTimeZone' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castTimeZone'], + 'DatePeriod' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castPeriod'], + + 'GMP' => ['Symfony\Component\VarDumper\Caster\GmpCaster', 'castGmp'], + + 'MessageFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castMessageFormatter'], + 'NumberFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castNumberFormatter'], + 'IntlTimeZone' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlTimeZone'], + 'IntlCalendar' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlCalendar'], + 'IntlDateFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlDateFormatter'], + + 'Memcached' => ['Symfony\Component\VarDumper\Caster\MemcachedCaster', 'castMemcached'], + + 'Ds\Collection' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castCollection'], + 'Ds\Map' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castMap'], + 'Ds\Pair' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPair'], + 'Symfony\Component\VarDumper\Caster\DsPairStub' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPairStub'], + + 'mysqli_driver' => ['Symfony\Component\VarDumper\Caster\MysqliCaster', 'castMysqliDriver'], + + 'CurlHandle' => ['Symfony\Component\VarDumper\Caster\CurlCaster', 'castCurl'], + + 'Dba\Connection' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], + ':dba' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], + ':dba persistent' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], + + 'GdImage' => ['Symfony\Component\VarDumper\Caster\GdCaster', 'castGd'], + + 'SQLite3Result' => ['Symfony\Component\VarDumper\Caster\SqliteCaster', 'castSqlite3Result'], + + 'PgSql\Lob' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLargeObject'], + 'PgSql\Connection' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'], + 'PgSql\Result' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castResult'], + + ':process' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castProcess'], + ':stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], + + 'OpenSSLAsymmetricKey' => ['Symfony\Component\VarDumper\Caster\OpenSSLCaster', 'castOpensslAsymmetricKey'], + 'OpenSSLCertificateSigningRequest' => ['Symfony\Component\VarDumper\Caster\OpenSSLCaster', 'castOpensslCsr'], + 'OpenSSLCertificate' => ['Symfony\Component\VarDumper\Caster\OpenSSLCaster', 'castOpensslX509'], + + ':persistent stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], + ':stream-context' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStreamContext'], + + 'XmlParser' => ['Symfony\Component\VarDumper\Caster\XmlResourceCaster', 'castXml'], + + 'RdKafka' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castRdKafka'], + 'RdKafka\Conf' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castConf'], + 'RdKafka\KafkaConsumer' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castKafkaConsumer'], + 'RdKafka\Metadata\Broker' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castBrokerMetadata'], + 'RdKafka\Metadata\Collection' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castCollectionMetadata'], + 'RdKafka\Metadata\Partition' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castPartitionMetadata'], + 'RdKafka\Metadata\Topic' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicMetadata'], + 'RdKafka\Message' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castMessage'], + 'RdKafka\Topic' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopic'], + 'RdKafka\TopicPartition' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicPartition'], + 'RdKafka\TopicConf' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicConf'], + + 'FFI\CData' => ['Symfony\Component\VarDumper\Caster\FFICaster', 'castCTypeOrCData'], + 'FFI\CType' => ['Symfony\Component\VarDumper\Caster\FFICaster', 'castCTypeOrCData'], + ]; + + protected int $maxItems = 2500; + protected int $maxString = -1; + protected int $minDepth = 1; + + /** + * @var array> + */ + private array $casters = []; + + /** + * @var callable|null + */ + private $prevErrorHandler; + + private array $classInfo = []; + private int $filter = 0; + + /** + * @param callable[]|null $casters A map of casters + * + * @see addCasters + */ + public function __construct(?array $casters = null) + { + $this->addCasters($casters ?? static::$defaultCasters); + } + + /** + * Adds casters for resources and objects. + * + * Maps resources or object types to a callback. + * Use types as keys and callable casters as values. + * Prefix types with `::`, + * see e.g. self::$defaultCasters. + * + * @param array $casters A map of casters + */ + public function addCasters(array $casters): void + { + foreach ($casters as $type => $callback) { + $this->casters[$type][] = $callback; + } + } + + /** + * Adds default casters for resources and objects. + * + * Maps resources or object types to a callback. + * Use types as keys and callable casters as values. + * Prefix types with `::`, + * see e.g. self::$defaultCasters. + * + * @param array $casters A map of casters + */ + public static function addDefaultCasters(array $casters): void + { + self::$defaultCasters = [...self::$defaultCasters, ...$casters]; + } + + /** + * Sets the maximum number of items to clone past the minimum depth in nested structures. + */ + public function setMaxItems(int $maxItems): void + { + $this->maxItems = $maxItems; + } + + /** + * Sets the maximum cloned length for strings. + */ + public function setMaxString(int $maxString): void + { + $this->maxString = $maxString; + } + + /** + * Sets the minimum tree depth where we are guaranteed to clone all the items. After this + * depth is reached, only setMaxItems items will be cloned. + */ + public function setMinDepth(int $minDepth): void + { + $this->minDepth = $minDepth; + } + + /** + * Clones a PHP variable. + * + * @param int $filter A bit field of Caster::EXCLUDE_* constants + */ + public function cloneVar(mixed $var, int $filter = 0): Data + { + $this->prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) { + if (\E_RECOVERABLE_ERROR === $type || \E_USER_ERROR === $type) { + // Cloner never dies + throw new \ErrorException($msg, 0, $type, $file, $line); + } + + if ($this->prevErrorHandler) { + return ($this->prevErrorHandler)($type, $msg, $file, $line, $context); + } + + return false; + }); + $this->filter = $filter; + + if ($gc = gc_enabled()) { + gc_disable(); + } + try { + return new Data($this->doClone($var)); + } finally { + if ($gc) { + gc_enable(); + } + restore_error_handler(); + $this->prevErrorHandler = null; + } + } + + /** + * Effectively clones the PHP variable. + */ + abstract protected function doClone(mixed $var): array; + + /** + * Casts an object to an array representation. + * + * @param bool $isNested True if the object is nested in the dumped structure + */ + protected function castObject(Stub $stub, bool $isNested): array + { + $obj = $stub->value; + $class = $stub->class; + + if (str_contains($class, "@anonymous\0")) { + $stub->class = get_debug_type($obj); + } + if (isset($this->classInfo[$class])) { + [$i, $parents, $hasDebugInfo, $fileInfo] = $this->classInfo[$class]; + } else { + $i = 2; + $parents = [$class]; + $hasDebugInfo = method_exists($class, '__debugInfo'); + + foreach (class_parents($class) as $p) { + $parents[] = $p; + ++$i; + } + foreach (class_implements($class) as $p) { + $parents[] = $p; + ++$i; + } + $parents[] = '*'; + + $r = new \ReflectionClass($class); + $fileInfo = $r->isInternal() || $r->isSubclassOf(Stub::class) ? [] : [ + 'file' => $r->getFileName(), + 'line' => $r->getStartLine(), + ]; + + $this->classInfo[$class] = [$i, $parents, $hasDebugInfo, $fileInfo]; + } + + $stub->attr += $fileInfo; + $a = Caster::castObject($obj, $class, $hasDebugInfo, $stub->class); + + try { + while ($i--) { + if (!empty($this->casters[$p = $parents[$i]])) { + foreach ($this->casters[$p] as $callback) { + $a = $callback($obj, $a, $stub, $isNested, $this->filter); + } + } + } + } catch (\Exception $e) { + $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; + } + + return $a; + } + + /** + * Casts a resource to an array representation. + * + * @param bool $isNested True if the object is nested in the dumped structure + */ + protected function castResource(Stub $stub, bool $isNested): array + { + $a = []; + $res = $stub->value; + $type = $stub->class; + + try { + if (!empty($this->casters[':'.$type])) { + foreach ($this->casters[':'.$type] as $callback) { + $a = $callback($res, $a, $stub, $isNested, $this->filter); + } + } + } catch (\Exception $e) { + $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; + } + + return $a; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Cloner/ClonerInterface.php b/upLoadImage/vendor/symfony/var-dumper/Cloner/ClonerInterface.php new file mode 100644 index 0000000..5a8e2e4 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Cloner/ClonerInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * @author Nicolas Grekas + */ +interface ClonerInterface +{ + /** + * Clones a PHP variable. + */ + public function cloneVar(mixed $var): Data; +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Cloner/Cursor.php b/upLoadImage/vendor/symfony/var-dumper/Cloner/Cursor.php new file mode 100644 index 0000000..8923007 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Cloner/Cursor.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * Represents the current state of a dumper while dumping. + * + * @author Nicolas Grekas + */ +class Cursor +{ + public const HASH_INDEXED = Stub::ARRAY_INDEXED; + public const HASH_ASSOC = Stub::ARRAY_ASSOC; + public const HASH_OBJECT = Stub::TYPE_OBJECT; + public const HASH_RESOURCE = Stub::TYPE_RESOURCE; + + public int $depth = 0; + public int $refIndex = 0; + public int $softRefTo = 0; + public int $softRefCount = 0; + public int $softRefHandle = 0; + public int $hardRefTo = 0; + public int $hardRefCount = 0; + public int $hardRefHandle = 0; + public int $hashType; + public string|int|null $hashKey = null; + public bool $hashKeyIsBinary; + public int $hashIndex = 0; + public int $hashLength = 0; + public int $hashCut = 0; + public bool $stop = false; + public array $attr = []; + public bool $skipChildren = false; +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Cloner/Data.php b/upLoadImage/vendor/symfony/var-dumper/Cloner/Data.php new file mode 100644 index 0000000..21727f9 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Cloner/Data.php @@ -0,0 +1,429 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; + +/** + * @author Nicolas Grekas + */ +class Data implements \ArrayAccess, \Countable, \IteratorAggregate, \Stringable +{ + private array $data; + private int $position = 0; + private int|string $key = 0; + private int $maxDepth = 20; + private int $maxItemsPerDepth = -1; + private int $useRefHandles = -1; + private array $context = []; + + /** + * @param array $data An array as returned by ClonerInterface::cloneVar() + */ + public function __construct(array $data) + { + $this->data = $data; + } + + public function getType(): ?string + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!$item instanceof Stub) { + return \gettype($item); + } + if (Stub::TYPE_STRING === $item->type) { + return 'string'; + } + if (Stub::TYPE_ARRAY === $item->type) { + return 'array'; + } + if (Stub::TYPE_OBJECT === $item->type) { + return $item->class; + } + if (Stub::TYPE_RESOURCE === $item->type) { + return $item->class.' resource'; + } + + return null; + } + + /** + * Returns a native representation of the original value. + * + * @param array|bool $recursive Whether values should be resolved recursively or not + * + * @return string|int|float|bool|array|Data[]|null + */ + public function getValue(array|bool $recursive = false): string|int|float|bool|array|null + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!($item = $this->getStub($item)) instanceof Stub) { + return $item; + } + if (Stub::TYPE_STRING === $item->type) { + return $item->value; + } + + $children = $item->position ? $this->data[$item->position] : []; + + foreach ($children as $k => $v) { + if ($recursive && !($v = $this->getStub($v)) instanceof Stub) { + continue; + } + $children[$k] = clone $this; + $children[$k]->key = $k; + $children[$k]->position = $item->position; + + if ($recursive) { + if (Stub::TYPE_REF === $v->type && ($v = $this->getStub($v->value)) instanceof Stub) { + $recursive = (array) $recursive; + if (isset($recursive[$v->position])) { + continue; + } + $recursive[$v->position] = true; + } + $children[$k] = $children[$k]->getValue($recursive); + } + } + + return $children; + } + + public function count(): int + { + return \count($this->getValue()); + } + + public function getIterator(): \Traversable + { + if (!\is_array($value = $this->getValue())) { + throw new \LogicException(\sprintf('"%s" object holds non-iterable type "%s".', self::class, get_debug_type($value))); + } + + yield from $value; + } + + public function __get(string $key): mixed + { + if (null !== $data = $this->seek($key)) { + $item = $this->getStub($data->data[$data->position][$data->key]); + + return $item instanceof Stub || [] === $item ? $data : $item; + } + + return null; + } + + public function __isset(string $key): bool + { + return null !== $this->seek($key); + } + + public function offsetExists(mixed $key): bool + { + return $this->__isset($key); + } + + public function offsetGet(mixed $key): mixed + { + return $this->__get($key); + } + + public function offsetSet(mixed $key, mixed $value): void + { + throw new \BadMethodCallException(self::class.' objects are immutable.'); + } + + public function offsetUnset(mixed $key): void + { + throw new \BadMethodCallException(self::class.' objects are immutable.'); + } + + public function __toString(): string + { + $value = $this->getValue(); + + if (!\is_array($value)) { + return (string) $value; + } + + return \sprintf('%s (count=%d)', $this->getType(), \count($value)); + } + + /** + * Returns a depth limited clone of $this. + */ + public function withMaxDepth(int $maxDepth): static + { + $data = clone $this; + $data->maxDepth = $maxDepth; + + return $data; + } + + /** + * Limits the number of elements per depth level. + */ + public function withMaxItemsPerDepth(int $maxItemsPerDepth): static + { + $data = clone $this; + $data->maxItemsPerDepth = $maxItemsPerDepth; + + return $data; + } + + /** + * Enables/disables objects' identifiers tracking. + * + * @param bool $useRefHandles False to hide global ref. handles + */ + public function withRefHandles(bool $useRefHandles): static + { + $data = clone $this; + $data->useRefHandles = $useRefHandles ? -1 : 0; + + return $data; + } + + public function withContext(array $context): static + { + $data = clone $this; + $data->context = $context; + + return $data; + } + + public function getContext(): array + { + return $this->context; + } + + /** + * Seeks to a specific key in nested data structures. + */ + public function seek(string|int $key): ?static + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!($item = $this->getStub($item)) instanceof Stub || !$item->position) { + return null; + } + $keys = [$key]; + + switch ($item->type) { + case Stub::TYPE_OBJECT: + $keys[] = Caster::PREFIX_DYNAMIC.$key; + $keys[] = Caster::PREFIX_PROTECTED.$key; + $keys[] = Caster::PREFIX_VIRTUAL.$key; + $keys[] = "\0$item->class\0$key"; + // no break + case Stub::TYPE_ARRAY: + case Stub::TYPE_RESOURCE: + break; + default: + return null; + } + + $data = null; + $children = $this->data[$item->position]; + + foreach ($keys as $key) { + if (isset($children[$key]) || \array_key_exists($key, $children)) { + $data = clone $this; + $data->key = $key; + $data->position = $item->position; + break; + } + } + + return $data; + } + + /** + * Dumps data with a DumperInterface dumper. + */ + public function dump(DumperInterface $dumper): void + { + $refs = [0]; + $cursor = new Cursor(); + $cursor->hashType = -1; + $cursor->attr = $this->context[SourceContextProvider::class] ?? []; + $label = $this->context['label'] ?? ''; + + if ($cursor->attr || '' !== $label) { + $dumper->dumpScalar($cursor, 'label', $label); + } + $cursor->hashType = 0; + $this->dumpItem($dumper, $cursor, $refs, $this->data[$this->position][$this->key]); + } + + /** + * Depth-first dumping of items. + * + * @param mixed $item A Stub object or the original value being dumped + */ + private function dumpItem(DumperInterface $dumper, Cursor $cursor, array &$refs, mixed $item): void + { + $cursor->refIndex = 0; + $cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0; + $cursor->hardRefTo = $cursor->hardRefHandle = $cursor->hardRefCount = 0; + $firstSeen = true; + + if (!$item instanceof Stub) { + $cursor->attr = []; + $type = \gettype($item); + if ('array' === $type && $item) { + $item = $this->getStub($item); + } + } elseif (Stub::TYPE_REF === $item->type) { + if ($item->handle) { + if (!isset($refs[$r = $item->handle - (\PHP_INT_MAX >> 1)])) { + $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; + } else { + $firstSeen = false; + } + $cursor->hardRefTo = $refs[$r]; + $cursor->hardRefHandle = $this->useRefHandles & $item->handle; + $cursor->hardRefCount = 0 < $item->handle ? $item->refCount : 0; + } + $cursor->attr = $item->attr; + $type = $item->class ?: \gettype($item->value); + $item = $this->getStub($item->value); + } + if ($item instanceof Stub) { + if ($item->refCount) { + if (!isset($refs[$r = $item->handle])) { + $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; + } else { + $firstSeen = false; + } + $cursor->softRefTo = $refs[$r]; + } + $cursor->softRefHandle = $this->useRefHandles & $item->handle; + $cursor->softRefCount = $item->refCount; + $cursor->attr = $item->attr; + $cut = $item->cut; + + if ($item->position && $firstSeen) { + $children = $this->data[$item->position]; + + if ($cursor->stop) { + if ($cut >= 0) { + $cut += \count($children); + } + $children = []; + } + } else { + $children = []; + } + switch ($item->type) { + case Stub::TYPE_STRING: + $dumper->dumpString($cursor, $item->value, Stub::STRING_BINARY === $item->class, $cut); + break; + + case Stub::TYPE_ARRAY: + $item = clone $item; + $item->type = $item->class; + $item->class = $item->value; + // no break + case Stub::TYPE_OBJECT: + case Stub::TYPE_RESOURCE: + $withChildren = $children && $cursor->depth !== $this->maxDepth && $this->maxItemsPerDepth; + $dumper->enterHash($cursor, $item->type, $item->class, $withChildren); + if ($withChildren) { + if ($cursor->skipChildren) { + $withChildren = false; + $cut = -1; + } else { + $cut = $this->dumpChildren($dumper, $cursor, $refs, $children, $cut, $item->type, null !== $item->class); + } + } elseif ($children && 0 <= $cut) { + $cut += \count($children); + } + $cursor->skipChildren = false; + $dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut); + break; + + case Stub::TYPE_SCALAR: + $dumper->dumpScalar($cursor, 'default', $item->attr['value']); + break; + + default: + throw new \RuntimeException(\sprintf('Unexpected Stub type: "%s".', $item->type)); + } + } elseif ('array' === $type) { + $dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false); + $dumper->leaveHash($cursor, Cursor::HASH_INDEXED, 0, false, 0); + } elseif ('string' === $type) { + $dumper->dumpString($cursor, $item, false, 0); + } else { + $dumper->dumpScalar($cursor, $type, $item); + } + } + + /** + * Dumps children of hash structures. + * + * @return int The final number of removed items + */ + private function dumpChildren(DumperInterface $dumper, Cursor $parentCursor, array &$refs, array $children, int $hashCut, int $hashType, bool $dumpKeys): int + { + $cursor = clone $parentCursor; + ++$cursor->depth; + $cursor->hashType = $hashType; + $cursor->hashIndex = 0; + $cursor->hashLength = \count($children); + $cursor->hashCut = $hashCut; + foreach ($children as $key => $child) { + $cursor->hashKeyIsBinary = isset($key[0]) && !preg_match('//u', $key); + $cursor->hashKey = $dumpKeys ? $key : null; + $this->dumpItem($dumper, $cursor, $refs, $child); + if (++$cursor->hashIndex === $this->maxItemsPerDepth || $cursor->stop) { + $parentCursor->stop = true; + + return $hashCut >= 0 ? $hashCut + $cursor->hashLength - $cursor->hashIndex : $hashCut; + } + } + + return $hashCut; + } + + private function getStub(mixed $item): mixed + { + if (!$item || !\is_array($item)) { + return $item; + } + + $stub = new Stub(); + $stub->type = Stub::TYPE_ARRAY; + foreach ($item as $stub->class => $stub->position) { + } + if (isset($item[0])) { + $stub->cut = $item[0]; + } + $stub->value = $stub->cut + ($stub->position ? \count($this->data[$stub->position]) : 0); + + return $stub; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Cloner/DumperInterface.php b/upLoadImage/vendor/symfony/var-dumper/Cloner/DumperInterface.php new file mode 100644 index 0000000..10f2da0 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Cloner/DumperInterface.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * DumperInterface used by Data objects. + * + * @author Nicolas Grekas + */ +interface DumperInterface +{ + /** + * Dumps a scalar value. + */ + public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value): void; + + /** + * Dumps a string. + * + * @param string $str The string being dumped + * @param bool $bin Whether $str is UTF-8 or binary encoded + * @param int $cut The number of characters $str has been cut by + */ + public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void; + + /** + * Dumps while entering an hash. + * + * @param int $type A Cursor::HASH_* const for the type of hash + * @param string|int|null $class The object class, resource type or array count + * @param bool $hasChild When the dump of the hash has child item + */ + public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild): void; + + /** + * Dumps while leaving an hash. + * + * @param int $type A Cursor::HASH_* const for the type of hash + * @param string|int|null $class The object class, resource type or array count + * @param bool $hasChild When the dump of the hash has child item + * @param int $cut The number of items the hash has been cut by + */ + public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut): void; +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Cloner/Stub.php b/upLoadImage/vendor/symfony/var-dumper/Cloner/Stub.php new file mode 100644 index 0000000..18577f4 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Cloner/Stub.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * Represents the main properties of a PHP variable. + * + * @author Nicolas Grekas + */ +class Stub +{ + public const TYPE_REF = 1; + public const TYPE_STRING = 2; + public const TYPE_ARRAY = 3; + public const TYPE_OBJECT = 4; + public const TYPE_RESOURCE = 5; + public const TYPE_SCALAR = 6; + + public const STRING_BINARY = 1; + public const STRING_UTF8 = 2; + + public const ARRAY_ASSOC = 1; + public const ARRAY_INDEXED = 2; + + public int $type = self::TYPE_REF; + public string|int|null $class = ''; + public mixed $value = null; + public int $cut = 0; + public int $handle = 0; + public int $refCount = 0; + public int $position = 0; + public array $attr = []; + + /** + * @internal + */ + protected static array $propertyDefaults = []; + + public function __serialize(): array + { + static $noDefault = new \stdClass(); + + if (self::class === static::class) { + $data = []; + foreach ($this as $k => $v) { + $default = self::$propertyDefaults[$this::class][$k] ??= ($p = new \ReflectionProperty($this, $k))->hasDefaultValue() ? $p->getDefaultValue() : ($p->hasType() ? $noDefault : null); + if ($noDefault === $default || $default !== $v) { + $data[$k] = $v; + } + } + + return $data; + } + + return \Closure::bind(function () use ($noDefault) { + $data = []; + foreach ($this as $k => $v) { + $default = self::$propertyDefaults[$this::class][$k] ??= ($p = new \ReflectionProperty($this, $k))->hasDefaultValue() ? $p->getDefaultValue() : ($p->hasType() ? $noDefault : null); + if ($noDefault === $default || $default !== $v) { + $data[$k] = $v; + } + } + + return $data; + }, $this, $this::class)(); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Cloner/VarCloner.php b/upLoadImage/vendor/symfony/var-dumper/Cloner/VarCloner.php new file mode 100644 index 0000000..6a7ec28 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Cloner/VarCloner.php @@ -0,0 +1,218 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * @author Nicolas Grekas + */ +class VarCloner extends AbstractCloner +{ + private static array $arrayCache = []; + + protected function doClone(mixed $var): array + { + $len = 1; // Length of $queue + $pos = 0; // Number of cloned items past the minimum depth + $refsCounter = 0; // Hard references counter + $queue = [[$var]]; // This breadth-first queue is the return value + $hardRefs = []; // Map of original zval ids to stub objects + $objRefs = []; // Map of original object handles to their stub object counterpart + $objects = []; // Keep a ref to objects to ensure their handle cannot be reused while cloning + $resRefs = []; // Map of original resource handles to their stub object counterpart + $maxItems = $this->maxItems; + $maxString = $this->maxString; + $minDepth = $this->minDepth; + $currentDepth = 0; // Current tree depth + $currentDepthFinalIndex = 0; // Final $queue index for current tree depth + $minimumDepthReached = 0 === $minDepth; // Becomes true when minimum tree depth has been reached + $a = null; // Array cast for nested structures + $stub = null; // Stub capturing the main properties of an original item value + // or null if the original value is used directly + + $arrayStub = new Stub(); + $arrayStub->type = Stub::TYPE_ARRAY; + + for ($i = 0; $i < $len; ++$i) { + // Detect when we move on to the next tree depth + if ($i > $currentDepthFinalIndex) { + ++$currentDepth; + $currentDepthFinalIndex = $len - 1; + if ($currentDepth >= $minDepth) { + $minimumDepthReached = true; + } + } + + $vals = $queue[$i]; + foreach ($vals as $k => $v) { + // $v is the original value or a stub object in case of hard references + + $zvalRef = ($r = \ReflectionReference::fromArrayElement($vals, $k)) ? $r->getId() : null; + + if ($zvalRef) { + $vals[$k] = &$stub; // Break hard references to make $queue completely + unset($stub); // independent from the original structure + if (null !== $vals[$k] = $hardRefs[$zvalRef] ?? null) { + $v = $vals[$k]; + if ($v->value instanceof Stub && (Stub::TYPE_OBJECT === $v->value->type || Stub::TYPE_RESOURCE === $v->value->type)) { + ++$v->value->refCount; + } + ++$v->refCount; + continue; + } + $vals[$k] = new Stub(); + $vals[$k]->value = $v; + $vals[$k]->handle = ++$refsCounter; + $hardRefs[$zvalRef] = $vals[$k]; + } + // Create $stub when the original value $v cannot be used directly + // If $v is a nested structure, put that structure in array $a + switch (true) { + case null === $v: + case \is_bool($v): + case \is_int($v): + case \is_float($v): + continue 2; + case \is_string($v): + if ('' === $v) { + continue 2; + } + if (!preg_match('//u', $v)) { + $stub = new Stub(); + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_BINARY; + if (0 <= $maxString && 0 < $cut = \strlen($v) - $maxString) { + $stub->cut = $cut; + $stub->value = substr($v, 0, -$cut); + } else { + $stub->value = $v; + } + } elseif (0 <= $maxString && isset($v[1 + ($maxString >> 2)]) && 0 < $cut = mb_strlen($v, 'UTF-8') - $maxString) { + $stub = new Stub(); + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_UTF8; + $stub->cut = $cut; + $stub->value = mb_substr($v, 0, $maxString, 'UTF-8'); + } else { + continue 2; + } + $a = null; + break; + + case \is_array($v): + if (!$v) { + continue 2; + } + $stub = $arrayStub; + + $stub->class = array_is_list($v) ? Stub::ARRAY_INDEXED : Stub::ARRAY_ASSOC; + $a = $v; + break; + + case \is_object($v): + if (empty($objRefs[$h = spl_object_id($v)])) { + $stub = new Stub(); + $stub->type = Stub::TYPE_OBJECT; + $stub->class = $v::class; + $stub->value = $v; + $stub->handle = $h; + $a = $this->castObject($stub, 0 < $i); + if ($v !== $stub->value) { + if (Stub::TYPE_OBJECT !== $stub->type || null === $stub->value) { + break; + } + $stub->handle = $h = spl_object_id($stub->value); + } + $stub->value = null; + if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { + $stub->cut = \count($a); + $a = null; + } + } + if (empty($objRefs[$h])) { + $objRefs[$h] = $stub; + $objects[] = $v; + } else { + $stub = $objRefs[$h]; + ++$stub->refCount; + $a = null; + } + break; + + default: // resource + if (empty($resRefs[$h = (int) $v])) { + $stub = new Stub(); + $stub->type = Stub::TYPE_RESOURCE; + if ('Unknown' === $stub->class = @get_resource_type($v)) { + $stub->class = 'Closed'; + } + $stub->value = $v; + $stub->handle = $h; + $a = $this->castResource($stub, 0 < $i); + $stub->value = null; + if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { + $stub->cut = \count($a); + $a = null; + } + } + if (empty($resRefs[$h])) { + $resRefs[$h] = $stub; + } else { + $stub = $resRefs[$h]; + ++$stub->refCount; + $a = null; + } + break; + } + + if ($a) { + if (!$minimumDepthReached || 0 > $maxItems) { + $queue[$len] = $a; + $stub->position = $len++; + } elseif ($pos < $maxItems) { + if ($maxItems < $pos += \count($a)) { + $a = \array_slice($a, 0, $maxItems - $pos, true); + if ($stub->cut >= 0) { + $stub->cut += $pos - $maxItems; + } + } + $queue[$len] = $a; + $stub->position = $len++; + } elseif ($stub->cut >= 0) { + $stub->cut += \count($a); + $stub->position = 0; + } + } + + if ($arrayStub === $stub) { + if ($arrayStub->cut) { + $stub = [$arrayStub->cut, $arrayStub->class => $arrayStub->position]; + $arrayStub->cut = 0; + } elseif (isset(self::$arrayCache[$arrayStub->class][$arrayStub->position])) { + $stub = self::$arrayCache[$arrayStub->class][$arrayStub->position]; + } else { + self::$arrayCache[$arrayStub->class][$arrayStub->position] = $stub = [$arrayStub->class => $arrayStub->position]; + } + } + + if (!$zvalRef) { + $vals[$k] = $stub; + } else { + $hardRefs[$zvalRef]->value = $stub; + } + } + + $queue[$i] = $vals; + } + + return $queue; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php b/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php new file mode 100644 index 0000000..24590fc --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command\Descriptor; + +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\CliDumper; + +/** + * Describe collected data clones for cli output. + * + * @author Maxime Steinhausser + * + * @final + */ +class CliDescriptor implements DumpDescriptorInterface +{ + private mixed $lastIdentifier = null; + + public function __construct( + private CliDumper $dumper, + ) { + } + + public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void + { + $io = $output instanceof SymfonyStyle ? $output : new SymfonyStyle(new ArrayInput([]), $output); + $this->dumper->setColors($output->isDecorated()); + + $rows = [['date', date('r', (int) $context['timestamp'])]]; + $lastIdentifier = $this->lastIdentifier; + $this->lastIdentifier = $clientId; + + $section = "Received from client #$clientId"; + if (isset($context['request'])) { + $request = $context['request']; + $this->lastIdentifier = $request['identifier']; + $section = \sprintf('%s %s', $request['method'], $request['uri']); + if ($controller = $request['controller']) { + $rows[] = ['controller', rtrim($this->dumper->dump($controller, true), "\n")]; + } + } elseif (isset($context['cli'])) { + $this->lastIdentifier = $context['cli']['identifier']; + $section = '$ '.$context['cli']['command_line']; + } + + if ($this->lastIdentifier !== $lastIdentifier) { + $io->section($section); + } + + if (isset($context['source'])) { + $source = $context['source']; + $sourceInfo = \sprintf('%s on line %d', $source['name'], $source['line']); + if ($fileLink = $source['file_link'] ?? null) { + $sourceInfo = \sprintf('%s', $fileLink, $sourceInfo); + } + $rows[] = ['source', $sourceInfo]; + $file = $source['file_relative'] ?? $source['file']; + $rows[] = ['file', $file]; + } + + $io->table([], $rows); + + $this->dumper->dump($data); + $io->newLine(); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php b/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php new file mode 100644 index 0000000..267d27b --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command\Descriptor; + +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * @author Maxime Steinhausser + */ +interface DumpDescriptorInterface +{ + public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void; +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php b/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php new file mode 100644 index 0000000..18f9f65 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command\Descriptor; + +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; + +/** + * Describe collected data clones for html output. + * + * @author Maxime Steinhausser + * + * @final + */ +class HtmlDescriptor implements DumpDescriptorInterface +{ + private bool $initialized = false; + + public function __construct( + private HtmlDumper $dumper, + ) { + } + + public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void + { + if (!$this->initialized) { + $styles = file_get_contents(__DIR__.'/../../Resources/css/htmlDescriptor.css'); + $scripts = file_get_contents(__DIR__.'/../../Resources/js/htmlDescriptor.js'); + $output->writeln(""); + $this->initialized = true; + } + + $title = '-'; + if (isset($context['request'])) { + $request = $context['request']; + $controller = "{$this->dumper->dump($request['controller'], true, ['maxDepth' => 0])}"; + $title = \sprintf('%s %s', $request['method'], $uri = $request['uri'], $uri); + $dedupIdentifier = $request['identifier']; + } elseif (isset($context['cli'])) { + $title = '$ '.$context['cli']['command_line']; + $dedupIdentifier = $context['cli']['identifier']; + } else { + $dedupIdentifier = bin2hex(random_bytes(4)); + } + + $sourceDescription = ''; + if (isset($context['source'])) { + $source = $context['source']; + $projectDir = $source['project_dir'] ?? null; + $sourceDescription = \sprintf('%s on line %d', $source['name'], $source['line']); + if (isset($source['file_link'])) { + $sourceDescription = \sprintf('%s', $source['file_link'], $sourceDescription); + } + } + + $isoDate = $this->extractDate($context, 'c'); + $tags = array_filter([ + 'controller' => $controller ?? null, + 'project dir' => $projectDir ?? null, + ]); + + $output->writeln(<< +
+
+

$title

+ +
+ {$this->renderTags($tags)} +
+
+

+ $sourceDescription +

+ {$this->dumper->dump($data, true)} +
+ + HTML + ); + } + + private function extractDate(array $context, string $format = 'r'): string + { + return date($format, (int) $context['timestamp']); + } + + private function renderTags(array $tags): string + { + if (!$tags) { + return ''; + } + + $renderedTags = ''; + foreach ($tags as $key => $value) { + $renderedTags .= \sprintf('
  • %s%s
  • ', $key, $value); + } + + return << +
      + $renderedTags +
    + + HTML; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Command/ServerDumpCommand.php b/upLoadImage/vendor/symfony/var-dumper/Command/ServerDumpCommand.php new file mode 100644 index 0000000..424a7e6 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Command/ServerDumpCommand.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Command; + +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Command\Descriptor\CliDescriptor; +use Symfony\Component\VarDumper\Command\Descriptor\DumpDescriptorInterface; +use Symfony\Component\VarDumper\Command\Descriptor\HtmlDescriptor; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\Server\DumpServer; + +/** + * Starts a dump server to collect and output dumps on a single place with multiple formats support. + * + * @author Maxime Steinhausser + * + * @final + */ +#[AsCommand(name: 'server:dump', description: 'Start a dump server that collects and displays dumps in a single place')] +class ServerDumpCommand extends Command +{ + /** @var DumpDescriptorInterface[] */ + private array $descriptors; + + public function __construct( + private DumpServer $server, + array $descriptors = [], + ) { + $this->descriptors = $descriptors + [ + 'cli' => new CliDescriptor(new CliDumper()), + 'html' => new HtmlDescriptor(new HtmlDumper()), + ]; + + parent::__construct(); + } + + protected function configure(): void + { + $this + ->addOption('format', null, InputOption::VALUE_REQUIRED, \sprintf('The output format (%s)', implode(', ', $this->getAvailableFormats())), 'cli') + ->setHelp(<<<'EOF' + %command.name% starts a dump server that collects and displays + dumps in a single place for debugging you application: + + php %command.full_name% + + You can consult dumped data in HTML format in your browser by providing the --format=html option + and redirecting the output to a file: + + php %command.full_name% --format="html" > dump.html + + EOF + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $format = $input->getOption('format'); + + if (!$descriptor = $this->descriptors[$format] ?? null) { + throw new InvalidArgumentException(\sprintf('Unsupported format "%s".', $format)); + } + + $errorIo = $io->getErrorStyle(); + $errorIo->title('Symfony Var Dumper Server'); + + $this->server->start(); + + $errorIo->success(\sprintf('Server listening on %s', $this->server->getHost())); + $errorIo->comment('Quit the server with CONTROL-C.'); + + $this->server->listen(function (Data $data, array $context, int $clientId) use ($descriptor, $io) { + $descriptor->describe($io, $data, $context, $clientId); + }); + + return 0; + } + + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues($this->getAvailableFormats()); + } + } + + private function getAvailableFormats(): array + { + return array_keys($this->descriptors); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/AbstractDumper.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/AbstractDumper.php new file mode 100644 index 0000000..593a2c6 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/AbstractDumper.php @@ -0,0 +1,232 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\DumperInterface; + +/** + * Abstract mechanism for dumping a Data object. + * + * @author Nicolas Grekas + */ +abstract class AbstractDumper implements DataDumperInterface, DumperInterface +{ + public const DUMP_LIGHT_ARRAY = 1; + public const DUMP_STRING_LENGTH = 2; + public const DUMP_COMMA_SEPARATOR = 4; + public const DUMP_TRAILING_COMMA = 8; + + /** @var callable|resource|string|null */ + public static $defaultOutput = 'php://output'; + + protected string $line = ''; + /** @var callable|null */ + protected $lineDumper; + /** @var resource|null */ + protected $outputStream; + protected string $decimalPoint = '.'; + protected string $indentPad = ' '; + + private string $charset = ''; + + /** + * @param callable|resource|string|null $output A line dumper callable, an opened stream or an output path, defaults to static::$defaultOutput + * @param string|null $charset The default character encoding to use for non-UTF8 strings + * @param int $flags A bit field of static::DUMP_* constants to fine tune dumps representation + */ + public function __construct( + $output = null, + ?string $charset = null, + protected int $flags = 0, + ) { + $this->setCharset($charset ?: \ini_get('php.output_encoding') ?: \ini_get('default_charset') ?: 'UTF-8'); + $this->setOutput($output ?: static::$defaultOutput); + if (!$output && \is_string(static::$defaultOutput)) { + static::$defaultOutput = $this->outputStream; + } + } + + /** + * Sets the output destination of the dumps. + * + * @param callable|resource|string|null $output A line dumper callable, an opened stream or an output path + * + * @return callable|resource|string|null The previous output destination + */ + public function setOutput($output) + { + $prev = $this->outputStream ?? $this->lineDumper; + + if (\is_callable($output)) { + $this->outputStream = null; + $this->lineDumper = $output; + } else { + if (\is_string($output)) { + $output = fopen($output, 'w'); + } + $this->outputStream = $output; + $this->lineDumper = $this->echoLine(...); + } + + return $prev; + } + + /** + * Sets the default character encoding to use for non-UTF8 strings. + * + * @return string The previous charset + */ + public function setCharset(string $charset): string + { + $prev = $this->charset; + + $charset = strtoupper($charset); + $charset = 'UTF-8' === $charset || 'UTF8' === $charset ? 'CP1252' : $charset; + + $this->charset = $charset; + + return $prev; + } + + /** + * Sets the indentation pad string. + * + * @param string $pad A string that will be prepended to dumped lines, repeated by nesting level + * + * @return string The previous indent pad + */ + public function setIndentPad(string $pad): string + { + $prev = $this->indentPad; + $this->indentPad = $pad; + + return $prev; + } + + /** + * Dumps a Data object. + * + * @param callable|resource|string|true|null $output A line dumper callable, an opened stream, an output path or true to return the dump + * + * @return string|null The dump as string when $output is true + */ + public function dump(Data $data, $output = null): ?string + { + if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(\LC_NUMERIC, 0) : null) { + setlocale(\LC_NUMERIC, 'C'); + } + + if ($returnDump = true === $output) { + $output = fopen('php://memory', 'r+'); + } + if ($output) { + $prevOutput = $this->setOutput($output); + } + try { + $data->dump($this); + $this->dumpLine(-1); + + if ($returnDump) { + $result = stream_get_contents($output, -1, 0); + fclose($output); + + return $result; + } + } finally { + if ($output) { + $this->setOutput($prevOutput); + } + if ($locale) { + setlocale(\LC_NUMERIC, $locale); + } + } + + return null; + } + + /** + * Dumps the current line. + * + * @param int $depth The recursive depth in the dumped structure for the line being dumped, + * or -1 to signal the end-of-dump to the line dumper callable + */ + protected function dumpLine(int $depth): void + { + ($this->lineDumper)($this->line, $depth, $this->indentPad); + $this->line = ''; + } + + /** + * Generic line dumper callback. + */ + protected function echoLine(string $line, int $depth, string $indentPad): void + { + if (-1 !== $depth) { + fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n"); + } + } + + /** + * Converts a non-UTF-8 string to UTF-8. + */ + protected function utf8Encode(?string $s): ?string + { + if (null === $s || preg_match('//u', $s)) { + return $s; + } + + if (\function_exists('iconv')) { + if (false !== $c = @iconv($this->charset, 'UTF-8', $s)) { + return $c; + } + if ('CP1252' !== $this->charset && false !== $c = @iconv('CP1252', 'UTF-8', $s)) { + return $c; + } + } + + $s .= $s; + $len = \strlen($s); + $mapCp1252 = false; + + for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { + if ($s[$i] < "\x80") { + $s[$j] = $s[$i]; + } elseif ($s[$i] < "\xC0") { + $s[$j] = "\xC2"; + $s[++$j] = $s[$i]; + if ($s[$i] < "\xA0") { + $mapCp1252 = true; + } + } else { + $s[$j] = "\xC3"; + $s[++$j] = \chr(\ord($s[$i]) - 64); + } + } + + $s = substr($s, 0, $j); + + if (!$mapCp1252) { + return $s; + } + + return strtr($s, [ + "\xC2\x80" => '€', "\xC2\x82" => '‚', "\xC2\x83" => 'ƒ', "\xC2\x84" => '„', + "\xC2\x85" => '…', "\xC2\x86" => '†', "\xC2\x87" => '‡', "\xC2\x88" => 'ˆ', + "\xC2\x89" => '‰', "\xC2\x8A" => 'Š', "\xC2\x8B" => '‹', "\xC2\x8C" => 'Œ', + "\xC2\x8D" => 'Ž', "\xC2\x91" => '‘', "\xC2\x92" => '’', "\xC2\x93" => '“', + "\xC2\x94" => '”', "\xC2\x95" => '•', "\xC2\x96" => '–', "\xC2\x97" => '—', + "\xC2\x98" => '˜', "\xC2\x99" => '™', "\xC2\x9A" => 'š', "\xC2\x9B" => '›', + "\xC2\x9C" => 'œ', "\xC2\x9E" => 'ž', + ]); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/CliDumper.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/CliDumper.php new file mode 100644 index 0000000..c6dd88c --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/CliDumper.php @@ -0,0 +1,667 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter; +use Symfony\Component\VarDumper\Cloner\Cursor; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * CliDumper dumps variables for command line output. + * + * @author Nicolas Grekas + */ +class CliDumper extends AbstractDumper +{ + public static bool $defaultColors; + /** @var callable|resource|string|null */ + public static $defaultOutput = 'php://stdout'; + + protected bool $colors; + protected int $maxStringWidth = 0; + protected array $styles = [ + // See http://en.wikipedia.org/wiki/ANSI_escape_code#graphics + 'default' => '0;38;5;208', + 'num' => '1;38;5;38', + 'const' => '1;38;5;208', + 'virtual' => '3', + 'str' => '1;38;5;113', + 'note' => '38;5;38', + 'ref' => '38;5;247', + 'public' => '39', + 'protected' => '39', + 'private' => '39', + 'meta' => '38;5;170', + 'key' => '38;5;113', + 'index' => '38;5;38', + ]; + + protected static string $controlCharsRx = '/[\x00-\x1F\x7F]+/'; + protected static array $controlCharsMap = [ + "\t" => '\t', + "\n" => '\n', + "\v" => '\v', + "\f" => '\f', + "\r" => '\r', + "\033" => '\e', + ]; + protected static string $unicodeCharsRx = "/[\u{00A0}\u{00AD}\u{034F}\u{061C}\u{115F}\u{1160}\u{17B4}\u{17B5}\u{180E}\u{2000}-\u{200F}\u{202F}\u{205F}\u{2060}-\u{2064}\u{206A}-\u{206F}\u{3000}\u{2800}\u{3164}\u{FEFF}\u{FFA0}\u{1D159}\u{1D173}-\u{1D17A}]/u"; + + protected bool $collapseNextHash = false; + protected bool $expandNextHash = false; + + private array $displayOptions = [ + 'fileLinkFormat' => null, + ]; + + private bool $handlesHrefGracefully; + + public function __construct($output = null, ?string $charset = null, int $flags = 0) + { + parent::__construct($output, $charset, $flags); + + if ('\\' === \DIRECTORY_SEPARATOR && !$this->isWindowsTrueColor()) { + // Use only the base 16 xterm colors when using ANSICON or standard Windows 10 CLI + $this->setStyles([ + 'default' => '31', + 'num' => '1;34', + 'const' => '1;31', + 'str' => '1;32', + 'note' => '34', + 'ref' => '1;30', + 'meta' => '35', + 'key' => '32', + 'index' => '34', + ]); + } + + $this->displayOptions['fileLinkFormat'] = class_exists(FileLinkFormatter::class) ? new FileLinkFormatter() : (\ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') ?: 'file://%f#L%l'); + } + + /** + * Enables/disables colored output. + */ + public function setColors(bool $colors): void + { + $this->colors = $colors; + } + + /** + * Sets the maximum number of characters per line for dumped strings. + */ + public function setMaxStringWidth(int $maxStringWidth): void + { + $this->maxStringWidth = $maxStringWidth; + } + + /** + * Configures styles. + * + * @param array $styles A map of style names to style definitions + */ + public function setStyles(array $styles): void + { + $this->styles = $styles + $this->styles; + } + + /** + * Configures display options. + * + * @param array $displayOptions A map of display options to customize the behavior + */ + public function setDisplayOptions(array $displayOptions): void + { + $this->displayOptions = $displayOptions + $this->displayOptions; + } + + public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value): void + { + $this->dumpKey($cursor); + $this->collapseNextHash = $this->expandNextHash = false; + + $style = 'const'; + $attr = $cursor->attr; + + switch ($type) { + case 'default': + $style = 'default'; + break; + + case 'label': + $this->styles += ['label' => $this->styles['default']]; + $style = 'label'; + break; + + case 'integer': + $style = 'num'; + + if (isset($this->styles['integer'])) { + $style = 'integer'; + } + + break; + + case 'double': + $style = 'num'; + + if (isset($this->styles['float'])) { + $style = 'float'; + } + + $value = match (true) { + \INF === $value => 'INF', + -\INF === $value => '-INF', + is_nan($value) => 'NAN', + default => !str_contains($value = (string) $value, $this->decimalPoint) ? $value .= $this->decimalPoint.'0' : $value, + }; + break; + + case 'NULL': + $value = 'null'; + break; + + case 'boolean': + $value = $value ? 'true' : 'false'; + break; + + default: + $attr += ['value' => $this->utf8Encode($value)]; + $value = $this->utf8Encode($type); + break; + } + + $this->line .= $this->style($style, $value, $attr); + + $this->endValue($cursor); + } + + public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void + { + $this->dumpKey($cursor); + $this->collapseNextHash = $this->expandNextHash = false; + $attr = $cursor->attr; + + if ($bin) { + $str = $this->utf8Encode($str); + } + if ('' === $str) { + $this->line .= '""'; + if ($cut) { + $this->line .= '…'.$cut; + } + $this->endValue($cursor); + } else { + $attr += [ + 'length' => 0 <= $cut ? mb_strlen($str, 'UTF-8') + $cut : 0, + 'binary' => $bin, + ]; + $str = $bin && str_contains($str, "\0") ? [$str] : explode("\n", $str); + if (isset($str[1]) && !isset($str[2]) && !isset($str[1][0])) { + unset($str[1]); + $str[0] .= "\n"; + } + $m = \count($str) - 1; + $i = $lineCut = 0; + + if (self::DUMP_STRING_LENGTH & $this->flags) { + $this->line .= '('.$attr['length'].') '; + } + if ($bin) { + $this->line .= 'b'; + } + + if ($m) { + $this->line .= '"""'; + $this->dumpLine($cursor->depth); + } else { + $this->line .= '"'; + } + + foreach ($str as $str) { + if ($i < $m) { + $str .= "\n"; + } + if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = mb_strlen($str, 'UTF-8')) { + $str = mb_substr($str, 0, $this->maxStringWidth, 'UTF-8'); + $lineCut = $len - $this->maxStringWidth; + } + if ($m && 0 < $cursor->depth) { + $this->line .= $this->indentPad; + } + if ('' !== $str) { + $this->line .= $this->style('str', $str, $attr); + } + if ($i++ == $m) { + if ($m) { + if ('' !== $str) { + $this->dumpLine($cursor->depth); + if (0 < $cursor->depth) { + $this->line .= $this->indentPad; + } + } + $this->line .= '"""'; + } else { + $this->line .= '"'; + } + if ($cut < 0) { + $this->line .= '…'; + $lineCut = 0; + } elseif ($cut) { + $lineCut += $cut; + } + } + if ($lineCut) { + $this->line .= '…'.$lineCut; + $lineCut = 0; + } + + if ($i > $m) { + $this->endValue($cursor); + } else { + $this->dumpLine($cursor->depth); + } + } + } + } + + public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild): void + { + $this->colors ??= $this->supportsColors(); + + $this->dumpKey($cursor); + $this->expandNextHash = false; + $attr = $cursor->attr; + + if ($this->collapseNextHash) { + $cursor->skipChildren = true; + $this->collapseNextHash = $hasChild = false; + } + + $class = $this->utf8Encode($class); + if (Cursor::HASH_OBJECT === $type) { + $prefix = $class && 'stdClass' !== $class ? $this->style('note', $class, $attr).(empty($attr['cut_hash']) ? ' {' : '') : '{'; + } elseif (Cursor::HASH_RESOURCE === $type) { + $prefix = $this->style('note', $class.' resource', $attr).($hasChild ? ' {' : ' '); + } else { + $prefix = $class && !(self::DUMP_LIGHT_ARRAY & $this->flags) ? $this->style('note', 'array:'.$class).' [' : '['; + } + + if (($cursor->softRefCount || 0 < $cursor->softRefHandle) && empty($attr['cut_hash'])) { + $prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), ['count' => $cursor->softRefCount]); + } elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) { + $prefix .= $this->style('ref', '&'.$cursor->hardRefTo, ['count' => $cursor->hardRefCount]); + } elseif (!$hasChild && Cursor::HASH_RESOURCE === $type) { + $prefix = substr($prefix, 0, -1); + } + + $this->line .= $prefix; + + if ($hasChild) { + $this->dumpLine($cursor->depth); + } + } + + public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut): void + { + if (empty($cursor->attr['cut_hash'])) { + $this->dumpEllipsis($cursor, $hasChild, $cut); + $this->line .= Cursor::HASH_OBJECT === $type ? '}' : (Cursor::HASH_RESOURCE !== $type ? ']' : ($hasChild ? '}' : '')); + } + + $this->endValue($cursor); + } + + /** + * Dumps an ellipsis for cut children. + * + * @param bool $hasChild When the dump of the hash has child item + * @param int $cut The number of items the hash has been cut by + */ + protected function dumpEllipsis(Cursor $cursor, bool $hasChild, int $cut): void + { + if ($cut) { + $this->line .= ' …'; + if (0 < $cut) { + $this->line .= $cut; + } + if ($hasChild) { + $this->dumpLine($cursor->depth + 1); + } + } + } + + /** + * Dumps a key in a hash structure. + */ + protected function dumpKey(Cursor $cursor): void + { + if (null !== $key = $cursor->hashKey) { + if ($cursor->hashKeyIsBinary) { + $key = $this->utf8Encode($key); + } + $attr = [ + 'binary' => $cursor->hashKeyIsBinary, + 'virtual' => $cursor->attr['virtual'] ?? false, + ]; + $bin = $cursor->hashKeyIsBinary ? 'b' : ''; + $style = 'key'; + switch ($cursor->hashType) { + default: + case Cursor::HASH_INDEXED: + if (self::DUMP_LIGHT_ARRAY & $this->flags) { + break; + } + $style = 'index'; + // no break + case Cursor::HASH_ASSOC: + if (\is_int($key)) { + $this->line .= $this->style($style, $key).' => '; + } else { + $this->line .= $bin.'"'.$this->style($style, $key).'" => '; + } + break; + + case Cursor::HASH_RESOURCE: + $key = "\0~\0".$key; + // no break + case Cursor::HASH_OBJECT: + if (!isset($key[0]) || "\0" !== $key[0]) { + $this->line .= '+'.$bin.$this->style('public', $key, $attr).': '; + } elseif (0 < strpos($key, "\0", 1)) { + $key = explode("\0", substr($key, 1), 2); + + switch ($key[0][0]) { + case '+': // User inserted keys + $attr['dynamic'] = true; + $this->line .= '+'.$bin.'"'.$this->style('public', $key[1], $attr).'": '; + break 2; + case '~': + $style = 'meta'; + if (isset($key[0][1])) { + parse_str(substr($key[0], 1), $attr); + $attr += ['binary' => $cursor->hashKeyIsBinary]; + } + break; + case '*': + $style = 'protected'; + $bin = '#'.$bin; + break; + default: + $attr['class'] = $key[0]; + $style = 'private'; + $bin = '-'.$bin; + break; + } + + if (isset($attr['collapse'])) { + if ($attr['collapse']) { + $this->collapseNextHash = true; + } else { + $this->expandNextHash = true; + } + } + + $this->line .= $bin.$this->style($style, $key[1], $attr).($attr['separator'] ?? ': '); + } else { + // This case should not happen + $this->line .= '-'.$bin.'"'.$this->style('private', $key, ['class' => '']).'": '; + } + break; + } + + if ($cursor->hardRefTo) { + $this->line .= $this->style('ref', '&'.($cursor->hardRefCount ? $cursor->hardRefTo : ''), ['count' => $cursor->hardRefCount]).' '; + } + } + } + + /** + * Decorates a value with some style. + * + * @param string $style The type of style being applied + * @param string $value The value being styled + * @param array $attr Optional context information + */ + protected function style(string $style, string $value, array $attr = []): string + { + $this->colors ??= $this->supportsColors(); + + $this->handlesHrefGracefully ??= 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR') + && (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100) + && !isset($_SERVER['IDEA_INITIAL_DIRECTORY']); + + if (isset($attr['ellipsis'], $attr['ellipsis-type'])) { + $prefix = substr($value, 0, -$attr['ellipsis']); + if ('cli' === \PHP_SAPI && 'path' === $attr['ellipsis-type'] && isset($_SERVER[$pwd = '\\' === \DIRECTORY_SEPARATOR ? 'CD' : 'PWD']) && str_starts_with($prefix, $_SERVER[$pwd])) { + $prefix = '.'.substr($prefix, \strlen($_SERVER[$pwd])); + } + if (!empty($attr['ellipsis-tail'])) { + $prefix .= substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']); + $value = substr($value, -$attr['ellipsis'] + $attr['ellipsis-tail']); + } else { + $value = substr($value, -$attr['ellipsis']); + } + + $value = $this->style('default', $prefix).$this->style($style, $value); + + goto href; + } + + $map = static::$controlCharsMap; + $startCchr = $this->colors ? "\033[m\033[{$this->styles['default']}m" : ''; + $endCchr = $this->colors ? "\033[m\033[{$this->styles[$style]}m" : ''; + $value = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $startCchr, $endCchr) { + $s = $startCchr; + $c = $c[$i = 0]; + do { + $s .= $map[$c[$i]] ?? \sprintf('\x%02X', \ord($c[$i])); + } while (isset($c[++$i])); + + return $s.$endCchr; + }, $value, -1, $cchrCount); + + if (!($attr['binary'] ?? false)) { + $value = preg_replace_callback(static::$unicodeCharsRx, function ($c) use (&$cchrCount, $startCchr, $endCchr) { + ++$cchrCount; + + return $startCchr.'\u{'.strtoupper(dechex(mb_ord($c[0]))).'}'.$endCchr; + }, $value); + } + + if ($this->colors && '' !== $value) { + if ($cchrCount && "\033" === $value[0]) { + $value = substr($value, \strlen($startCchr)); + } else { + $value = "\033[{$this->styles[$style]}m".$value; + } + if ($cchrCount && str_ends_with($value, $endCchr)) { + $value = substr($value, 0, -\strlen($endCchr)); + } else { + $value .= "\033[{$this->styles['default']}m"; + } + } + + href: + if ($this->colors && $this->handlesHrefGracefully) { + if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], $attr['line'] ?? 0)) { + if ('note' === $style) { + $value .= "\033]8;;{$href}\033\\^\033]8;;\033\\"; + } else { + $attr['href'] = $href; + } + } + if (isset($attr['href'])) { + if ('label' === $style) { + $value .= '^'; + } + $value = "\033]8;;{$attr['href']}\033\\{$value}\033]8;;\033\\"; + } + } + + if ('label' === $style && '' !== $value) { + $value .= ' '; + } + if ($this->colors && ($attr['virtual'] ?? false)) { + $value = "\033[{$this->styles['virtual']}m".$value; + } + + return $value; + } + + protected function supportsColors(): bool + { + if ($this->outputStream !== static::$defaultOutput) { + return $this->hasColorSupport($this->outputStream); + } + if (isset(static::$defaultColors)) { + return static::$defaultColors; + } + if (isset($_SERVER['argv'][1])) { + $colors = $_SERVER['argv']; + $i = \count($colors); + while (--$i > 0) { + if (isset($colors[$i][5])) { + switch ($colors[$i]) { + case '--ansi': + case '--color': + case '--color=yes': + case '--color=force': + case '--color=always': + case '--colors=always': + return static::$defaultColors = true; + + case '--no-ansi': + case '--color=no': + case '--color=none': + case '--color=never': + case '--colors=never': + return static::$defaultColors = false; + } + } + } + } + + $h = stream_get_meta_data($this->outputStream) + ['wrapper_type' => null]; + $h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'w') : $this->outputStream; + + return static::$defaultColors = $this->hasColorSupport($h); + } + + protected function dumpLine(int $depth, bool $endOfValue = false): void + { + if ($this->colors ??= $this->supportsColors()) { + $this->line = \sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line); + } + parent::dumpLine($depth); + } + + protected function endValue(Cursor $cursor): void + { + if (-1 === $cursor->hashType) { + return; + } + + if (Stub::ARRAY_INDEXED === $cursor->hashType || Stub::ARRAY_ASSOC === $cursor->hashType) { + if (self::DUMP_TRAILING_COMMA & $this->flags && 0 < $cursor->depth) { + $this->line .= ','; + } elseif (self::DUMP_COMMA_SEPARATOR & $this->flags && 1 < $cursor->hashLength - $cursor->hashIndex) { + $this->line .= ','; + } + } + + $this->dumpLine($cursor->depth, true); + } + + /** + * Returns true if the stream supports colorization. + * + * Reference: Composer\XdebugHandler\Process::supportsColor + * https://github.com/composer/xdebug-handler + */ + private function hasColorSupport(mixed $stream): bool + { + if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) { + return false; + } + + // Follow https://no-color.org/ + if ('' !== (($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR'))[0] ?? '')) { + return false; + } + + // Follow https://force-color.org/ + if ('' !== (($_SERVER['FORCE_COLOR'] ?? getenv('FORCE_COLOR'))[0] ?? '')) { + return true; + } + + // Detect msysgit/mingw and assume this is a tty because detection + // does not work correctly, see https://github.com/composer/composer/issues/9690 + if (!@stream_isatty($stream) && !\in_array(strtoupper((string) getenv('MSYSTEM')), ['MINGW32', 'MINGW64'], true)) { + return false; + } + + if ('\\' === \DIRECTORY_SEPARATOR && @sapi_windows_vt100_support($stream)) { + return true; + } + + if ('Hyper' === getenv('TERM_PROGRAM') + || false !== getenv('COLORTERM') + || false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + ) { + return true; + } + + if ('dumb' === $term = (string) getenv('TERM')) { + return false; + } + + // See https://github.com/chalk/supports-color/blob/d4f413efaf8da045c5ab440ed418ef02dbb28bf1/index.js#L157 + return preg_match('/^((screen|xterm|vt100|vt220|putty|rxvt|ansi|cygwin|linux).*)|(.*-256(color)?(-bce)?)$/', $term); + } + + /** + * Returns true if the Windows terminal supports true color. + * + * Note that this does not check an output stream, but relies on environment + * variables from known implementations, or a PHP and Windows version that + * supports true color. + */ + private function isWindowsTrueColor(): bool + { + $result = 183 <= getenv('ANSICON_VER') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM') + || 'Hyper' === getenv('TERM_PROGRAM'); + + if (!$result) { + $version = \sprintf( + '%s.%s.%s', + PHP_WINDOWS_VERSION_MAJOR, + PHP_WINDOWS_VERSION_MINOR, + PHP_WINDOWS_VERSION_BUILD + ); + $result = $version >= '10.0.15063'; + } + + return $result; + } + + private function getSourceLink(string $file, int $line): string|false + { + if ($fmt = $this->displayOptions['fileLinkFormat']) { + return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : ($fmt->format($file, $line) ?: 'file://'.$file.'#L'.$line); + } + + return false; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php new file mode 100644 index 0000000..292b1a4 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +/** + * Tries to provide context on CLI. + * + * @author Maxime Steinhausser + */ +final class CliContextProvider implements ContextProviderInterface +{ + public function getContext(): ?array + { + if ('cli' !== \PHP_SAPI) { + return null; + } + + return [ + 'command_line' => $commandLine = implode(' ', $_SERVER['argv'] ?? []), + 'identifier' => hash('xxh128', $commandLine.'@'.$_SERVER['REQUEST_TIME_FLOAT']), + ]; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php new file mode 100644 index 0000000..532aa0f --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +/** + * Interface to provide contextual data about dump data clones sent to a server. + * + * @author Maxime Steinhausser + */ +interface ContextProviderInterface +{ + public function getContext(): ?array; +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php new file mode 100644 index 0000000..e3ee487 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\VarDumper\Caster\ReflectionCaster; +use Symfony\Component\VarDumper\Cloner\VarCloner; + +/** + * Tries to provide context from a request. + * + * @author Maxime Steinhausser + */ +final class RequestContextProvider implements ContextProviderInterface +{ + private VarCloner $cloner; + + public function __construct( + private RequestStack $requestStack, + ) { + $this->cloner = new VarCloner(); + $this->cloner->setMaxItems(0); + $this->cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO); + } + + public function getContext(): ?array + { + if (null === $request = $this->requestStack->getCurrentRequest()) { + return null; + } + + $controller = $request->attributes->get('_controller'); + + return [ + 'uri' => $request->getUri(), + 'method' => $request->getMethod(), + 'controller' => $controller ? $this->cloner->cloneVar($controller) : $controller, + 'identifier' => hash('xxh128', spl_object_id($request).'@'.$_SERVER['REQUEST_TIME_FLOAT']), + ]; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php new file mode 100644 index 0000000..01e730a --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper\ContextProvider; + +use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\VarDumper; +use Twig\Template; + +/** + * Tries to provide context from sources (class name, file, line, code excerpt, ...). + * + * @author Nicolas Grekas + * @author Maxime Steinhausser + */ +final class SourceContextProvider implements ContextProviderInterface +{ + public function __construct( + private ?string $charset = null, + private ?string $projectDir = null, + private ?FileLinkFormatter $fileLinkFormatter = null, + private int $limit = 9, + ) { + } + + public function getContext(): ?array + { + $trace = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, $this->limit); + + $file = $trace[1]['file']; + $line = $trace[1]['line']; + $name = '-' === $file || 'Standard input code' === $file ? 'Standard input code' : false; + $fileExcerpt = false; + + for ($i = 2; $i < $this->limit; ++$i) { + if (isset($trace[$i]['class'], $trace[$i]['function']) + && 'dump' === $trace[$i]['function'] + && VarDumper::class === $trace[$i]['class'] + ) { + $file = $trace[$i]['file'] ?? $file; + $line = $trace[$i]['line'] ?? $line; + + while (++$i < $this->limit) { + if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && !str_starts_with($trace[$i]['function'], 'call_user_func')) { + $file = $trace[$i]['file']; + $line = $trace[$i]['line']; + + break; + } elseif (isset($trace[$i]['object']) && $trace[$i]['object'] instanceof Template) { + $template = $trace[$i]['object']; + $name = $template->getTemplateName(); + $src = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : false); + $info = $template->getDebugInfo(); + if (isset($info[$trace[$i - 1]['line']])) { + $line = $info[$trace[$i - 1]['line']]; + $file = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getPath() : null; + + if ($src) { + $src = explode("\n", $src); + $fileExcerpt = []; + + for ($i = max($line - 3, 1), $max = min($line + 3, \count($src)); $i <= $max; ++$i) { + $fileExcerpt[] = ''.$this->htmlEncode($src[$i - 1]).''; + } + + $fileExcerpt = '
      '.implode("\n", $fileExcerpt).'
    '; + } + } + break; + } + } + break; + } + } + + if (false === $name) { + $name = str_replace('\\', '/', $file); + $name = substr($name, strrpos($name, '/') + 1); + } + + $context = ['name' => $name, 'file' => $file, 'line' => $line]; + $context['file_excerpt'] = $fileExcerpt; + + if (null !== $this->projectDir) { + $context['project_dir'] = $this->projectDir; + if (str_starts_with($file, $this->projectDir)) { + $context['file_relative'] = ltrim(substr($file, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR); + } + } + + if ($this->fileLinkFormatter && $fileLink = $this->fileLinkFormatter->format($context['file'], $context['line'])) { + $context['file_link'] = $fileLink; + } + + return $context; + } + + private function htmlEncode(string $s): string + { + $html = ''; + + $dumper = new HtmlDumper(function ($line) use (&$html) { $html .= $line; }, $this->charset); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + + $cloner = new VarCloner(); + $dumper->dump($cloner->cloneVar($s)); + + return substr(strip_tags($html), 1, -1); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php new file mode 100644 index 0000000..6102c47 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; + +/** + * @author Kévin Thérage + */ +class ContextualizedDumper implements DataDumperInterface +{ + /** + * @param ContextProviderInterface[] $contextProviders + */ + public function __construct( + private DataDumperInterface $wrappedDumper, + private array $contextProviders, + ) { + } + + public function dump(Data $data): ?string + { + $context = $data->getContext(); + foreach ($this->contextProviders as $contextProvider) { + $context[$contextProvider::class] = $contextProvider->getContext(); + } + + return $this->wrappedDumper->dump($data->withContext($context)); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php new file mode 100644 index 0000000..df05b6a --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * DataDumperInterface for dumping Data objects. + * + * @author Nicolas Grekas + */ +interface DataDumperInterface +{ + /** + * @return string|null + */ + public function dump(Data $data); +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/HtmlDumper.php new file mode 100644 index 0000000..f391e04 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/HtmlDumper.php @@ -0,0 +1,980 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Cursor; +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * HtmlDumper dumps variables as HTML. + * + * @author Nicolas Grekas + */ +class HtmlDumper extends CliDumper +{ + /** @var callable|resource|string|null */ + public static $defaultOutput = 'php://output'; + + protected static $themes = [ + 'dark' => [ + 'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', + 'num' => 'font-weight:bold; color:#1299DA', + 'const' => 'font-weight:bold', + 'virtual' => 'font-style:italic', + 'str' => 'font-weight:bold; color:#56DB3A', + 'note' => 'color:#1299DA', + 'ref' => 'color:#A0A0A0', + 'public' => 'color:#FFFFFF', + 'protected' => 'color:#FFFFFF', + 'private' => 'color:#FFFFFF', + 'meta' => 'color:#B729D9', + 'key' => 'color:#56DB3A', + 'index' => 'color:#1299DA', + 'ellipsis' => 'color:#FF8400', + 'ns' => 'user-select:none;', + ], + 'light' => [ + 'default' => 'background:none; color:#CC7832; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', + 'num' => 'font-weight:bold; color:#1299DA', + 'const' => 'font-weight:bold', + 'virtual' => 'font-style:italic', + 'str' => 'font-weight:bold; color:#629755;', + 'note' => 'color:#6897BB', + 'ref' => 'color:#6E6E6E', + 'public' => 'color:#262626', + 'protected' => 'color:#262626', + 'private' => 'color:#262626', + 'meta' => 'color:#B729D9', + 'key' => 'color:#789339', + 'index' => 'color:#1299DA', + 'ellipsis' => 'color:#CC7832', + 'ns' => 'user-select:none;', + ], + ]; + + protected ?string $dumpHeader = null; + protected string $dumpPrefix = '
    ';
    +    protected string $dumpSuffix = '
    '; + protected string $dumpId; + protected bool $colors = true; + protected $headerIsDumped = false; + protected int $lastDepth = -1; + + private array $displayOptions = [ + 'maxDepth' => 1, + 'maxStringLength' => 160, + 'fileLinkFormat' => null, + ]; + private array $extraDisplayOptions = []; + + public function __construct($output = null, ?string $charset = null, int $flags = 0) + { + AbstractDumper::__construct($output, $charset, $flags); + $this->dumpId = 'sf-dump-'.mt_rand(); + $this->displayOptions['fileLinkFormat'] = \ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'); + $this->styles = static::$themes['dark'] ?? self::$themes['dark']; + } + + public function setStyles(array $styles): void + { + $this->headerIsDumped = false; + $this->styles = $styles + $this->styles; + } + + public function setTheme(string $themeName): void + { + if (!isset(static::$themes[$themeName])) { + throw new \InvalidArgumentException(\sprintf('Theme "%s" does not exist in class "%s".', $themeName, static::class)); + } + + $this->setStyles(static::$themes[$themeName]); + } + + /** + * Configures display options. + * + * @param array $displayOptions A map of display options to customize the behavior + */ + public function setDisplayOptions(array $displayOptions): void + { + $this->headerIsDumped = false; + $this->displayOptions = $displayOptions + $this->displayOptions; + } + + /** + * Sets an HTML header that will be dumped once in the output stream. + */ + public function setDumpHeader(?string $header): void + { + $this->dumpHeader = $header; + } + + /** + * Sets an HTML prefix and suffix that will encapse every single dump. + */ + public function setDumpBoundaries(string $prefix, string $suffix): void + { + $this->dumpPrefix = $prefix; + $this->dumpSuffix = $suffix; + } + + public function dump(Data $data, $output = null, array $extraDisplayOptions = []): ?string + { + $this->extraDisplayOptions = $extraDisplayOptions; + $result = parent::dump($data, $output); + $this->dumpId = 'sf-dump-'.mt_rand(); + + return $result; + } + + /** + * Dumps the HTML header. + */ + protected function getDumpHeader(): string + { + $this->headerIsDumped = $this->outputStream ?? $this->lineDumper; + + if (null !== $this->dumpHeader) { + return $this->dumpHeader; + } + + $line = str_replace('{$options}', json_encode($this->displayOptions, \JSON_FORCE_OBJECT), <<<'EOHTML' + '.$this->dumpHeader; + } + + public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void + { + if ('' === $str && isset($cursor->attr['img-data'], $cursor->attr['content-type'])) { + $this->dumpKey($cursor); + $this->line .= $this->style('default', $cursor->attr['img-size'] ?? '', []); + $this->line .= $cursor->depth >= $this->displayOptions['maxDepth'] ? ' ' : ' '; + $this->endValue($cursor); + $this->line .= $this->indentPad; + $this->line .= \sprintf('', $cursor->attr['content-type'], base64_encode($cursor->attr['img-data'])); + $this->endValue($cursor); + } else { + parent::dumpString($cursor, $str, $bin, $cut); + } + } + + public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild): void + { + if (Cursor::HASH_OBJECT === $type) { + $cursor->attr['depth'] = $cursor->depth; + } + parent::enterHash($cursor, $type, $class, false); + + if ($cursor->skipChildren || $cursor->depth >= $this->displayOptions['maxDepth']) { + $cursor->skipChildren = false; + $eol = ' class=sf-dump-compact>'; + } else { + $this->expandNextHash = false; + $eol = ' class=sf-dump-expanded>'; + } + + if ($hasChild) { + $this->line .= 'dumpId, $r); + } + $this->line .= $eol; + $this->dumpLine($cursor->depth); + } + } + + public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut): void + { + $this->dumpEllipsis($cursor, $hasChild, $cut); + if ($hasChild) { + $this->line .= ''; + } + parent::leaveHash($cursor, $type, $class, $hasChild, 0); + } + + protected function style(string $style, string $value, array $attr = []): string + { + if ('' === $value && ('label' !== $style || !isset($attr['file']) && !isset($attr['href']))) { + return ''; + } + + $v = esc($value); + + if ('ref' === $style) { + if (empty($attr['count'])) { + return \sprintf('%s', $v); + } + $r = ('#' !== $v[0] ? 1 - ('@' !== $v[0]) : 2).substr($value, 1); + + return \sprintf('%s', $this->dumpId, $r, 1 + $attr['count'], $v); + } + + $dumpClasses = ['sf-dump-'.$style]; + $dumpTitle = ''; + + if ('const' === $style && isset($attr['value'])) { + $dumpTitle = esc(\is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value'])); + } elseif ('public' === $style) { + $dumpTitle = empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property'; + } elseif ('str' === $style && 1 < $attr['length']) { + $dumpTitle = \sprintf('%d%s characters', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : ''); + } elseif ('note' === $style && 0 < ($attr['depth'] ?? 0) && false !== $c = strrpos($value, '\\')) { + $attr += [ + 'ellipsis' => \strlen($value) - $c, + 'ellipsis-type' => 'note', + 'ellipsis-tail' => 1, + ]; + } elseif ('protected' === $style) { + $dumpTitle = 'Protected property'; + } elseif ('meta' === $style && isset($attr['title'])) { + $dumpTitle = esc($this->utf8Encode($attr['title'])); + } elseif ('private' === $style) { + $dumpTitle = \sprintf('Private property defined in class: `%s`', esc($this->utf8Encode($attr['class']))); + } + + if (isset($attr['ellipsis'])) { + $dumpClasses[] = 'sf-dump-ellipsization'; + $ellipsisClass = 'sf-dump-ellipsis'; + if (isset($attr['ellipsis-type'])) { + $ellipsisClass .= ' sf-dump-ellipsis-'.$attr['ellipsis-type']; + } + $label = esc(substr($value, -$attr['ellipsis'])); + $dumpTitle = $v."\n".$dumpTitle; + $v = \sprintf('%s', $ellipsisClass, substr($v, 0, -\strlen($label))); + + if (!empty($attr['ellipsis-tail'])) { + $tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']))); + $v .= \sprintf('%s%s', $ellipsisClass, substr($label, 0, $tail), substr($label, $tail)); + } else { + $v .= \sprintf('%s', $label); + } + } + + $map = static::$controlCharsMap; + $v = \sprintf( + '%s', + 1 === \count($dumpClasses) ? '' : '"', + implode(' ', $dumpClasses), + $dumpTitle ? ' title="'.$dumpTitle.'"' : '', + preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { + $s = $b = ''; + }, $v) + ); + + if (!($attr['binary'] ?? false)) { + $v = preg_replace_callback(static::$unicodeCharsRx, function ($c) { + return '\u{'.strtoupper(dechex(mb_ord($c[0]))).'}'; + }, $v); + } + + if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], $attr['line'] ?? 0)) { + $attr['href'] = $href; + } + if (isset($attr['href'])) { + if ('label' === $style) { + $v .= '^'; + } + $target = isset($attr['file']) ? '' : ' target="_blank"'; + $v = \sprintf('%s', esc($this->utf8Encode($attr['href'])), $target, $v); + } + if (isset($attr['lang'])) { + $v = \sprintf('%s', esc($attr['lang']), $v); + } + if ('label' === $style) { + $v .= ' '; + } + if ($attr['virtual'] ?? false) { + $v = ''.$v.''; + } + + return $v; + } + + protected function dumpLine(int $depth, bool $endOfValue = false): void + { + if (-1 === $this->lastDepth) { + $this->line = \sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line; + } + if ($this->headerIsDumped !== ($this->outputStream ?? $this->lineDumper)) { + $this->line = $this->getDumpHeader().$this->line; + } + + if (-1 === $depth) { + $args = ['"'.$this->dumpId.'"']; + if ($this->extraDisplayOptions) { + $args[] = json_encode($this->extraDisplayOptions, \JSON_FORCE_OBJECT); + } + // Replace is for BC + $this->line .= \sprintf(str_replace('"%s"', '%s', $this->dumpSuffix), implode(', ', $args)); + } + $this->lastDepth = $depth; + + $this->line = mb_encode_numericentity($this->line, [0x80, 0x10FFFF, 0, 0x1FFFFF], 'UTF-8'); + + if (-1 === $depth) { + AbstractDumper::dumpLine(0); + } + AbstractDumper::dumpLine($depth); + } + + private function getSourceLink(string $file, int $line): string|false + { + $options = $this->extraDisplayOptions + $this->displayOptions; + + if ($fmt = $options['fileLinkFormat']) { + return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line); + } + + return false; + } +} + +function esc(string $str): string +{ + return htmlspecialchars($str, \ENT_QUOTES, 'UTF-8'); +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Dumper/ServerDumper.php b/upLoadImage/vendor/symfony/var-dumper/Dumper/ServerDumper.php new file mode 100644 index 0000000..4602bcf --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Dumper/ServerDumper.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; +use Symfony\Component\VarDumper\Server\Connection; + +/** + * ServerDumper forwards serialized Data clones to a server. + * + * @author Maxime Steinhausser + */ +class ServerDumper implements DataDumperInterface +{ + private Connection $connection; + + /** + * @param string $host The server host + * @param DataDumperInterface|null $wrappedDumper A wrapped instance used whenever we failed contacting the server + * @param ContextProviderInterface[] $contextProviders Context providers indexed by context name + */ + public function __construct( + string $host, + private ?DataDumperInterface $wrappedDumper = null, + array $contextProviders = [], + ) { + $this->connection = new Connection($host, $contextProviders); + } + + public function getContextProviders(): array + { + return $this->connection->getContextProviders(); + } + + public function dump(Data $data): ?string + { + if (!$this->connection->write($data) && $this->wrappedDumper) { + return $this->wrappedDumper->dump($data); + } + + return null; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php b/upLoadImage/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php new file mode 100644 index 0000000..fd8eca9 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Exception; + +/** + * @author Nicolas Grekas + */ +class ThrowingCasterException extends \Exception +{ + /** + * @param \Throwable $prev The exception thrown from the caster + */ + public function __construct(\Throwable $prev) + { + parent::__construct('Unexpected '.$prev::class.' thrown from a caster: '.$prev->getMessage(), 0, $prev); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/LICENSE b/upLoadImage/vendor/symfony/var-dumper/LICENSE new file mode 100644 index 0000000..29f72d5 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-present Fabien Potencier + +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/upLoadImage/vendor/symfony/var-dumper/README.md b/upLoadImage/vendor/symfony/var-dumper/README.md new file mode 100644 index 0000000..a0da8c9 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/README.md @@ -0,0 +1,15 @@ +VarDumper Component +=================== + +The VarDumper component provides mechanisms for walking through any arbitrary +PHP variable. It provides a better `dump()` function that you can use instead +of `var_dump()`. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/var_dumper/introduction.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/upLoadImage/vendor/symfony/var-dumper/Resources/bin/var-dump-server b/upLoadImage/vendor/symfony/var-dumper/Resources/bin/var-dump-server new file mode 100755 index 0000000..3e04aeb --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Resources/bin/var-dump-server @@ -0,0 +1,72 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if ('cli' !== PHP_SAPI) { + throw new Exception('This script must be run from the command line.'); +} + +/** + * Starts a dump server to collect and output dumps on a single place with multiple formats support. + * + * @author Maxime Steinhausser + */ + +use Psr\Log\LoggerInterface; +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Input\ArgvInput; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Logger\ConsoleLogger; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\VarDumper\Command\ServerDumpCommand; +use Symfony\Component\VarDumper\Server\DumpServer; + +function includeIfExists(string $file): bool +{ + return file_exists($file) && include $file; +} + +if ( + !includeIfExists(__DIR__ . '/../../../../autoload.php') && + !includeIfExists(__DIR__ . '/../../vendor/autoload.php') && + !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php') +) { + fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL); + exit(1); +} + +if (!class_exists(Application::class)) { + fwrite(STDERR, 'You need the "symfony/console" component in order to run the VarDumper server.'.PHP_EOL); + exit(1); +} + +$input = new ArgvInput(); +$output = new ConsoleOutput(); +$defaultHost = '127.0.0.1:9912'; +$host = $input->getParameterOption(['--host'], $_SERVER['VAR_DUMPER_SERVER'] ?? $defaultHost, true); +$logger = interface_exists(LoggerInterface::class) ? new ConsoleLogger($output->getErrorOutput()) : null; + +$app = new Application(); + +$app->getDefinition()->addOption( + new InputOption('--host', null, InputOption::VALUE_REQUIRED, 'The address the server should listen to', $defaultHost) +); + +$command = new ServerDumpCommand(new DumpServer($host, $logger)); +if (method_exists($app, 'addCommand')) { + $app->addCommand($command); +} else { + $app->add($command); +} +$app + ->setDefaultCommand($command->getName(), true) + ->run($input, $output) +; diff --git a/upLoadImage/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css b/upLoadImage/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css new file mode 100644 index 0000000..8f706d6 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css @@ -0,0 +1,130 @@ +body { + display: flex; + flex-direction: column-reverse; + justify-content: flex-end; + max-width: 1140px; + margin: auto; + padding: 15px; + word-wrap: break-word; + background-color: #F9F9F9; + color: #222; + font-family: Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.4; +} +p { + margin: 0; +} +a { + color: #218BC3; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +.text-small { + font-size: 12px !important; +} +article { + margin: 5px; + margin-bottom: 10px; +} +article > header > .row { + display: flex; + flex-direction: row; + align-items: baseline; + margin-bottom: 10px; +} +article > header > .row > .col { + flex: 1; + display: flex; + align-items: baseline; +} +article > header > .row > h2 { + font-size: 14px; + color: #222; + font-weight: normal; + font-family: "Lucida Console", monospace, sans-serif; + word-break: break-all; + margin: 20px 5px 0 0; + user-select: all; +} +article > header > .row > h2 > code { + white-space: nowrap; + user-select: none; + color: #cc2255; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; + border-radius: 3px; + margin-right: 5px; + padding: 0 3px; +} +article > header > .row > time.col { + flex: 0; + text-align: right; + white-space: nowrap; + color: #999; + font-style: italic; +} +article > header ul.tags { + list-style: none; + padding: 0; + margin: 0; + font-size: 12px; +} +article > header ul.tags > li { + user-select: all; + margin-bottom: 2px; +} +article > header ul.tags > li > span.badge { + display: inline-block; + padding: .25em .4em; + margin-right: 5px; + border-radius: 4px; + background-color: #6c757d3b; + color: #524d4d; + font-size: 12px; + text-align: center; + font-weight: 700; + line-height: 1; + white-space: nowrap; + vertical-align: baseline; + user-select: none; +} +article > section.body { + border: 1px solid #d8d8d8; + background: #FFF; + padding: 10px; + border-radius: 3px; +} +pre.sf-dump { + border-radius: 3px; + margin-bottom: 0; +} +.hidden { + display: none !important; +} +.dumped-tag > .sf-dump { + display: inline-block; + margin: 0; + padding: 1px 5px; + line-height: 1.4; + vertical-align: top; + background-color: transparent; + user-select: auto; +} +.dumped-tag > pre.sf-dump, +.dumped-tag > .sf-dump-default { + color: #CC7832; + background: none; +} +.dumped-tag > .sf-dump .sf-dump-str { color: #629755; } +.dumped-tag > .sf-dump .sf-dump-private, +.dumped-tag > .sf-dump .sf-dump-protected, +.dumped-tag > .sf-dump .sf-dump-public { color: #262626; } +.dumped-tag > .sf-dump .sf-dump-note { color: #6897BB; } +.dumped-tag > .sf-dump .sf-dump-key { color: #789339; } +.dumped-tag > .sf-dump .sf-dump-ref { color: #6E6E6E; } +.dumped-tag > .sf-dump .sf-dump-ellipsis { color: #CC7832; max-width: 100em; } +.dumped-tag > .sf-dump .sf-dump-ellipsis-path { max-width: 5em; } +.dumped-tag > .sf-dump .sf-dump-ns { user-select: none; } diff --git a/upLoadImage/vendor/symfony/var-dumper/Resources/functions/dump.php b/upLoadImage/vendor/symfony/var-dumper/Resources/functions/dump.php new file mode 100644 index 0000000..c991551 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Resources/functions/dump.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\VarDumper\Caster\ScalarStub; +use Symfony\Component\VarDumper\VarDumper; + +if (!function_exists('dump')) { + /** + * @author Nicolas Grekas + * @author Alexandre Daubois + */ + function dump(mixed ...$vars): mixed + { + if (!$vars) { + VarDumper::dump(new ScalarStub('🐛')); + + return null; + } + + if (array_key_exists(0, $vars) && 1 === count($vars)) { + VarDumper::dump($vars[0]); + $k = 0; + } else { + foreach ($vars as $k => $v) { + VarDumper::dump($v, is_int($k) ? 1 + $k : $k); + } + } + + if (1 < count($vars)) { + return $vars; + } + + return $vars[$k]; + } +} + +if (!function_exists('dd')) { + function dd(mixed ...$vars): never + { + if (!in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) && !headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + + if (!$vars) { + VarDumper::dump(new ScalarStub('🐛')); + + exit(1); + } + + if (array_key_exists(0, $vars) && 1 === count($vars)) { + VarDumper::dump($vars[0]); + } else { + foreach ($vars as $k => $v) { + VarDumper::dump($v, is_int($k) ? 1 + $k : $k); + } + } + + exit(1); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js b/upLoadImage/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js new file mode 100644 index 0000000..63101e5 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js @@ -0,0 +1,10 @@ +document.addEventListener('DOMContentLoaded', function() { + let prev = null; + Array.from(document.getElementsByTagName('article')).reverse().forEach(function (article) { + const dedupId = article.dataset.dedupId; + if (dedupId === prev) { + article.getElementsByTagName('header')[0].classList.add('hidden'); + } + prev = dedupId; + }); +}); diff --git a/upLoadImage/vendor/symfony/var-dumper/Server/Connection.php b/upLoadImage/vendor/symfony/var-dumper/Server/Connection.php new file mode 100644 index 0000000..2f1cc1b --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Server/Connection.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Server; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; + +/** + * Forwards serialized Data clones to a server. + * + * @author Maxime Steinhausser + */ +class Connection +{ + private string $host; + + /** + * @var resource|null + */ + private $socket; + + /** + * @param string $host The server host + * @param ContextProviderInterface[] $contextProviders Context providers indexed by context name + */ + public function __construct( + string $host, + private array $contextProviders = [], + ) { + if (!str_contains($host, '://')) { + $host = 'tcp://'.$host; + } + + $this->host = $host; + } + + public function getContextProviders(): array + { + return $this->contextProviders; + } + + public function write(Data $data): bool + { + $socketIsFresh = !$this->socket; + if (!$this->socket = $this->socket ?: $this->createSocket()) { + return false; + } + + $context = ['timestamp' => microtime(true)]; + foreach ($this->contextProviders as $name => $provider) { + $context[$name] = $provider->getContext(); + } + $context = array_filter($context); + $encodedPayload = base64_encode(serialize([$data, $context]))."\n"; + + set_error_handler(static fn () => null); + try { + if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) { + return true; + } + if (!$socketIsFresh) { + stream_socket_shutdown($this->socket, \STREAM_SHUT_RDWR); + fclose($this->socket); + $this->socket = $this->createSocket(); + } + if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) { + return true; + } + } finally { + restore_error_handler(); + } + + return false; + } + + /** + * @return resource|null + */ + private function createSocket() + { + set_error_handler(static fn () => null); + try { + return stream_socket_client($this->host, $errno, $errstr, 3) ?: null; + } finally { + restore_error_handler(); + } + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Server/DumpServer.php b/upLoadImage/vendor/symfony/var-dumper/Server/DumpServer.php new file mode 100644 index 0000000..149c3c4 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Server/DumpServer.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Server; + +use Psr\Log\LoggerInterface; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * A server collecting Data clones sent by a ServerDumper. + * + * @author Maxime Steinhausser + * + * @final + */ +class DumpServer +{ + private string $host; + + /** + * @var resource|null + */ + private $socket; + + public function __construct( + string $host, + private ?LoggerInterface $logger = null, + ) { + if (!str_contains($host, '://')) { + $host = 'tcp://'.$host; + } + + $this->host = $host; + } + + public function start(): void + { + if (!$this->socket = stream_socket_server($this->host, $errno, $errstr)) { + throw new \RuntimeException(\sprintf('Server start failed on "%s": ', $this->host).$errstr.' '.$errno); + } + } + + public function listen(callable $callback): void + { + if (null === $this->socket) { + $this->start(); + } + + foreach ($this->getMessages() as $clientId => $message) { + $this->logger?->info('Received a payload from client {clientId}', ['clientId' => $clientId]); + + $payload = @unserialize(base64_decode($message), ['allowed_classes' => [Data::class, Stub::class]]); + + // Impossible to decode the message, give up. + if (false === $payload) { + $this->logger?->warning('Unable to decode a message from {clientId} client.', ['clientId' => $clientId]); + + continue; + } + + if (!\is_array($payload) || \count($payload) < 2 || !$payload[0] instanceof Data || !\is_array($payload[1])) { + $this->logger?->warning('Invalid payload from {clientId} client. Expected an array of two elements (Data $data, array $context)', ['clientId' => $clientId]); + + continue; + } + + [$data, $context] = $payload; + + $callback($data, $context, $clientId); + } + } + + public function getHost(): string + { + return $this->host; + } + + private function getMessages(): iterable + { + $sockets = [(int) $this->socket => $this->socket]; + $write = []; + + while (true) { + $read = $sockets; + stream_select($read, $write, $write, null); + + foreach ($read as $stream) { + if ($this->socket === $stream) { + $stream = stream_socket_accept($this->socket); + $sockets[(int) $stream] = $stream; + } elseif (feof($stream)) { + unset($sockets[(int) $stream]); + fclose($stream); + } else { + yield (int) $stream => fgets($stream); + } + } + } + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php b/upLoadImage/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php new file mode 100644 index 0000000..dc675b2 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Test; + +use PHPUnit\Framework\Attributes\After; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; + +/** + * @author Nicolas Grekas + */ +trait VarDumperTestTrait +{ + /** + * @internal + */ + private array $varDumperConfig = [ + 'casters' => [], + 'flags' => null, + ]; + + /** + * @param array $casters + */ + protected function setUpVarDumper(array $casters, ?int $flags = null): void + { + $this->varDumperConfig['casters'] = $casters; + $this->varDumperConfig['flags'] = $flags; + } + + /** + * @after + */ + #[After] + protected function tearDownVarDumper(): void + { + $this->varDumperConfig['casters'] = []; + $this->varDumperConfig['flags'] = null; + } + + /** + * @return void + */ + public function assertDumpEquals(mixed $expected, mixed $data, int $filter = 0, string $message = '') + { + $this->assertSame($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message); + } + + /** + * @return void + */ + public function assertDumpMatchesFormat(mixed $expected, mixed $data, int $filter = 0, string $message = '') + { + $this->assertStringMatchesFormat($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message); + } + + protected function getDump(mixed $data, string|int|null $key = null, int $filter = 0): ?string + { + if (null === $flags = $this->varDumperConfig['flags']) { + $flags = getenv('DUMP_LIGHT_ARRAY') ? CliDumper::DUMP_LIGHT_ARRAY : 0; + $flags |= getenv('DUMP_STRING_LENGTH') ? CliDumper::DUMP_STRING_LENGTH : 0; + $flags |= getenv('DUMP_COMMA_SEPARATOR') ? CliDumper::DUMP_COMMA_SEPARATOR : 0; + } + + $cloner = new VarCloner(); + $cloner->addCasters($this->varDumperConfig['casters']); + $cloner->setMaxItems(-1); + $dumper = new CliDumper(null, null, $flags); + $dumper->setColors(false); + $data = $cloner->cloneVar($data, $filter)->withRefHandles(false); + if (null !== $key && null === $data = $data->seek($key)) { + return null; + } + + return rtrim($dumper->dump($data, true)); + } + + private function prepareExpectation(mixed $expected, int $filter): string + { + if (!\is_string($expected)) { + $expected = $this->getDump($expected, null, $filter); + } + + return rtrim($expected); + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/VarDumper.php b/upLoadImage/vendor/symfony/var-dumper/VarDumper.php new file mode 100644 index 0000000..0c3aca9 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/VarDumper.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper; + +use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\VarDumper\Caster\ReflectionCaster; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Dumper\ContextProvider\CliContextProvider; +use Symfony\Component\VarDumper\Dumper\ContextProvider\RequestContextProvider; +use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; +use Symfony\Component\VarDumper\Dumper\ContextualizedDumper; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\Dumper\ServerDumper; + +// Load the global dump() function +require_once __DIR__.'/Resources/functions/dump.php'; + +/** + * @author Nicolas Grekas + */ +class VarDumper +{ + /** + * @var callable|null + */ + private static $handler; + + public static function dump(mixed $var, ?string $label = null): mixed + { + if (null === self::$handler) { + self::register(); + } + + return (self::$handler)($var, $label); + } + + public static function setHandler(?callable $callable): ?callable + { + $prevHandler = self::$handler; + + // Prevent replacing the handler with expected format as soon as the env var was set: + if (isset($_SERVER['VAR_DUMPER_FORMAT'])) { + return $prevHandler; + } + + self::$handler = $callable; + + return $prevHandler; + } + + private static function register(): void + { + $cloner = new VarCloner(); + $cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO); + + $format = $_SERVER['VAR_DUMPER_FORMAT'] ?? null; + switch (true) { + case 'html' === $format: + $dumper = new HtmlDumper(); + break; + case 'cli' === $format: + $dumper = new CliDumper(); + break; + case 'server' === $format: + case $format && 'tcp' === parse_url($format, \PHP_URL_SCHEME): + $host = 'server' === $format ? $_SERVER['VAR_DUMPER_SERVER'] ?? '127.0.0.1:9912' : $format; + $accept = $_SERVER['HTTP_ACCEPT'] ?? (\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? 'txt' : 'html'); + $dumper = str_contains($accept, 'html') || str_contains($accept, '*/*') ? new HtmlDumper() : new CliDumper(); + $dumper = new ServerDumper($host, $dumper, self::getDefaultContextProviders()); + break; + default: + $accept = $_SERVER['HTTP_ACCEPT'] ?? (\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? 'txt' : 'html'); + $dumper = str_contains($accept, 'html') || str_contains($accept, '*/*') ? new HtmlDumper() : new CliDumper(); + } + + if (!$dumper instanceof ServerDumper) { + $dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]); + } + + self::$handler = function ($var, ?string $label = null) use ($cloner, $dumper) { + $var = $cloner->cloneVar($var); + + if (null !== $label) { + $var = $var->withContext(['label' => $label]); + } + + $dumper->dump($var); + }; + } + + private static function getDefaultContextProviders(): array + { + $contextProviders = []; + + if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) && class_exists(Request::class)) { + $requestStack = new RequestStack(); + $requestStack->push(Request::createFromGlobals()); + $contextProviders['request'] = new RequestContextProvider($requestStack); + } + + $fileLinkFormatter = class_exists(FileLinkFormatter::class) ? new FileLinkFormatter(null, $requestStack ?? null) : null; + + return $contextProviders + [ + 'cli' => new CliContextProvider(), + 'source' => new SourceContextProvider(null, null, $fileLinkFormatter), + ]; + } +} diff --git a/upLoadImage/vendor/symfony/var-dumper/composer.json b/upLoadImage/vendor/symfony/var-dumper/composer.json new file mode 100644 index 0000000..bffa992 --- /dev/null +++ b/upLoadImage/vendor/symfony/var-dumper/composer.json @@ -0,0 +1,44 @@ +{ + "name": "symfony/var-dumper", + "type": "library", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "keywords": ["dump", "debug"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "autoload": { + "files": [ "Resources/functions/dump.php" ], + "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "minimum-stability": "dev" +}