H", ifd_data[:2])[0]):
+ ifd_tag, typ, count, data = struct.unpack(
+ ">HHL4s", ifd_data[i * 12 + 2 : (i + 1) * 12 + 2]
+ )
+ if ifd_tag == 0x1101:
+ # CameraInfo
+ (offset,) = struct.unpack(">L", data)
+ self.fp.seek(offset)
+
+ camerainfo = {"ModelID": self.fp.read(4)}
+
+ self.fp.read(4)
+ # Seconds since 2000
+ camerainfo["TimeStamp"] = i32le(self.fp.read(12))
+
+ self.fp.read(4)
+ camerainfo["InternalSerialNumber"] = self.fp.read(4)
+
+ self.fp.read(12)
+ parallax = self.fp.read(4)
+ handler = ImageFileDirectory_v2._load_dispatch[
+ TiffTags.FLOAT
+ ][1]
+ camerainfo["Parallax"] = handler(
+ ImageFileDirectory_v2(), parallax, False
+ )
+
+ self.fp.read(4)
+ camerainfo["Category"] = self.fp.read(2)
+
+ makernote = {0x1101: dict(self._fixup_dict(camerainfo))}
+ self._ifds[0x927C] = makernote
+ return self._ifds.get(tag, {})
+
+ def __str__(self):
+ if self._info is not None:
+ # Load all keys into self._data
+ for tag in self._info.keys():
+ self[tag]
+
+ return str(self._data)
+
+ def __len__(self):
+ keys = set(self._data)
+ if self._info is not None:
+ keys.update(self._info)
+ return len(keys)
+
+ def __getitem__(self, tag):
+ if self._info is not None and tag not in self._data and tag in self._info:
+ self._data[tag] = self._fixup(self._info[tag])
+ if tag == 0x8825:
+ self._data[tag] = self.get_ifd(tag)
+ del self._info[tag]
+ return self._data[tag]
+
+ def __contains__(self, tag):
+ return tag in self._data or (self._info is not None and tag in self._info)
+
+ def __setitem__(self, tag, value):
+ if self._info is not None and tag in self._info:
+ del self._info[tag]
+ self._data[tag] = value
+
+ def __delitem__(self, tag):
+ if self._info is not None and tag in self._info:
+ del self._info[tag]
+ del self._data[tag]
+
+ def __iter__(self):
+ keys = set(self._data)
+ if self._info is not None:
+ keys.update(self._info)
+ return iter(keys)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageChops.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageChops.py
new file mode 100644
index 0000000..2d13b52
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageChops.py
@@ -0,0 +1,328 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# standard channel operations
+#
+# History:
+# 1996-03-24 fl Created
+# 1996-08-13 fl Added logical operations (for "1" images)
+# 2000-10-12 fl Added offset method (from Image.py)
+#
+# Copyright (c) 1997-2000 by Secret Labs AB
+# Copyright (c) 1996-2000 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image
+
+
+def constant(image, value):
+ """Fill a channel with a given grey level.
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ return Image.new("L", image.size, value)
+
+
+def duplicate(image):
+ """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`.
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ return image.copy()
+
+
+def invert(image):
+ """
+ Invert an image (channel).
+
+ .. code-block:: python
+
+ out = MAX - image
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image.load()
+ return image._new(image.im.chop_invert())
+
+
+def lighter(image1, image2):
+ """
+ Compares the two images, pixel by pixel, and returns a new image containing
+ the lighter values. At least one of the images must have mode "1".
+
+ .. code-block:: python
+
+ out = max(image1, image2)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_lighter(image2.im))
+
+
+def darker(image1, image2):
+ """
+ Compares the two images, pixel by pixel, and returns a new image containing
+ the darker values. At least one of the images must have mode "1".
+
+ .. code-block:: python
+
+ out = min(image1, image2)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_darker(image2.im))
+
+
+def difference(image1, image2):
+ """
+ Returns the absolute value of the pixel-by-pixel difference between the two
+ images. At least one of the images must have mode "1".
+
+ .. code-block:: python
+
+ out = abs(image1 - image2)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_difference(image2.im))
+
+
+def multiply(image1, image2):
+ """
+ Superimposes two images on top of each other.
+
+ If you multiply an image with a solid black image, the result is black. If
+ you multiply with a solid white image, the image is unaffected. At least
+ one of the images must have mode "1".
+
+ .. code-block:: python
+
+ out = image1 * image2 / MAX
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_multiply(image2.im))
+
+
+def screen(image1, image2):
+ """
+ Superimposes two inverted images on top of each other. At least one of the
+ images must have mode "1".
+
+ .. code-block:: python
+
+ out = MAX - ((MAX - image1) * (MAX - image2) / MAX)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_screen(image2.im))
+
+
+def soft_light(image1, image2):
+ """
+ Superimposes two images on top of each other using the Soft Light algorithm
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_soft_light(image2.im))
+
+
+def hard_light(image1, image2):
+ """
+ Superimposes two images on top of each other using the Hard Light algorithm
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_hard_light(image2.im))
+
+
+def overlay(image1, image2):
+ """
+ Superimposes two images on top of each other using the Overlay algorithm
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_overlay(image2.im))
+
+
+def add(image1, image2, scale=1.0, offset=0):
+ """
+ Adds two images, dividing the result by scale and adding the
+ offset. If omitted, scale defaults to 1.0, and offset to 0.0.
+ At least one of the images must have mode "1".
+
+ .. code-block:: python
+
+ out = ((image1 + image2) / scale + offset)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_add(image2.im, scale, offset))
+
+
+def subtract(image1, image2, scale=1.0, offset=0):
+ """
+ Subtracts two images, dividing the result by scale and adding the offset.
+ If omitted, scale defaults to 1.0, and offset to 0.0. At least one of the
+ images must have mode "1".
+
+ .. code-block:: python
+
+ out = ((image1 - image2) / scale + offset)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_subtract(image2.im, scale, offset))
+
+
+def add_modulo(image1, image2):
+ """Add two images, without clipping the result. At least one of the images
+ must have mode "1".
+
+ .. code-block:: python
+
+ out = ((image1 + image2) % MAX)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_add_modulo(image2.im))
+
+
+def subtract_modulo(image1, image2):
+ """Subtract two images, without clipping the result. At least one of the
+ images must have mode "1".
+
+ .. code-block:: python
+
+ out = ((image1 - image2) % MAX)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_subtract_modulo(image2.im))
+
+
+def logical_and(image1, image2):
+ """Logical AND between two images. At least one of the images must have
+ mode "1".
+
+ .. code-block:: python
+
+ out = ((image1 and image2) % MAX)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_and(image2.im))
+
+
+def logical_or(image1, image2):
+ """Logical OR between two images. At least one of the images must have
+ mode "1".
+
+ .. code-block:: python
+
+ out = ((image1 or image2) % MAX)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_or(image2.im))
+
+
+def logical_xor(image1, image2):
+ """Logical XOR between two images. At least one of the images must have
+ mode "1".
+
+ .. code-block:: python
+
+ out = ((bool(image1) != bool(image2)) % MAX)
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ image1.load()
+ image2.load()
+ return image1._new(image1.im.chop_xor(image2.im))
+
+
+def blend(image1, image2, alpha):
+ """Blend images using constant transparency weight. Alias for
+ :py:meth:`PIL.Image.Image.blend`.
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ return Image.blend(image1, image2, alpha)
+
+
+def composite(image1, image2, mask):
+ """Create composite using transparency mask. Alias for
+ :py:meth:`PIL.Image.Image.composite`.
+
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ return Image.composite(image1, image2, mask)
+
+
+def offset(image, xoffset, yoffset=None):
+ """Returns a copy of the image where data has been offset by the given
+ distances. Data wraps around the edges. If **yoffset** is omitted, it
+ is assumed to be equal to **xoffset**.
+
+ :param xoffset: The horizontal distance.
+ :param yoffset: The vertical distance. If omitted, both
+ distances are set to the same value.
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+
+ if yoffset is None:
+ yoffset = xoffset
+ image.load()
+ return image._new(image.im.offset(xoffset, yoffset))
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageCms.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageCms.py
new file mode 100644
index 0000000..661c3f3
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageCms.py
@@ -0,0 +1,985 @@
+# The Python Imaging Library.
+# $Id$
+
+# Optional color management support, based on Kevin Cazabon's PyCMS
+# library.
+
+# History:
+
+# 2009-03-08 fl Added to PIL.
+
+# Copyright (C) 2002-2003 Kevin Cazabon
+# Copyright (c) 2009 by Fredrik Lundh
+# Copyright (c) 2013 by Eric Soroos
+
+# See the README file for information on usage and redistribution. See
+# below for the original description.
+
+import sys
+
+from PIL import Image
+
+try:
+ from PIL import _imagingcms
+except ImportError as ex:
+ # Allow error import for doc purposes, but error out when accessing
+ # anything in core.
+ from ._util import deferred_error
+
+ _imagingcms = deferred_error(ex)
+
+DESCRIPTION = """
+pyCMS
+
+ a Python / PIL interface to the littleCMS ICC Color Management System
+ Copyright (C) 2002-2003 Kevin Cazabon
+ kevin@cazabon.com
+ http://www.cazabon.com
+
+ pyCMS home page: http://www.cazabon.com/pyCMS
+ littleCMS home page: http://www.littlecms.com
+ (littleCMS is Copyright (C) 1998-2001 Marti Maria)
+
+ Originally released under LGPL. Graciously donated to PIL in
+ March 2009, for distribution under the standard PIL license
+
+ The pyCMS.py module provides a "clean" interface between Python/PIL and
+ pyCMSdll, taking care of some of the more complex handling of the direct
+ pyCMSdll functions, as well as error-checking and making sure that all
+ relevant data is kept together.
+
+ While it is possible to call pyCMSdll functions directly, it's not highly
+ recommended.
+
+ Version History:
+
+ 1.0.0 pil Oct 2013 Port to LCMS 2.
+
+ 0.1.0 pil mod March 10, 2009
+
+ Renamed display profile to proof profile. The proof
+ profile is the profile of the device that is being
+ simulated, not the profile of the device which is
+ actually used to display/print the final simulation
+ (that'd be the output profile) - also see LCMSAPI.txt
+ input colorspace -> using 'renderingIntent' -> proof
+ colorspace -> using 'proofRenderingIntent' -> output
+ colorspace
+
+ Added LCMS FLAGS support.
+ Added FLAGS["SOFTPROOFING"] as default flag for
+ buildProofTransform (otherwise the proof profile/intent
+ would be ignored).
+
+ 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms
+
+ 0.0.2 alpha Jan 6, 2002
+
+ Added try/except statements around type() checks of
+ potential CObjects... Python won't let you use type()
+ on them, and raises a TypeError (stupid, if you ask
+ me!)
+
+ Added buildProofTransformFromOpenProfiles() function.
+ Additional fixes in DLL, see DLL code for details.
+
+ 0.0.1 alpha first public release, Dec. 26, 2002
+
+ Known to-do list with current version (of Python interface, not pyCMSdll):
+
+ none
+
+"""
+
+VERSION = "1.0.0 pil"
+
+# --------------------------------------------------------------------.
+
+core = _imagingcms
+
+#
+# intent/direction values
+
+INTENT_PERCEPTUAL = 0
+INTENT_RELATIVE_COLORIMETRIC = 1
+INTENT_SATURATION = 2
+INTENT_ABSOLUTE_COLORIMETRIC = 3
+
+DIRECTION_INPUT = 0
+DIRECTION_OUTPUT = 1
+DIRECTION_PROOF = 2
+
+#
+# flags
+
+FLAGS = {
+ "MATRIXINPUT": 1,
+ "MATRIXOUTPUT": 2,
+ "MATRIXONLY": (1 | 2),
+ "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot
+ # Don't create prelinearization tables on precalculated transforms
+ # (internal use):
+ "NOPRELINEARIZATION": 16,
+ "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink)
+ "NOTCACHE": 64, # Inhibit 1-pixel cache
+ "NOTPRECALC": 256,
+ "NULLTRANSFORM": 512, # Don't transform anyway
+ "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy
+ "LOWRESPRECALC": 2048, # Use less memory to minimize resources
+ "WHITEBLACKCOMPENSATION": 8192,
+ "BLACKPOINTCOMPENSATION": 8192,
+ "GAMUTCHECK": 4096, # Out of Gamut alarm
+ "SOFTPROOFING": 16384, # Do softproofing
+ "PRESERVEBLACK": 32768, # Black preservation
+ "NODEFAULTRESOURCEDEF": 16777216, # CRD special
+ "GRIDPOINTS": lambda n: ((n) & 0xFF) << 16, # Gridpoints
+}
+
+_MAX_FLAG = 0
+for flag in FLAGS.values():
+ if isinstance(flag, int):
+ _MAX_FLAG = _MAX_FLAG | flag
+
+
+# --------------------------------------------------------------------.
+# Experimental PIL-level API
+# --------------------------------------------------------------------.
+
+##
+# Profile.
+
+
+class ImageCmsProfile:
+ def __init__(self, profile):
+ """
+ :param profile: Either a string representing a filename,
+ a file like object containing a profile or a
+ low-level profile object
+
+ """
+
+ if isinstance(profile, str):
+ self._set(core.profile_open(profile), profile)
+ elif hasattr(profile, "read"):
+ self._set(core.profile_frombytes(profile.read()))
+ elif isinstance(profile, _imagingcms.CmsProfile):
+ self._set(profile)
+ else:
+ raise TypeError("Invalid type for Profile")
+
+ def _set(self, profile, filename=None):
+ self.profile = profile
+ self.filename = filename
+ if profile:
+ self.product_name = None # profile.product_name
+ self.product_info = None # profile.product_info
+ else:
+ self.product_name = None
+ self.product_info = None
+
+ def tobytes(self):
+ """
+ Returns the profile in a format suitable for embedding in
+ saved images.
+
+ :returns: a bytes object containing the ICC profile.
+ """
+
+ return core.profile_tobytes(self.profile)
+
+
+class ImageCmsTransform(Image.ImagePointHandler):
+
+ """
+ Transform. This can be used with the procedural API, or with the standard
+ Image.point() method.
+
+ Will return the output profile in the output.info['icc_profile'].
+ """
+
+ def __init__(
+ self,
+ input,
+ output,
+ input_mode,
+ output_mode,
+ intent=INTENT_PERCEPTUAL,
+ proof=None,
+ proof_intent=INTENT_ABSOLUTE_COLORIMETRIC,
+ flags=0,
+ ):
+ if proof is None:
+ self.transform = core.buildTransform(
+ input.profile, output.profile, input_mode, output_mode, intent, flags
+ )
+ else:
+ self.transform = core.buildProofTransform(
+ input.profile,
+ output.profile,
+ proof.profile,
+ input_mode,
+ output_mode,
+ intent,
+ proof_intent,
+ flags,
+ )
+ # Note: inputMode and outputMode are for pyCMS compatibility only
+ self.input_mode = self.inputMode = input_mode
+ self.output_mode = self.outputMode = output_mode
+
+ self.output_profile = output
+
+ def point(self, im):
+ return self.apply(im)
+
+ def apply(self, im, imOut=None):
+ im.load()
+ if imOut is None:
+ imOut = Image.new(self.output_mode, im.size, None)
+ self.transform.apply(im.im.id, imOut.im.id)
+ imOut.info["icc_profile"] = self.output_profile.tobytes()
+ return imOut
+
+ def apply_in_place(self, im):
+ im.load()
+ if im.mode != self.output_mode:
+ raise ValueError("mode mismatch") # wrong output mode
+ self.transform.apply(im.im.id, im.im.id)
+ im.info["icc_profile"] = self.output_profile.tobytes()
+ return im
+
+
+def get_display_profile(handle=None):
+ """ (experimental) Fetches the profile for the current display device.
+ :returns: None if the profile is not known.
+ """
+
+ if sys.platform != "win32":
+ return None
+
+ from PIL import ImageWin
+
+ if isinstance(handle, ImageWin.HDC):
+ profile = core.get_display_profile_win32(handle, 1)
+ else:
+ profile = core.get_display_profile_win32(handle or 0)
+ if profile is None:
+ return None
+ return ImageCmsProfile(profile)
+
+
+# --------------------------------------------------------------------.
+# pyCMS compatible layer
+# --------------------------------------------------------------------.
+
+
+class PyCMSError(Exception):
+
+ """ (pyCMS) Exception class.
+ This is used for all errors in the pyCMS API. """
+
+ pass
+
+
+def profileToProfile(
+ im,
+ inputProfile,
+ outputProfile,
+ renderingIntent=INTENT_PERCEPTUAL,
+ outputMode=None,
+ inPlace=False,
+ flags=0,
+):
+ """
+ (pyCMS) Applies an ICC transformation to a given image, mapping from
+ inputProfile to outputProfile.
+
+ If the input or output profiles specified are not valid filenames, a
+ PyCMSError will be raised. If inPlace is True and outputMode != im.mode,
+ a PyCMSError will be raised. If an error occurs during application of
+ the profiles, a PyCMSError will be raised. If outputMode is not a mode
+ supported by the outputProfile (or by pyCMS), a PyCMSError will be
+ raised.
+
+ This function applies an ICC transformation to im from inputProfile's
+ color space to outputProfile's color space using the specified rendering
+ intent to decide how to handle out-of-gamut colors.
+
+ OutputMode can be used to specify that a color mode conversion is to
+ be done using these profiles, but the specified profiles must be able
+ to handle that mode. I.e., if converting im from RGB to CMYK using
+ profiles, the input profile must handle RGB data, and the output
+ profile must handle CMYK data.
+
+ :param im: An open PIL image object (i.e. Image.new(...) or
+ Image.open(...), etc.)
+ :param inputProfile: String, as a valid filename path to the ICC input
+ profile you wish to use for this image, or a profile object
+ :param outputProfile: String, as a valid filename path to the ICC output
+ profile you wish to use for this image, or a profile object
+ :param renderingIntent: Integer (0-3) specifying the rendering intent you
+ wish to use for the transform
+
+ ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)
+ ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1
+ ImageCms.INTENT_SATURATION = 2
+ ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3
+
+ see the pyCMS documentation for details on rendering intents and what
+ they do.
+ :param outputMode: A valid PIL mode for the output image (i.e. "RGB",
+ "CMYK", etc.). Note: if rendering the image "inPlace", outputMode
+ MUST be the same mode as the input, or omitted completely. If
+ omitted, the outputMode will be the same as the mode of the input
+ image (im.mode)
+ :param inPlace: Boolean. If True, the original image is modified in-place,
+ and None is returned. If False (default), a new Image object is
+ returned with the transform applied.
+ :param flags: Integer (0-...) specifying additional flags
+ :returns: Either None or a new PIL image object, depending on value of
+ inPlace
+ :exception PyCMSError:
+ """
+
+ if outputMode is None:
+ outputMode = im.mode
+
+ if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3):
+ raise PyCMSError("renderingIntent must be an integer between 0 and 3")
+
+ if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG):
+ raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG)
+
+ try:
+ if not isinstance(inputProfile, ImageCmsProfile):
+ inputProfile = ImageCmsProfile(inputProfile)
+ if not isinstance(outputProfile, ImageCmsProfile):
+ outputProfile = ImageCmsProfile(outputProfile)
+ transform = ImageCmsTransform(
+ inputProfile,
+ outputProfile,
+ im.mode,
+ outputMode,
+ renderingIntent,
+ flags=flags,
+ )
+ if inPlace:
+ transform.apply_in_place(im)
+ imOut = None
+ else:
+ imOut = transform.apply(im)
+ except (OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+ return imOut
+
+
+def getOpenProfile(profileFilename):
+ """
+ (pyCMS) Opens an ICC profile file.
+
+ The PyCMSProfile object can be passed back into pyCMS for use in creating
+ transforms and such (as in ImageCms.buildTransformFromOpenProfiles()).
+
+ If profileFilename is not a valid filename for an ICC profile, a PyCMSError
+ will be raised.
+
+ :param profileFilename: String, as a valid filename path to the ICC profile
+ you wish to open, or a file-like object.
+ :returns: A CmsProfile class object.
+ :exception PyCMSError:
+ """
+
+ try:
+ return ImageCmsProfile(profileFilename)
+ except (OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def buildTransform(
+ inputProfile,
+ outputProfile,
+ inMode,
+ outMode,
+ renderingIntent=INTENT_PERCEPTUAL,
+ flags=0,
+):
+ """
+ (pyCMS) Builds an ICC transform mapping from the inputProfile to the
+ outputProfile. Use applyTransform to apply the transform to a given
+ image.
+
+ If the input or output profiles specified are not valid filenames, a
+ PyCMSError will be raised. If an error occurs during creation of the
+ transform, a PyCMSError will be raised.
+
+ If inMode or outMode are not a mode supported by the outputProfile (or
+ by pyCMS), a PyCMSError will be raised.
+
+ This function builds and returns an ICC transform from the inputProfile
+ to the outputProfile using the renderingIntent to determine what to do
+ with out-of-gamut colors. It will ONLY work for converting images that
+ are in inMode to images that are in outMode color format (PIL mode,
+ i.e. "RGB", "RGBA", "CMYK", etc.).
+
+ Building the transform is a fair part of the overhead in
+ ImageCms.profileToProfile(), so if you're planning on converting multiple
+ images using the same input/output settings, this can save you time.
+ Once you have a transform object, it can be used with
+ ImageCms.applyProfile() to convert images without the need to re-compute
+ the lookup table for the transform.
+
+ The reason pyCMS returns a class object rather than a handle directly
+ to the transform is that it needs to keep track of the PIL input/output
+ modes that the transform is meant for. These attributes are stored in
+ the "inMode" and "outMode" attributes of the object (which can be
+ manually overridden if you really want to, but I don't know of any
+ time that would be of use, or would even work).
+
+ :param inputProfile: String, as a valid filename path to the ICC input
+ profile you wish to use for this transform, or a profile object
+ :param outputProfile: String, as a valid filename path to the ICC output
+ profile you wish to use for this transform, or a profile object
+ :param inMode: String, as a valid PIL mode that the appropriate profile
+ also supports (i.e. "RGB", "RGBA", "CMYK", etc.)
+ :param outMode: String, as a valid PIL mode that the appropriate profile
+ also supports (i.e. "RGB", "RGBA", "CMYK", etc.)
+ :param renderingIntent: Integer (0-3) specifying the rendering intent you
+ wish to use for the transform
+
+ ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)
+ ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1
+ ImageCms.INTENT_SATURATION = 2
+ ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3
+
+ see the pyCMS documentation for details on rendering intents and what
+ they do.
+ :param flags: Integer (0-...) specifying additional flags
+ :returns: A CmsTransform class object.
+ :exception PyCMSError:
+ """
+
+ if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3):
+ raise PyCMSError("renderingIntent must be an integer between 0 and 3")
+
+ if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG):
+ raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG)
+
+ try:
+ if not isinstance(inputProfile, ImageCmsProfile):
+ inputProfile = ImageCmsProfile(inputProfile)
+ if not isinstance(outputProfile, ImageCmsProfile):
+ outputProfile = ImageCmsProfile(outputProfile)
+ return ImageCmsTransform(
+ inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags
+ )
+ except (OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def buildProofTransform(
+ inputProfile,
+ outputProfile,
+ proofProfile,
+ inMode,
+ outMode,
+ renderingIntent=INTENT_PERCEPTUAL,
+ proofRenderingIntent=INTENT_ABSOLUTE_COLORIMETRIC,
+ flags=FLAGS["SOFTPROOFING"],
+):
+ """
+ (pyCMS) Builds an ICC transform mapping from the inputProfile to the
+ outputProfile, but tries to simulate the result that would be
+ obtained on the proofProfile device.
+
+ If the input, output, or proof profiles specified are not valid
+ filenames, a PyCMSError will be raised.
+
+ If an error occurs during creation of the transform, a PyCMSError will
+ be raised.
+
+ If inMode or outMode are not a mode supported by the outputProfile
+ (or by pyCMS), a PyCMSError will be raised.
+
+ This function builds and returns an ICC transform from the inputProfile
+ to the outputProfile, but tries to simulate the result that would be
+ obtained on the proofProfile device using renderingIntent and
+ proofRenderingIntent to determine what to do with out-of-gamut
+ colors. This is known as "soft-proofing". It will ONLY work for
+ converting images that are in inMode to images that are in outMode
+ color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.).
+
+ Usage of the resulting transform object is exactly the same as with
+ ImageCms.buildTransform().
+
+ Proof profiling is generally used when using an output device to get a
+ good idea of what the final printed/displayed image would look like on
+ the proofProfile device when it's quicker and easier to use the
+ output device for judging color. Generally, this means that the
+ output device is a monitor, or a dye-sub printer (etc.), and the simulated
+ device is something more expensive, complicated, or time consuming
+ (making it difficult to make a real print for color judgement purposes).
+
+ Soft-proofing basically functions by adjusting the colors on the
+ output device to match the colors of the device being simulated. However,
+ when the simulated device has a much wider gamut than the output
+ device, you may obtain marginal results.
+
+ :param inputProfile: String, as a valid filename path to the ICC input
+ profile you wish to use for this transform, or a profile object
+ :param outputProfile: String, as a valid filename path to the ICC output
+ (monitor, usually) profile you wish to use for this transform, or a
+ profile object
+ :param proofProfile: String, as a valid filename path to the ICC proof
+ profile you wish to use for this transform, or a profile object
+ :param inMode: String, as a valid PIL mode that the appropriate profile
+ also supports (i.e. "RGB", "RGBA", "CMYK", etc.)
+ :param outMode: String, as a valid PIL mode that the appropriate profile
+ also supports (i.e. "RGB", "RGBA", "CMYK", etc.)
+ :param renderingIntent: Integer (0-3) specifying the rendering intent you
+ wish to use for the input->proof (simulated) transform
+
+ ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)
+ ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1
+ ImageCms.INTENT_SATURATION = 2
+ ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3
+
+ see the pyCMS documentation for details on rendering intents and what
+ they do.
+ :param proofRenderingIntent: Integer (0-3) specifying the rendering intent
+ you wish to use for proof->output transform
+
+ ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)
+ ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1
+ ImageCms.INTENT_SATURATION = 2
+ ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3
+
+ see the pyCMS documentation for details on rendering intents and what
+ they do.
+ :param flags: Integer (0-...) specifying additional flags
+ :returns: A CmsTransform class object.
+ :exception PyCMSError:
+ """
+
+ if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3):
+ raise PyCMSError("renderingIntent must be an integer between 0 and 3")
+
+ if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG):
+ raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG)
+
+ try:
+ if not isinstance(inputProfile, ImageCmsProfile):
+ inputProfile = ImageCmsProfile(inputProfile)
+ if not isinstance(outputProfile, ImageCmsProfile):
+ outputProfile = ImageCmsProfile(outputProfile)
+ if not isinstance(proofProfile, ImageCmsProfile):
+ proofProfile = ImageCmsProfile(proofProfile)
+ return ImageCmsTransform(
+ inputProfile,
+ outputProfile,
+ inMode,
+ outMode,
+ renderingIntent,
+ proofProfile,
+ proofRenderingIntent,
+ flags,
+ )
+ except (OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+buildTransformFromOpenProfiles = buildTransform
+buildProofTransformFromOpenProfiles = buildProofTransform
+
+
+def applyTransform(im, transform, inPlace=False):
+ """
+ (pyCMS) Applies a transform to a given image.
+
+ If im.mode != transform.inMode, a PyCMSError is raised.
+
+ If inPlace is True and transform.inMode != transform.outMode, a
+ PyCMSError is raised.
+
+ If im.mode, transform.inMode, or transform.outMode is not supported by
+ pyCMSdll or the profiles you used for the transform, a PyCMSError is
+ raised.
+
+ If an error occurs while the transform is being applied, a PyCMSError
+ is raised.
+
+ This function applies a pre-calculated transform (from
+ ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles())
+ to an image. The transform can be used for multiple images, saving
+ considerable calculation time if doing the same conversion multiple times.
+
+ If you want to modify im in-place instead of receiving a new image as
+ the return value, set inPlace to True. This can only be done if
+ transform.inMode and transform.outMode are the same, because we can't
+ change the mode in-place (the buffer sizes for some modes are
+ different). The default behavior is to return a new Image object of
+ the same dimensions in mode transform.outMode.
+
+ :param im: A PIL Image object, and im.mode must be the same as the inMode
+ supported by the transform.
+ :param transform: A valid CmsTransform class object
+ :param inPlace: Bool. If True, im is modified in place and None is
+ returned, if False, a new Image object with the transform applied is
+ returned (and im is not changed). The default is False.
+ :returns: Either None, or a new PIL Image object, depending on the value of
+ inPlace. The profile will be returned in the image's
+ info['icc_profile'].
+ :exception PyCMSError:
+ """
+
+ try:
+ if inPlace:
+ transform.apply_in_place(im)
+ imOut = None
+ else:
+ imOut = transform.apply(im)
+ except (TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+ return imOut
+
+
+def createProfile(colorSpace, colorTemp=-1):
+ """
+ (pyCMS) Creates a profile.
+
+ If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised
+
+ If using LAB and colorTemp != a positive integer, a PyCMSError is raised.
+
+ If an error occurs while creating the profile, a PyCMSError is raised.
+
+ Use this function to create common profiles on-the-fly instead of
+ having to supply a profile on disk and knowing the path to it. It
+ returns a normal CmsProfile object that can be passed to
+ ImageCms.buildTransformFromOpenProfiles() to create a transform to apply
+ to images.
+
+ :param colorSpace: String, the color space of the profile you wish to
+ create.
+ Currently only "LAB", "XYZ", and "sRGB" are supported.
+ :param colorTemp: Positive integer for the white point for the profile, in
+ degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50
+ illuminant if omitted (5000k). colorTemp is ONLY applied to LAB
+ profiles, and is ignored for XYZ and sRGB.
+ :returns: A CmsProfile class object
+ :exception PyCMSError:
+ """
+
+ if colorSpace not in ["LAB", "XYZ", "sRGB"]:
+ raise PyCMSError(
+ "Color space not supported for on-the-fly profile creation (%s)"
+ % colorSpace
+ )
+
+ if colorSpace == "LAB":
+ try:
+ colorTemp = float(colorTemp)
+ except (TypeError, ValueError):
+ raise PyCMSError(
+ 'Color temperature must be numeric, "%s" not valid' % colorTemp
+ )
+
+ try:
+ return core.createProfile(colorSpace, colorTemp)
+ except (TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def getProfileName(profile):
+ """
+
+ (pyCMS) Gets the internal product name for the given profile.
+
+ If profile isn't a valid CmsProfile object or filename to a profile,
+ a PyCMSError is raised If an error occurs while trying to obtain the
+ name tag, a PyCMSError is raised.
+
+ Use this function to obtain the INTERNAL name of the profile (stored
+ in an ICC tag in the profile itself), usually the one used when the
+ profile was originally created. Sometimes this tag also contains
+ additional information supplied by the creator.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :returns: A string containing the internal name of the profile as stored
+ in an ICC tag.
+ :exception PyCMSError:
+ """
+
+ try:
+ # add an extra newline to preserve pyCMS compatibility
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ # do it in python, not c.
+ # // name was "%s - %s" (model, manufacturer) || Description ,
+ # // but if the Model and Manufacturer were the same or the model
+ # // was long, Just the model, in 1.x
+ model = profile.profile.model
+ manufacturer = profile.profile.manufacturer
+
+ if not (model or manufacturer):
+ return (profile.profile.profile_description or "") + "\n"
+ if not manufacturer or len(model) > 30:
+ return model + "\n"
+ return "{} - {}\n".format(model, manufacturer)
+
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def getProfileInfo(profile):
+ """
+ (pyCMS) Gets the internal product information for the given profile.
+
+ If profile isn't a valid CmsProfile object or filename to a profile,
+ a PyCMSError is raised.
+
+ If an error occurs while trying to obtain the info tag, a PyCMSError
+ is raised
+
+ Use this function to obtain the information stored in the profile's
+ info tag. This often contains details about the profile, and how it
+ was created, as supplied by the creator.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :returns: A string containing the internal profile information stored in
+ an ICC tag.
+ :exception PyCMSError:
+ """
+
+ try:
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ # add an extra newline to preserve pyCMS compatibility
+ # Python, not C. the white point bits weren't working well,
+ # so skipping.
+ # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint
+ description = profile.profile.profile_description
+ cpright = profile.profile.copyright
+ arr = []
+ for elt in (description, cpright):
+ if elt:
+ arr.append(elt)
+ return "\r\n\r\n".join(arr) + "\r\n\r\n"
+
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def getProfileCopyright(profile):
+ """
+ (pyCMS) Gets the copyright for the given profile.
+
+ If profile isn't a valid CmsProfile object or filename to a profile,
+ a PyCMSError is raised.
+
+ If an error occurs while trying to obtain the copyright tag, a PyCMSError
+ is raised
+
+ Use this function to obtain the information stored in the profile's
+ copyright tag.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :returns: A string containing the internal profile information stored in
+ an ICC tag.
+ :exception PyCMSError:
+ """
+ try:
+ # add an extra newline to preserve pyCMS compatibility
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ return (profile.profile.copyright or "") + "\n"
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def getProfileManufacturer(profile):
+ """
+ (pyCMS) Gets the manufacturer for the given profile.
+
+ If profile isn't a valid CmsProfile object or filename to a profile,
+ a PyCMSError is raised.
+
+ If an error occurs while trying to obtain the manufacturer tag, a
+ PyCMSError is raised
+
+ Use this function to obtain the information stored in the profile's
+ manufacturer tag.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :returns: A string containing the internal profile information stored in
+ an ICC tag.
+ :exception PyCMSError:
+ """
+ try:
+ # add an extra newline to preserve pyCMS compatibility
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ return (profile.profile.manufacturer or "") + "\n"
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def getProfileModel(profile):
+ """
+ (pyCMS) Gets the model for the given profile.
+
+ If profile isn't a valid CmsProfile object or filename to a profile,
+ a PyCMSError is raised.
+
+ If an error occurs while trying to obtain the model tag, a PyCMSError
+ is raised
+
+ Use this function to obtain the information stored in the profile's
+ model tag.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :returns: A string containing the internal profile information stored in
+ an ICC tag.
+ :exception PyCMSError:
+ """
+
+ try:
+ # add an extra newline to preserve pyCMS compatibility
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ return (profile.profile.model or "") + "\n"
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def getProfileDescription(profile):
+ """
+ (pyCMS) Gets the description for the given profile.
+
+ If profile isn't a valid CmsProfile object or filename to a profile,
+ a PyCMSError is raised.
+
+ If an error occurs while trying to obtain the description tag, a PyCMSError
+ is raised
+
+ Use this function to obtain the information stored in the profile's
+ description tag.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :returns: A string containing the internal profile information stored in an
+ ICC tag.
+ :exception PyCMSError:
+ """
+
+ try:
+ # add an extra newline to preserve pyCMS compatibility
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ return (profile.profile.profile_description or "") + "\n"
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def getDefaultIntent(profile):
+ """
+ (pyCMS) Gets the default intent name for the given profile.
+
+ If profile isn't a valid CmsProfile object or filename to a profile,
+ a PyCMSError is raised.
+
+ If an error occurs while trying to obtain the default intent, a
+ PyCMSError is raised.
+
+ Use this function to determine the default (and usually best optimized)
+ rendering intent for this profile. Most profiles support multiple
+ rendering intents, but are intended mostly for one type of conversion.
+ If you wish to use a different intent than returned, use
+ ImageCms.isIntentSupported() to verify it will work first.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :returns: Integer 0-3 specifying the default rendering intent for this
+ profile.
+
+ ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)
+ ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1
+ ImageCms.INTENT_SATURATION = 2
+ ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3
+
+ see the pyCMS documentation for details on rendering intents and what
+ they do.
+ :exception PyCMSError:
+ """
+
+ try:
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ return profile.profile.rendering_intent
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def isIntentSupported(profile, intent, direction):
+ """
+ (pyCMS) Checks if a given intent is supported.
+
+ Use this function to verify that you can use your desired
+ renderingIntent with profile, and that profile can be used for the
+ input/output/proof profile as you desire.
+
+ Some profiles are created specifically for one "direction", can cannot
+ be used for others. Some profiles can only be used for certain
+ rendering intents... so it's best to either verify this before trying
+ to create a transform with them (using this function), or catch the
+ potential PyCMSError that will occur if they don't support the modes
+ you select.
+
+ :param profile: EITHER a valid CmsProfile object, OR a string of the
+ filename of an ICC profile.
+ :param intent: Integer (0-3) specifying the rendering intent you wish to
+ use with this profile
+
+ ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT)
+ ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1
+ ImageCms.INTENT_SATURATION = 2
+ ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3
+
+ see the pyCMS documentation for details on rendering intents and what
+ they do.
+ :param direction: Integer specifying if the profile is to be used for
+ input, output, or proof
+
+ INPUT = 0 (or use ImageCms.DIRECTION_INPUT)
+ OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT)
+ PROOF = 2 (or use ImageCms.DIRECTION_PROOF)
+
+ :returns: 1 if the intent/direction are supported, -1 if they are not.
+ :exception PyCMSError:
+ """
+
+ try:
+ if not isinstance(profile, ImageCmsProfile):
+ profile = ImageCmsProfile(profile)
+ # FIXME: I get different results for the same data w. different
+ # compilers. Bug in LittleCMS or in the binding?
+ if profile.profile.is_intent_supported(intent, direction):
+ return 1
+ else:
+ return -1
+ except (AttributeError, OSError, TypeError, ValueError) as v:
+ raise PyCMSError(v)
+
+
+def versions():
+ """
+ (pyCMS) Fetches versions.
+ """
+
+ return (VERSION, core.littlecms_version, sys.version.split()[0], Image.__version__)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageColor.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageColor.py
new file mode 100644
index 0000000..9cf7a99
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageColor.py
@@ -0,0 +1,300 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# map CSS3-style colour description strings to RGB
+#
+# History:
+# 2002-10-24 fl Added support for CSS-style color strings
+# 2002-12-15 fl Added RGBA support
+# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2
+# 2004-07-19 fl Fixed gray/grey spelling issues
+# 2009-03-05 fl Fixed rounding error in grayscale calculation
+#
+# Copyright (c) 2002-2004 by Secret Labs AB
+# Copyright (c) 2002-2004 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import re
+
+from . import Image
+
+
+def getrgb(color):
+ """
+ Convert a color string to an RGB tuple. If the string cannot be parsed,
+ this function raises a :py:exc:`ValueError` exception.
+
+ .. versionadded:: 1.1.4
+
+ :param color: A color string
+ :return: ``(red, green, blue[, alpha])``
+ """
+ color = color.lower()
+
+ rgb = colormap.get(color, None)
+ if rgb:
+ if isinstance(rgb, tuple):
+ return rgb
+ colormap[color] = rgb = getrgb(rgb)
+ return rgb
+
+ # check for known string formats
+ if re.match("#[a-f0-9]{3}$", color):
+ return (int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16))
+
+ if re.match("#[a-f0-9]{4}$", color):
+ return (
+ int(color[1] * 2, 16),
+ int(color[2] * 2, 16),
+ int(color[3] * 2, 16),
+ int(color[4] * 2, 16),
+ )
+
+ if re.match("#[a-f0-9]{6}$", color):
+ return (int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16))
+
+ if re.match("#[a-f0-9]{8}$", color):
+ return (
+ int(color[1:3], 16),
+ int(color[3:5], 16),
+ int(color[5:7], 16),
+ int(color[7:9], 16),
+ )
+
+ m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color)
+ if m:
+ return (int(m.group(1)), int(m.group(2)), int(m.group(3)))
+
+ m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color)
+ if m:
+ return (
+ int((int(m.group(1)) * 255) / 100.0 + 0.5),
+ int((int(m.group(2)) * 255) / 100.0 + 0.5),
+ int((int(m.group(3)) * 255) / 100.0 + 0.5),
+ )
+
+ m = re.match(
+ r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color
+ )
+ if m:
+ from colorsys import hls_to_rgb
+
+ rgb = hls_to_rgb(
+ float(m.group(1)) / 360.0,
+ float(m.group(3)) / 100.0,
+ float(m.group(2)) / 100.0,
+ )
+ return (
+ int(rgb[0] * 255 + 0.5),
+ int(rgb[1] * 255 + 0.5),
+ int(rgb[2] * 255 + 0.5),
+ )
+
+ m = re.match(
+ r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color
+ )
+ if m:
+ from colorsys import hsv_to_rgb
+
+ rgb = hsv_to_rgb(
+ float(m.group(1)) / 360.0,
+ float(m.group(2)) / 100.0,
+ float(m.group(3)) / 100.0,
+ )
+ return (
+ int(rgb[0] * 255 + 0.5),
+ int(rgb[1] * 255 + 0.5),
+ int(rgb[2] * 255 + 0.5),
+ )
+
+ m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color)
+ if m:
+ return (int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)))
+ raise ValueError("unknown color specifier: %r" % color)
+
+
+def getcolor(color, mode):
+ """
+ Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a
+ greyscale value if the mode is not color or a palette image. If the string
+ cannot be parsed, this function raises a :py:exc:`ValueError` exception.
+
+ .. versionadded:: 1.1.4
+
+ :param color: A color string
+ :return: ``(graylevel [, alpha]) or (red, green, blue[, alpha])``
+ """
+ # same as getrgb, but converts the result to the given mode
+ color, alpha = getrgb(color), 255
+ if len(color) == 4:
+ color, alpha = color[0:3], color[3]
+
+ if Image.getmodebase(mode) == "L":
+ r, g, b = color
+ # ITU-R Recommendation 601-2 for nonlinear RGB
+ # scaled to 24 bits to match the convert's implementation.
+ color = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16
+ if mode[-1] == "A":
+ return (color, alpha)
+ else:
+ if mode[-1] == "A":
+ return color + (alpha,)
+ return color
+
+
+colormap = {
+ # X11 colour table from https://drafts.csswg.org/css-color-4/, with
+ # gray/grey spelling issues fixed. This is a superset of HTML 4.0
+ # colour names used in CSS 1.
+ "aliceblue": "#f0f8ff",
+ "antiquewhite": "#faebd7",
+ "aqua": "#00ffff",
+ "aquamarine": "#7fffd4",
+ "azure": "#f0ffff",
+ "beige": "#f5f5dc",
+ "bisque": "#ffe4c4",
+ "black": "#000000",
+ "blanchedalmond": "#ffebcd",
+ "blue": "#0000ff",
+ "blueviolet": "#8a2be2",
+ "brown": "#a52a2a",
+ "burlywood": "#deb887",
+ "cadetblue": "#5f9ea0",
+ "chartreuse": "#7fff00",
+ "chocolate": "#d2691e",
+ "coral": "#ff7f50",
+ "cornflowerblue": "#6495ed",
+ "cornsilk": "#fff8dc",
+ "crimson": "#dc143c",
+ "cyan": "#00ffff",
+ "darkblue": "#00008b",
+ "darkcyan": "#008b8b",
+ "darkgoldenrod": "#b8860b",
+ "darkgray": "#a9a9a9",
+ "darkgrey": "#a9a9a9",
+ "darkgreen": "#006400",
+ "darkkhaki": "#bdb76b",
+ "darkmagenta": "#8b008b",
+ "darkolivegreen": "#556b2f",
+ "darkorange": "#ff8c00",
+ "darkorchid": "#9932cc",
+ "darkred": "#8b0000",
+ "darksalmon": "#e9967a",
+ "darkseagreen": "#8fbc8f",
+ "darkslateblue": "#483d8b",
+ "darkslategray": "#2f4f4f",
+ "darkslategrey": "#2f4f4f",
+ "darkturquoise": "#00ced1",
+ "darkviolet": "#9400d3",
+ "deeppink": "#ff1493",
+ "deepskyblue": "#00bfff",
+ "dimgray": "#696969",
+ "dimgrey": "#696969",
+ "dodgerblue": "#1e90ff",
+ "firebrick": "#b22222",
+ "floralwhite": "#fffaf0",
+ "forestgreen": "#228b22",
+ "fuchsia": "#ff00ff",
+ "gainsboro": "#dcdcdc",
+ "ghostwhite": "#f8f8ff",
+ "gold": "#ffd700",
+ "goldenrod": "#daa520",
+ "gray": "#808080",
+ "grey": "#808080",
+ "green": "#008000",
+ "greenyellow": "#adff2f",
+ "honeydew": "#f0fff0",
+ "hotpink": "#ff69b4",
+ "indianred": "#cd5c5c",
+ "indigo": "#4b0082",
+ "ivory": "#fffff0",
+ "khaki": "#f0e68c",
+ "lavender": "#e6e6fa",
+ "lavenderblush": "#fff0f5",
+ "lawngreen": "#7cfc00",
+ "lemonchiffon": "#fffacd",
+ "lightblue": "#add8e6",
+ "lightcoral": "#f08080",
+ "lightcyan": "#e0ffff",
+ "lightgoldenrodyellow": "#fafad2",
+ "lightgreen": "#90ee90",
+ "lightgray": "#d3d3d3",
+ "lightgrey": "#d3d3d3",
+ "lightpink": "#ffb6c1",
+ "lightsalmon": "#ffa07a",
+ "lightseagreen": "#20b2aa",
+ "lightskyblue": "#87cefa",
+ "lightslategray": "#778899",
+ "lightslategrey": "#778899",
+ "lightsteelblue": "#b0c4de",
+ "lightyellow": "#ffffe0",
+ "lime": "#00ff00",
+ "limegreen": "#32cd32",
+ "linen": "#faf0e6",
+ "magenta": "#ff00ff",
+ "maroon": "#800000",
+ "mediumaquamarine": "#66cdaa",
+ "mediumblue": "#0000cd",
+ "mediumorchid": "#ba55d3",
+ "mediumpurple": "#9370db",
+ "mediumseagreen": "#3cb371",
+ "mediumslateblue": "#7b68ee",
+ "mediumspringgreen": "#00fa9a",
+ "mediumturquoise": "#48d1cc",
+ "mediumvioletred": "#c71585",
+ "midnightblue": "#191970",
+ "mintcream": "#f5fffa",
+ "mistyrose": "#ffe4e1",
+ "moccasin": "#ffe4b5",
+ "navajowhite": "#ffdead",
+ "navy": "#000080",
+ "oldlace": "#fdf5e6",
+ "olive": "#808000",
+ "olivedrab": "#6b8e23",
+ "orange": "#ffa500",
+ "orangered": "#ff4500",
+ "orchid": "#da70d6",
+ "palegoldenrod": "#eee8aa",
+ "palegreen": "#98fb98",
+ "paleturquoise": "#afeeee",
+ "palevioletred": "#db7093",
+ "papayawhip": "#ffefd5",
+ "peachpuff": "#ffdab9",
+ "peru": "#cd853f",
+ "pink": "#ffc0cb",
+ "plum": "#dda0dd",
+ "powderblue": "#b0e0e6",
+ "purple": "#800080",
+ "rebeccapurple": "#663399",
+ "red": "#ff0000",
+ "rosybrown": "#bc8f8f",
+ "royalblue": "#4169e1",
+ "saddlebrown": "#8b4513",
+ "salmon": "#fa8072",
+ "sandybrown": "#f4a460",
+ "seagreen": "#2e8b57",
+ "seashell": "#fff5ee",
+ "sienna": "#a0522d",
+ "silver": "#c0c0c0",
+ "skyblue": "#87ceeb",
+ "slateblue": "#6a5acd",
+ "slategray": "#708090",
+ "slategrey": "#708090",
+ "snow": "#fffafa",
+ "springgreen": "#00ff7f",
+ "steelblue": "#4682b4",
+ "tan": "#d2b48c",
+ "teal": "#008080",
+ "thistle": "#d8bfd8",
+ "tomato": "#ff6347",
+ "turquoise": "#40e0d0",
+ "violet": "#ee82ee",
+ "wheat": "#f5deb3",
+ "white": "#ffffff",
+ "whitesmoke": "#f5f5f5",
+ "yellow": "#ffff00",
+ "yellowgreen": "#9acd32",
+}
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageDraw.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageDraw.py
new file mode 100644
index 0000000..7abd459
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageDraw.py
@@ -0,0 +1,564 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# drawing interface operations
+#
+# History:
+# 1996-04-13 fl Created (experimental)
+# 1996-08-07 fl Filled polygons, ellipses.
+# 1996-08-13 fl Added text support
+# 1998-06-28 fl Handle I and F images
+# 1998-12-29 fl Added arc; use arc primitive to draw ellipses
+# 1999-01-10 fl Added shape stuff (experimental)
+# 1999-02-06 fl Added bitmap support
+# 1999-02-11 fl Changed all primitives to take options
+# 1999-02-20 fl Fixed backwards compatibility
+# 2000-10-12 fl Copy on write, when necessary
+# 2001-02-18 fl Use default ink for bitmap/text also in fill mode
+# 2002-10-24 fl Added support for CSS-style color strings
+# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing
+# 2002-12-11 fl Refactored low-level drawing API (work in progress)
+# 2004-08-26 fl Made Draw() a factory function, added getdraw() support
+# 2004-09-04 fl Added width support to line primitive
+# 2004-09-10 fl Added font mode handling
+# 2006-06-19 fl Added font bearing support (getmask2)
+#
+# Copyright (c) 1997-2006 by Secret Labs AB
+# Copyright (c) 1996-2006 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import math
+import numbers
+
+from . import Image, ImageColor
+
+
+"""
+A simple 2D drawing interface for PIL images.
+
+Application code should use the Draw factory, instead of
+directly.
+"""
+
+
+class ImageDraw:
+ def __init__(self, im, mode=None):
+ """
+ Create a drawing instance.
+
+ :param im: The image to draw in.
+ :param mode: Optional mode to use for color values. For RGB
+ images, this argument can be RGB or RGBA (to blend the
+ drawing into the image). For all other modes, this argument
+ must be the same as the image mode. If omitted, the mode
+ defaults to the mode of the image.
+ """
+ im.load()
+ if im.readonly:
+ im._copy() # make it writeable
+ blend = 0
+ if mode is None:
+ mode = im.mode
+ if mode != im.mode:
+ if mode == "RGBA" and im.mode == "RGB":
+ blend = 1
+ else:
+ raise ValueError("mode mismatch")
+ if mode == "P":
+ self.palette = im.palette
+ else:
+ self.palette = None
+ self.im = im.im
+ self.draw = Image.core.draw(self.im, blend)
+ self.mode = mode
+ if mode in ("I", "F"):
+ self.ink = self.draw.draw_ink(1)
+ else:
+ self.ink = self.draw.draw_ink(-1)
+ if mode in ("1", "P", "I", "F"):
+ # FIXME: fix Fill2 to properly support matte for I+F images
+ self.fontmode = "1"
+ else:
+ self.fontmode = "L" # aliasing is okay for other modes
+ self.fill = 0
+ self.font = None
+
+ def getfont(self):
+ """
+ Get the current default font.
+
+ :returns: An image font."""
+ if not self.font:
+ # FIXME: should add a font repository
+ from . import ImageFont
+
+ self.font = ImageFont.load_default()
+ return self.font
+
+ def _getink(self, ink, fill=None):
+ if ink is None and fill is None:
+ if self.fill:
+ fill = self.ink
+ else:
+ ink = self.ink
+ else:
+ if ink is not None:
+ if isinstance(ink, str):
+ ink = ImageColor.getcolor(ink, self.mode)
+ if self.palette and not isinstance(ink, numbers.Number):
+ ink = self.palette.getcolor(ink)
+ ink = self.draw.draw_ink(ink)
+ if fill is not None:
+ if isinstance(fill, str):
+ fill = ImageColor.getcolor(fill, self.mode)
+ if self.palette and not isinstance(fill, numbers.Number):
+ fill = self.palette.getcolor(fill)
+ fill = self.draw.draw_ink(fill)
+ return ink, fill
+
+ def arc(self, xy, start, end, fill=None, width=0):
+ """Draw an arc."""
+ ink, fill = self._getink(fill)
+ if ink is not None:
+ self.draw.draw_arc(xy, start, end, ink, width)
+
+ def bitmap(self, xy, bitmap, fill=None):
+ """Draw a bitmap."""
+ bitmap.load()
+ ink, fill = self._getink(fill)
+ if ink is None:
+ ink = fill
+ if ink is not None:
+ self.draw.draw_bitmap(xy, bitmap.im, ink)
+
+ def chord(self, xy, start, end, fill=None, outline=None, width=1):
+ """Draw a chord."""
+ ink, fill = self._getink(outline, fill)
+ if fill is not None:
+ self.draw.draw_chord(xy, start, end, fill, 1)
+ if ink is not None and ink != fill and width != 0:
+ self.draw.draw_chord(xy, start, end, ink, 0, width)
+
+ def ellipse(self, xy, fill=None, outline=None, width=1):
+ """Draw an ellipse."""
+ ink, fill = self._getink(outline, fill)
+ if fill is not None:
+ self.draw.draw_ellipse(xy, fill, 1)
+ if ink is not None and ink != fill and width != 0:
+ self.draw.draw_ellipse(xy, ink, 0, width)
+
+ def line(self, xy, fill=None, width=0, joint=None):
+ """Draw a line, or a connected sequence of line segments."""
+ ink = self._getink(fill)[0]
+ if ink is not None:
+ self.draw.draw_lines(xy, ink, width)
+ if joint == "curve" and width > 4:
+ for i in range(1, len(xy) - 1):
+ point = xy[i]
+ angles = [
+ math.degrees(math.atan2(end[0] - start[0], start[1] - end[1]))
+ % 360
+ for start, end in ((xy[i - 1], point), (point, xy[i + 1]))
+ ]
+ if angles[0] == angles[1]:
+ # This is a straight line, so no joint is required
+ continue
+
+ def coord_at_angle(coord, angle):
+ x, y = coord
+ angle -= 90
+ distance = width / 2 - 1
+ return tuple(
+ [
+ p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d))
+ for p, p_d in (
+ (x, distance * math.cos(math.radians(angle))),
+ (y, distance * math.sin(math.radians(angle))),
+ )
+ ]
+ )
+
+ flipped = (
+ angles[1] > angles[0] and angles[1] - 180 > angles[0]
+ ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0])
+ coords = [
+ (point[0] - width / 2 + 1, point[1] - width / 2 + 1),
+ (point[0] + width / 2 - 1, point[1] + width / 2 - 1),
+ ]
+ if flipped:
+ start, end = (angles[1] + 90, angles[0] + 90)
+ else:
+ start, end = (angles[0] - 90, angles[1] - 90)
+ self.pieslice(coords, start - 90, end - 90, fill)
+
+ if width > 8:
+ # Cover potential gaps between the line and the joint
+ if flipped:
+ gapCoords = [
+ coord_at_angle(point, angles[0] + 90),
+ point,
+ coord_at_angle(point, angles[1] + 90),
+ ]
+ else:
+ gapCoords = [
+ coord_at_angle(point, angles[0] - 90),
+ point,
+ coord_at_angle(point, angles[1] - 90),
+ ]
+ self.line(gapCoords, fill, width=3)
+
+ def shape(self, shape, fill=None, outline=None):
+ """(Experimental) Draw a shape."""
+ shape.close()
+ ink, fill = self._getink(outline, fill)
+ if fill is not None:
+ self.draw.draw_outline(shape, fill, 1)
+ if ink is not None and ink != fill:
+ self.draw.draw_outline(shape, ink, 0)
+
+ def pieslice(self, xy, start, end, fill=None, outline=None, width=1):
+ """Draw a pieslice."""
+ ink, fill = self._getink(outline, fill)
+ if fill is not None:
+ self.draw.draw_pieslice(xy, start, end, fill, 1)
+ if ink is not None and ink != fill and width != 0:
+ self.draw.draw_pieslice(xy, start, end, ink, 0, width)
+
+ def point(self, xy, fill=None):
+ """Draw one or more individual pixels."""
+ ink, fill = self._getink(fill)
+ if ink is not None:
+ self.draw.draw_points(xy, ink)
+
+ def polygon(self, xy, fill=None, outline=None):
+ """Draw a polygon."""
+ ink, fill = self._getink(outline, fill)
+ if fill is not None:
+ self.draw.draw_polygon(xy, fill, 1)
+ if ink is not None and ink != fill:
+ self.draw.draw_polygon(xy, ink, 0)
+
+ def rectangle(self, xy, fill=None, outline=None, width=1):
+ """Draw a rectangle."""
+ ink, fill = self._getink(outline, fill)
+ if fill is not None:
+ self.draw.draw_rectangle(xy, fill, 1)
+ if ink is not None and ink != fill and width != 0:
+ self.draw.draw_rectangle(xy, ink, 0, width)
+
+ def _multiline_check(self, text):
+ """Draw text."""
+ split_character = "\n" if isinstance(text, str) else b"\n"
+
+ return split_character in text
+
+ def _multiline_split(self, text):
+ split_character = "\n" if isinstance(text, str) else b"\n"
+
+ return text.split(split_character)
+
+ def text(
+ self,
+ xy,
+ text,
+ fill=None,
+ font=None,
+ anchor=None,
+ spacing=4,
+ align="left",
+ direction=None,
+ features=None,
+ language=None,
+ stroke_width=0,
+ stroke_fill=None,
+ *args,
+ **kwargs
+ ):
+ if self._multiline_check(text):
+ return self.multiline_text(
+ xy,
+ text,
+ fill,
+ font,
+ anchor,
+ spacing,
+ align,
+ direction,
+ features,
+ language,
+ stroke_width,
+ stroke_fill,
+ )
+
+ if font is None:
+ font = self.getfont()
+
+ def getink(fill):
+ ink, fill = self._getink(fill)
+ if ink is None:
+ return fill
+ return ink
+
+ def draw_text(ink, stroke_width=0, stroke_offset=None):
+ coord = xy
+ try:
+ mask, offset = font.getmask2(
+ text,
+ self.fontmode,
+ direction=direction,
+ features=features,
+ language=language,
+ stroke_width=stroke_width,
+ *args,
+ **kwargs,
+ )
+ coord = coord[0] + offset[0], coord[1] + offset[1]
+ except AttributeError:
+ try:
+ mask = font.getmask(
+ text,
+ self.fontmode,
+ direction,
+ features,
+ language,
+ stroke_width,
+ *args,
+ **kwargs,
+ )
+ except TypeError:
+ mask = font.getmask(text)
+ if stroke_offset:
+ coord = coord[0] + stroke_offset[0], coord[1] + stroke_offset[1]
+ self.draw.draw_bitmap(coord, mask, ink)
+
+ ink = getink(fill)
+ if ink is not None:
+ stroke_ink = None
+ if stroke_width:
+ stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink
+
+ if stroke_ink is not None:
+ # Draw stroked text
+ draw_text(stroke_ink, stroke_width)
+
+ # Draw normal text
+ draw_text(ink, 0, (stroke_width, stroke_width))
+ else:
+ # Only draw normal text
+ draw_text(ink)
+
+ def multiline_text(
+ self,
+ xy,
+ text,
+ fill=None,
+ font=None,
+ anchor=None,
+ spacing=4,
+ align="left",
+ direction=None,
+ features=None,
+ language=None,
+ stroke_width=0,
+ stroke_fill=None,
+ ):
+ widths = []
+ max_width = 0
+ lines = self._multiline_split(text)
+ line_spacing = (
+ self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing
+ )
+ for line in lines:
+ line_width, line_height = self.textsize(
+ line,
+ font,
+ direction=direction,
+ features=features,
+ language=language,
+ stroke_width=stroke_width,
+ )
+ widths.append(line_width)
+ max_width = max(max_width, line_width)
+ left, top = xy
+ for idx, line in enumerate(lines):
+ if align == "left":
+ pass # left = x
+ elif align == "center":
+ left += (max_width - widths[idx]) / 2.0
+ elif align == "right":
+ left += max_width - widths[idx]
+ else:
+ raise ValueError('align must be "left", "center" or "right"')
+ self.text(
+ (left, top),
+ line,
+ fill,
+ font,
+ anchor,
+ direction=direction,
+ features=features,
+ language=language,
+ stroke_width=stroke_width,
+ stroke_fill=stroke_fill,
+ )
+ top += line_spacing
+ left = xy[0]
+
+ def textsize(
+ self,
+ text,
+ font=None,
+ spacing=4,
+ direction=None,
+ features=None,
+ language=None,
+ stroke_width=0,
+ ):
+ """Get the size of a given string, in pixels."""
+ if self._multiline_check(text):
+ return self.multiline_textsize(
+ text, font, spacing, direction, features, language, stroke_width
+ )
+
+ if font is None:
+ font = self.getfont()
+ return font.getsize(text, direction, features, language, stroke_width)
+
+ def multiline_textsize(
+ self,
+ text,
+ font=None,
+ spacing=4,
+ direction=None,
+ features=None,
+ language=None,
+ stroke_width=0,
+ ):
+ max_width = 0
+ lines = self._multiline_split(text)
+ line_spacing = (
+ self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing
+ )
+ for line in lines:
+ line_width, line_height = self.textsize(
+ line, font, spacing, direction, features, language, stroke_width
+ )
+ max_width = max(max_width, line_width)
+ return max_width, len(lines) * line_spacing - spacing
+
+
+def Draw(im, mode=None):
+ """
+ A simple 2D drawing interface for PIL images.
+
+ :param im: The image to draw in.
+ :param mode: Optional mode to use for color values. For RGB
+ images, this argument can be RGB or RGBA (to blend the
+ drawing into the image). For all other modes, this argument
+ must be the same as the image mode. If omitted, the mode
+ defaults to the mode of the image.
+ """
+ try:
+ return im.getdraw(mode)
+ except AttributeError:
+ return ImageDraw(im, mode)
+
+
+# experimental access to the outline API
+try:
+ Outline = Image.core.outline
+except AttributeError:
+ Outline = None
+
+
+def getdraw(im=None, hints=None):
+ """
+ (Experimental) A more advanced 2D drawing interface for PIL images,
+ based on the WCK interface.
+
+ :param im: The image to draw in.
+ :param hints: An optional list of hints.
+ :returns: A (drawing context, drawing resource factory) tuple.
+ """
+ # FIXME: this needs more work!
+ # FIXME: come up with a better 'hints' scheme.
+ handler = None
+ if not hints or "nicest" in hints:
+ try:
+ from . import _imagingagg as handler
+ except ImportError:
+ pass
+ if handler is None:
+ from . import ImageDraw2 as handler
+ if im:
+ im = handler.Draw(im)
+ return im, handler
+
+
+def floodfill(image, xy, value, border=None, thresh=0):
+ """
+ (experimental) Fills a bounded region with a given color.
+
+ :param image: Target image.
+ :param xy: Seed position (a 2-item coordinate tuple). See
+ :ref:`coordinate-system`.
+ :param value: Fill color.
+ :param border: Optional border value. If given, the region consists of
+ pixels with a color different from the border color. If not given,
+ the region consists of pixels having the same color as the seed
+ pixel.
+ :param thresh: Optional threshold value which specifies a maximum
+ tolerable difference of a pixel value from the 'background' in
+ order for it to be replaced. Useful for filling regions of
+ non-homogeneous, but similar, colors.
+ """
+ # based on an implementation by Eric S. Raymond
+ # amended by yo1995 @20180806
+ pixel = image.load()
+ x, y = xy
+ try:
+ background = pixel[x, y]
+ if _color_diff(value, background) <= thresh:
+ return # seed point already has fill color
+ pixel[x, y] = value
+ except (ValueError, IndexError):
+ return # seed point outside image
+ edge = {(x, y)}
+ # use a set to keep record of current and previous edge pixels
+ # to reduce memory consumption
+ full_edge = set()
+ while edge:
+ new_edge = set()
+ for (x, y) in edge: # 4 adjacent method
+ for (s, t) in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)):
+ # If already processed, or if a coordinate is negative, skip
+ if (s, t) in full_edge or s < 0 or t < 0:
+ continue
+ try:
+ p = pixel[s, t]
+ except (ValueError, IndexError):
+ pass
+ else:
+ full_edge.add((s, t))
+ if border is None:
+ fill = _color_diff(p, background) <= thresh
+ else:
+ fill = p != value and p != border
+ if fill:
+ pixel[s, t] = value
+ new_edge.add((s, t))
+ full_edge = edge # discard pixels processed
+ edge = new_edge
+
+
+def _color_diff(color1, color2):
+ """
+ Uses 1-norm distance to calculate difference between two values.
+ """
+ if isinstance(color2, tuple):
+ return sum([abs(color1[i] - color2[i]) for i in range(0, len(color2))])
+ else:
+ return abs(color1 - color2)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageDraw2.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageDraw2.py
new file mode 100644
index 0000000..20b5fe4
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageDraw2.py
@@ -0,0 +1,107 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# WCK-style drawing interface operations
+#
+# History:
+# 2003-12-07 fl created
+# 2005-05-15 fl updated; added to PIL as ImageDraw2
+# 2005-05-15 fl added text support
+# 2005-05-20 fl added arc/chord/pieslice support
+#
+# Copyright (c) 2003-2005 by Secret Labs AB
+# Copyright (c) 2003-2005 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath
+
+
+class Pen:
+ def __init__(self, color, width=1, opacity=255):
+ self.color = ImageColor.getrgb(color)
+ self.width = width
+
+
+class Brush:
+ def __init__(self, color, opacity=255):
+ self.color = ImageColor.getrgb(color)
+
+
+class Font:
+ def __init__(self, color, file, size=12):
+ # FIXME: add support for bitmap fonts
+ self.color = ImageColor.getrgb(color)
+ self.font = ImageFont.truetype(file, size)
+
+
+class Draw:
+ def __init__(self, image, size=None, color=None):
+ if not hasattr(image, "im"):
+ image = Image.new(image, size, color)
+ self.draw = ImageDraw.Draw(image)
+ self.image = image
+ self.transform = None
+
+ def flush(self):
+ return self.image
+
+ def render(self, op, xy, pen, brush=None):
+ # handle color arguments
+ outline = fill = None
+ width = 1
+ if isinstance(pen, Pen):
+ outline = pen.color
+ width = pen.width
+ elif isinstance(brush, Pen):
+ outline = brush.color
+ width = brush.width
+ if isinstance(brush, Brush):
+ fill = brush.color
+ elif isinstance(pen, Brush):
+ fill = pen.color
+ # handle transformation
+ if self.transform:
+ xy = ImagePath.Path(xy)
+ xy.transform(self.transform)
+ # render the item
+ if op == "line":
+ self.draw.line(xy, fill=outline, width=width)
+ else:
+ getattr(self.draw, op)(xy, fill=fill, outline=outline)
+
+ def settransform(self, offset):
+ (xoffset, yoffset) = offset
+ self.transform = (1, 0, xoffset, 0, 1, yoffset)
+
+ def arc(self, xy, start, end, *options):
+ self.render("arc", xy, start, end, *options)
+
+ def chord(self, xy, start, end, *options):
+ self.render("chord", xy, start, end, *options)
+
+ def ellipse(self, xy, *options):
+ self.render("ellipse", xy, *options)
+
+ def line(self, xy, *options):
+ self.render("line", xy, *options)
+
+ def pieslice(self, xy, start, end, *options):
+ self.render("pieslice", xy, start, end, *options)
+
+ def polygon(self, xy, *options):
+ self.render("polygon", xy, *options)
+
+ def rectangle(self, xy, *options):
+ self.render("rectangle", xy, *options)
+
+ def text(self, xy, text, font):
+ if self.transform:
+ xy = ImagePath.Path(xy)
+ xy.transform(self.transform)
+ self.draw.text(xy, text, font=font.font, fill=font.color)
+
+ def textsize(self, text, font):
+ return self.draw.textsize(text, font=font.font)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageEnhance.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageEnhance.py
new file mode 100644
index 0000000..3b79d5c
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageEnhance.py
@@ -0,0 +1,103 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# image enhancement classes
+#
+# For a background, see "Image Processing By Interpolation and
+# Extrapolation", Paul Haeberli and Douglas Voorhies. Available
+# at http://www.graficaobscura.com/interp/index.html
+#
+# History:
+# 1996-03-23 fl Created
+# 2009-06-16 fl Fixed mean calculation
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1996.
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image, ImageFilter, ImageStat
+
+
+class _Enhance:
+ def enhance(self, factor):
+ """
+ Returns an enhanced image.
+
+ :param factor: A floating point value controlling the enhancement.
+ Factor 1.0 always returns a copy of the original image,
+ lower factors mean less color (brightness, contrast,
+ etc), and higher values more. There are no restrictions
+ on this value.
+ :rtype: :py:class:`~PIL.Image.Image`
+ """
+ return Image.blend(self.degenerate, self.image, factor)
+
+
+class Color(_Enhance):
+ """Adjust image color balance.
+
+ This class can be used to adjust the colour balance of an image, in
+ a manner similar to the controls on a colour TV set. An enhancement
+ factor of 0.0 gives a black and white image. A factor of 1.0 gives
+ the original image.
+ """
+
+ def __init__(self, image):
+ self.image = image
+ self.intermediate_mode = "L"
+ if "A" in image.getbands():
+ self.intermediate_mode = "LA"
+
+ self.degenerate = image.convert(self.intermediate_mode).convert(image.mode)
+
+
+class Contrast(_Enhance):
+ """Adjust image contrast.
+
+ This class can be used to control the contrast of an image, similar
+ to the contrast control on a TV set. An enhancement factor of 0.0
+ gives a solid grey image. A factor of 1.0 gives the original image.
+ """
+
+ def __init__(self, image):
+ self.image = image
+ mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5)
+ self.degenerate = Image.new("L", image.size, mean).convert(image.mode)
+
+ if "A" in image.getbands():
+ self.degenerate.putalpha(image.getchannel("A"))
+
+
+class Brightness(_Enhance):
+ """Adjust image brightness.
+
+ This class can be used to control the brightness of an image. An
+ enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the
+ original image.
+ """
+
+ def __init__(self, image):
+ self.image = image
+ self.degenerate = Image.new(image.mode, image.size, 0)
+
+ if "A" in image.getbands():
+ self.degenerate.putalpha(image.getchannel("A"))
+
+
+class Sharpness(_Enhance):
+ """Adjust image sharpness.
+
+ This class can be used to adjust the sharpness of an image. An
+ enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the
+ original image, and a factor of 2.0 gives a sharpened image.
+ """
+
+ def __init__(self, image):
+ self.image = image
+ self.degenerate = image.filter(ImageFilter.SMOOTH)
+
+ if "A" in image.getbands():
+ self.degenerate.putalpha(image.getchannel("A"))
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageFile.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageFile.py
new file mode 100644
index 0000000..6287968
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageFile.py
@@ -0,0 +1,683 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# base class for image file handlers
+#
+# history:
+# 1995-09-09 fl Created
+# 1996-03-11 fl Fixed load mechanism.
+# 1996-04-15 fl Added pcx/xbm decoders.
+# 1996-04-30 fl Added encoders.
+# 1996-12-14 fl Added load helpers
+# 1997-01-11 fl Use encode_to_file where possible
+# 1997-08-27 fl Flush output in _save
+# 1998-03-05 fl Use memory mapping for some modes
+# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B"
+# 1999-05-31 fl Added image parser
+# 2000-10-12 fl Set readonly flag on memory-mapped images
+# 2002-03-20 fl Use better messages for common decoder errors
+# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available
+# 2003-10-30 fl Added StubImageFile class
+# 2004-02-25 fl Made incremental parser more robust
+#
+# Copyright (c) 1997-2004 by Secret Labs AB
+# Copyright (c) 1995-2004 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import io
+import struct
+import sys
+
+from . import Image
+from ._util import isPath
+
+MAXBLOCK = 65536
+
+SAFEBLOCK = 1024 * 1024
+
+LOAD_TRUNCATED_IMAGES = False
+
+ERRORS = {
+ -1: "image buffer overrun error",
+ -2: "decoding error",
+ -3: "unknown error",
+ -8: "bad configuration",
+ -9: "out of memory error",
+}
+
+
+def raise_ioerror(error):
+ try:
+ message = Image.core.getcodecstatus(error)
+ except AttributeError:
+ message = ERRORS.get(error)
+ if not message:
+ message = "decoder error %d" % error
+ raise OSError(message + " when reading image file")
+
+
+#
+# --------------------------------------------------------------------
+# Helpers
+
+
+def _tilesort(t):
+ # sort on offset
+ return t[2]
+
+
+#
+# --------------------------------------------------------------------
+# ImageFile base class
+
+
+class ImageFile(Image.Image):
+ "Base class for image file format handlers."
+
+ def __init__(self, fp=None, filename=None):
+ super().__init__()
+
+ self._min_frame = 0
+
+ self.custom_mimetype = None
+
+ self.tile = None
+ self.readonly = 1 # until we know better
+
+ self.decoderconfig = ()
+ self.decodermaxblock = MAXBLOCK
+
+ if isPath(fp):
+ # filename
+ self.fp = open(fp, "rb")
+ self.filename = fp
+ self._exclusive_fp = True
+ else:
+ # stream
+ self.fp = fp
+ self.filename = filename
+ # can be overridden
+ self._exclusive_fp = None
+
+ try:
+ try:
+ self._open()
+ except (
+ IndexError, # end of data
+ TypeError, # end of data (ord)
+ KeyError, # unsupported mode
+ EOFError, # got header but not the first frame
+ struct.error,
+ ) as v:
+ raise SyntaxError(v)
+
+ if not self.mode or self.size[0] <= 0:
+ raise SyntaxError("not identified by this driver")
+ except BaseException:
+ # close the file only if we have opened it this constructor
+ if self._exclusive_fp:
+ self.fp.close()
+ raise
+
+ def get_format_mimetype(self):
+ if self.custom_mimetype:
+ return self.custom_mimetype
+ if self.format is not None:
+ return Image.MIME.get(self.format.upper())
+
+ def verify(self):
+ """Check file integrity"""
+
+ # raise exception if something's wrong. must be called
+ # directly after open, and closes file when finished.
+ if self._exclusive_fp:
+ self.fp.close()
+ self.fp = None
+
+ def load(self):
+ """Load image data based on tile list"""
+
+ pixel = Image.Image.load(self)
+
+ if self.tile is None:
+ raise OSError("cannot load this image")
+ if not self.tile:
+ return pixel
+
+ self.map = None
+ use_mmap = self.filename and len(self.tile) == 1
+ # As of pypy 2.1.0, memory mapping was failing here.
+ use_mmap = use_mmap and not hasattr(sys, "pypy_version_info")
+
+ readonly = 0
+
+ # look for read/seek overrides
+ try:
+ read = self.load_read
+ # don't use mmap if there are custom read/seek functions
+ use_mmap = False
+ except AttributeError:
+ read = self.fp.read
+
+ try:
+ seek = self.load_seek
+ use_mmap = False
+ except AttributeError:
+ seek = self.fp.seek
+
+ if use_mmap:
+ # try memory mapping
+ decoder_name, extents, offset, args = self.tile[0]
+ if (
+ decoder_name == "raw"
+ and len(args) >= 3
+ and args[0] == self.mode
+ and args[0] in Image._MAPMODES
+ ):
+ try:
+ if hasattr(Image.core, "map"):
+ # use built-in mapper WIN32 only
+ self.map = Image.core.map(self.filename)
+ self.map.seek(offset)
+ self.im = self.map.readimage(
+ self.mode, self.size, args[1], args[2]
+ )
+ else:
+ # use mmap, if possible
+ import mmap
+
+ with open(self.filename, "r") as fp:
+ self.map = mmap.mmap(
+ fp.fileno(), 0, access=mmap.ACCESS_READ
+ )
+ self.im = Image.core.map_buffer(
+ self.map, self.size, decoder_name, offset, args
+ )
+ readonly = 1
+ # After trashing self.im,
+ # we might need to reload the palette data.
+ if self.palette:
+ self.palette.dirty = 1
+ except (AttributeError, OSError, ImportError):
+ self.map = None
+
+ self.load_prepare()
+ err_code = -3 # initialize to unknown error
+ if not self.map:
+ # sort tiles in file order
+ self.tile.sort(key=_tilesort)
+
+ try:
+ # FIXME: This is a hack to handle TIFF's JpegTables tag.
+ prefix = self.tile_prefix
+ except AttributeError:
+ prefix = b""
+
+ for decoder_name, extents, offset, args in self.tile:
+ decoder = Image._getdecoder(
+ self.mode, decoder_name, args, self.decoderconfig
+ )
+ try:
+ seek(offset)
+ decoder.setimage(self.im, extents)
+ if decoder.pulls_fd:
+ decoder.setfd(self.fp)
+ status, err_code = decoder.decode(b"")
+ else:
+ b = prefix
+ while True:
+ try:
+ s = read(self.decodermaxblock)
+ except (IndexError, struct.error):
+ # truncated png/gif
+ if LOAD_TRUNCATED_IMAGES:
+ break
+ else:
+ raise OSError("image file is truncated")
+
+ if not s: # truncated jpeg
+ if LOAD_TRUNCATED_IMAGES:
+ break
+ else:
+ raise OSError(
+ "image file is truncated "
+ "(%d bytes not processed)" % len(b)
+ )
+
+ b = b + s
+ n, err_code = decoder.decode(b)
+ if n < 0:
+ break
+ b = b[n:]
+ finally:
+ # Need to cleanup here to prevent leaks
+ decoder.cleanup()
+
+ self.tile = []
+ self.readonly = readonly
+
+ self.load_end()
+
+ if self._exclusive_fp and self._close_exclusive_fp_after_loading:
+ self.fp.close()
+ self.fp = None
+
+ if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0:
+ # still raised if decoder fails to return anything
+ raise_ioerror(err_code)
+
+ return Image.Image.load(self)
+
+ def load_prepare(self):
+ # create image memory if necessary
+ if not self.im or self.im.mode != self.mode or self.im.size != self.size:
+ self.im = Image.core.new(self.mode, self.size)
+ # create palette (optional)
+ if self.mode == "P":
+ Image.Image.load(self)
+
+ def load_end(self):
+ # may be overridden
+ pass
+
+ # may be defined for contained formats
+ # def load_seek(self, pos):
+ # pass
+
+ # may be defined for blocked formats (e.g. PNG)
+ # def load_read(self, bytes):
+ # pass
+
+ def _seek_check(self, frame):
+ if (
+ frame < self._min_frame
+ # Only check upper limit on frames if additional seek operations
+ # are not required to do so
+ or (
+ not (hasattr(self, "_n_frames") and self._n_frames is None)
+ and frame >= self.n_frames + self._min_frame
+ )
+ ):
+ raise EOFError("attempt to seek outside sequence")
+
+ return self.tell() != frame
+
+
+class StubImageFile(ImageFile):
+ """
+ Base class for stub image loaders.
+
+ A stub loader is an image loader that can identify files of a
+ certain format, but relies on external code to load the file.
+ """
+
+ def _open(self):
+ raise NotImplementedError("StubImageFile subclass must implement _open")
+
+ def load(self):
+ loader = self._load()
+ if loader is None:
+ raise OSError("cannot find loader for this %s file" % self.format)
+ image = loader.load(self)
+ assert image is not None
+ # become the other object (!)
+ self.__class__ = image.__class__
+ self.__dict__ = image.__dict__
+
+ def _load(self):
+ """(Hook) Find actual image loader."""
+ raise NotImplementedError("StubImageFile subclass must implement _load")
+
+
+class Parser:
+ """
+ Incremental image parser. This class implements the standard
+ feed/close consumer interface.
+ """
+
+ incremental = None
+ image = None
+ data = None
+ decoder = None
+ offset = 0
+ finished = 0
+
+ def reset(self):
+ """
+ (Consumer) Reset the parser. Note that you can only call this
+ method immediately after you've created a parser; parser
+ instances cannot be reused.
+ """
+ assert self.data is None, "cannot reuse parsers"
+
+ def feed(self, data):
+ """
+ (Consumer) Feed data to the parser.
+
+ :param data: A string buffer.
+ :exception IOError: If the parser failed to parse the image file.
+ """
+ # collect data
+
+ if self.finished:
+ return
+
+ if self.data is None:
+ self.data = data
+ else:
+ self.data = self.data + data
+
+ # parse what we have
+ if self.decoder:
+
+ if self.offset > 0:
+ # skip header
+ skip = min(len(self.data), self.offset)
+ self.data = self.data[skip:]
+ self.offset = self.offset - skip
+ if self.offset > 0 or not self.data:
+ return
+
+ n, e = self.decoder.decode(self.data)
+
+ if n < 0:
+ # end of stream
+ self.data = None
+ self.finished = 1
+ if e < 0:
+ # decoding error
+ self.image = None
+ raise_ioerror(e)
+ else:
+ # end of image
+ return
+ self.data = self.data[n:]
+
+ elif self.image:
+
+ # if we end up here with no decoder, this file cannot
+ # be incrementally parsed. wait until we've gotten all
+ # available data
+ pass
+
+ else:
+
+ # attempt to open this file
+ try:
+ with io.BytesIO(self.data) as fp:
+ im = Image.open(fp)
+ except OSError:
+ # traceback.print_exc()
+ pass # not enough data
+ else:
+ flag = hasattr(im, "load_seek") or hasattr(im, "load_read")
+ if flag or len(im.tile) != 1:
+ # custom load code, or multiple tiles
+ self.decode = None
+ else:
+ # initialize decoder
+ im.load_prepare()
+ d, e, o, a = im.tile[0]
+ im.tile = []
+ self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig)
+ self.decoder.setimage(im.im, e)
+
+ # calculate decoder offset
+ self.offset = o
+ if self.offset <= len(self.data):
+ self.data = self.data[self.offset :]
+ self.offset = 0
+
+ self.image = im
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
+ def close(self):
+ """
+ (Consumer) Close the stream.
+
+ :returns: An image object.
+ :exception IOError: If the parser failed to parse the image file either
+ because it cannot be identified or cannot be
+ decoded.
+ """
+ # finish decoding
+ if self.decoder:
+ # get rid of what's left in the buffers
+ self.feed(b"")
+ self.data = self.decoder = None
+ if not self.finished:
+ raise OSError("image was incomplete")
+ if not self.image:
+ raise OSError("cannot parse this image")
+ if self.data:
+ # incremental parsing not possible; reopen the file
+ # not that we have all data
+ with io.BytesIO(self.data) as fp:
+ try:
+ self.image = Image.open(fp)
+ finally:
+ self.image.load()
+ return self.image
+
+
+# --------------------------------------------------------------------
+
+
+def _save(im, fp, tile, bufsize=0):
+ """Helper to save image based on tile list
+
+ :param im: Image object.
+ :param fp: File object.
+ :param tile: Tile list.
+ :param bufsize: Optional buffer size
+ """
+
+ im.load()
+ if not hasattr(im, "encoderconfig"):
+ im.encoderconfig = ()
+ tile.sort(key=_tilesort)
+ # FIXME: make MAXBLOCK a configuration parameter
+ # It would be great if we could have the encoder specify what it needs
+ # But, it would need at least the image size in most cases. RawEncode is
+ # a tricky case.
+ bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c
+ if fp == sys.stdout:
+ fp.flush()
+ return
+ try:
+ fh = fp.fileno()
+ fp.flush()
+ except (AttributeError, io.UnsupportedOperation):
+ # compress to Python file-compatible object
+ for e, b, o, a in tile:
+ e = Image._getencoder(im.mode, e, a, im.encoderconfig)
+ if o > 0:
+ fp.seek(o)
+ e.setimage(im.im, b)
+ if e.pushes_fd:
+ e.setfd(fp)
+ l, s = e.encode_to_pyfd()
+ else:
+ while True:
+ l, s, d = e.encode(bufsize)
+ fp.write(d)
+ if s:
+ break
+ if s < 0:
+ raise OSError("encoder error %d when writing image file" % s)
+ e.cleanup()
+ else:
+ # slight speedup: compress to real file object
+ for e, b, o, a in tile:
+ e = Image._getencoder(im.mode, e, a, im.encoderconfig)
+ if o > 0:
+ fp.seek(o)
+ e.setimage(im.im, b)
+ if e.pushes_fd:
+ e.setfd(fp)
+ l, s = e.encode_to_pyfd()
+ else:
+ s = e.encode_to_file(fh, bufsize)
+ if s < 0:
+ raise OSError("encoder error %d when writing image file" % s)
+ e.cleanup()
+ if hasattr(fp, "flush"):
+ fp.flush()
+
+
+def _safe_read(fp, size):
+ """
+ Reads large blocks in a safe way. Unlike fp.read(n), this function
+ doesn't trust the user. If the requested size is larger than
+ SAFEBLOCK, the file is read block by block.
+
+ :param fp: File handle. Must implement a read method.
+ :param size: Number of bytes to read.
+ :returns: A string containing up to size bytes of data.
+ """
+ if size <= 0:
+ return b""
+ if size <= SAFEBLOCK:
+ return fp.read(size)
+ data = []
+ while size > 0:
+ block = fp.read(min(size, SAFEBLOCK))
+ if not block:
+ break
+ data.append(block)
+ size -= len(block)
+ return b"".join(data)
+
+
+class PyCodecState:
+ def __init__(self):
+ self.xsize = 0
+ self.ysize = 0
+ self.xoff = 0
+ self.yoff = 0
+
+ def extents(self):
+ return (self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize)
+
+
+class PyDecoder:
+ """
+ Python implementation of a format decoder. Override this class and
+ add the decoding logic in the `decode` method.
+
+ See :ref:`Writing Your Own File Decoder in Python`
+ """
+
+ _pulls_fd = False
+
+ def __init__(self, mode, *args):
+ self.im = None
+ self.state = PyCodecState()
+ self.fd = None
+ self.mode = mode
+ self.init(args)
+
+ def init(self, args):
+ """
+ Override to perform decoder specific initialization
+
+ :param args: Array of args items from the tile entry
+ :returns: None
+ """
+ self.args = args
+
+ @property
+ def pulls_fd(self):
+ return self._pulls_fd
+
+ def decode(self, buffer):
+ """
+ Override to perform the decoding process.
+
+ :param buffer: A bytes object with the data to be decoded.
+ :returns: A tuple of (bytes consumed, errcode).
+ If finished with decoding return <0 for the bytes consumed.
+ Err codes are from `ERRORS`
+ """
+ raise NotImplementedError()
+
+ def cleanup(self):
+ """
+ Override to perform decoder specific cleanup
+
+ :returns: None
+ """
+ pass
+
+ def setfd(self, fd):
+ """
+ Called from ImageFile to set the python file-like object
+
+ :param fd: A python file-like object
+ :returns: None
+ """
+ self.fd = fd
+
+ def setimage(self, im, extents=None):
+ """
+ Called from ImageFile to set the core output image for the decoder
+
+ :param im: A core image object
+ :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle
+ for this tile
+ :returns: None
+ """
+
+ # following c code
+ self.im = im
+
+ if extents:
+ (x0, y0, x1, y1) = extents
+ else:
+ (x0, y0, x1, y1) = (0, 0, 0, 0)
+
+ if x0 == 0 and x1 == 0:
+ self.state.xsize, self.state.ysize = self.im.size
+ else:
+ self.state.xoff = x0
+ self.state.yoff = y0
+ self.state.xsize = x1 - x0
+ self.state.ysize = y1 - y0
+
+ if self.state.xsize <= 0 or self.state.ysize <= 0:
+ raise ValueError("Size cannot be negative")
+
+ if (
+ self.state.xsize + self.state.xoff > self.im.size[0]
+ or self.state.ysize + self.state.yoff > self.im.size[1]
+ ):
+ raise ValueError("Tile cannot extend outside image")
+
+ def set_as_raw(self, data, rawmode=None):
+ """
+ Convenience method to set the internal image from a stream of raw data
+
+ :param data: Bytes to be set
+ :param rawmode: The rawmode to be used for the decoder.
+ If not specified, it will default to the mode of the image
+ :returns: None
+ """
+
+ if not rawmode:
+ rawmode = self.mode
+ d = Image._getdecoder(self.mode, "raw", (rawmode))
+ d.setimage(self.im, self.state.extents())
+ s = d.decode(data)
+
+ if s[0] >= 0:
+ raise ValueError("not enough image data")
+ if s[1] != 0:
+ raise ValueError("cannot decode image data")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageFilter.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageFilter.py
new file mode 100644
index 0000000..6b0f5eb
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageFilter.py
@@ -0,0 +1,535 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# standard filters
+#
+# History:
+# 1995-11-27 fl Created
+# 2002-06-08 fl Added rank and mode filters
+# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call
+#
+# Copyright (c) 1997-2003 by Secret Labs AB.
+# Copyright (c) 1995-2002 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+import functools
+
+try:
+ import numpy
+except ImportError: # pragma: no cover
+ numpy = None
+
+
+class Filter:
+ pass
+
+
+class MultibandFilter(Filter):
+ pass
+
+
+class BuiltinFilter(MultibandFilter):
+ def filter(self, image):
+ if image.mode == "P":
+ raise ValueError("cannot filter palette images")
+ return image.filter(*self.filterargs)
+
+
+class Kernel(BuiltinFilter):
+ """
+ Create a convolution kernel. The current version only
+ supports 3x3 and 5x5 integer and floating point kernels.
+
+ In the current version, kernels can only be applied to
+ "L" and "RGB" images.
+
+ :param size: Kernel size, given as (width, height). In the current
+ version, this must be (3,3) or (5,5).
+ :param kernel: A sequence containing kernel weights.
+ :param scale: Scale factor. If given, the result for each pixel is
+ divided by this value. the default is the sum of the
+ kernel weights.
+ :param offset: Offset. If given, this value is added to the result,
+ after it has been divided by the scale factor.
+ """
+
+ name = "Kernel"
+
+ def __init__(self, size, kernel, scale=None, offset=0):
+ if scale is None:
+ # default scale is sum of kernel
+ scale = functools.reduce(lambda a, b: a + b, kernel)
+ if size[0] * size[1] != len(kernel):
+ raise ValueError("not enough coefficients in kernel")
+ self.filterargs = size, scale, offset, kernel
+
+
+class RankFilter(Filter):
+ """
+ Create a rank filter. The rank filter sorts all pixels in
+ a window of the given size, and returns the **rank**'th value.
+
+ :param size: The kernel size, in pixels.
+ :param rank: What pixel value to pick. Use 0 for a min filter,
+ ``size * size / 2`` for a median filter, ``size * size - 1``
+ for a max filter, etc.
+ """
+
+ name = "Rank"
+
+ def __init__(self, size, rank):
+ self.size = size
+ self.rank = rank
+
+ def filter(self, image):
+ if image.mode == "P":
+ raise ValueError("cannot filter palette images")
+ image = image.expand(self.size // 2, self.size // 2)
+ return image.rankfilter(self.size, self.rank)
+
+
+class MedianFilter(RankFilter):
+ """
+ Create a median filter. Picks the median pixel value in a window with the
+ given size.
+
+ :param size: The kernel size, in pixels.
+ """
+
+ name = "Median"
+
+ def __init__(self, size=3):
+ self.size = size
+ self.rank = size * size // 2
+
+
+class MinFilter(RankFilter):
+ """
+ Create a min filter. Picks the lowest pixel value in a window with the
+ given size.
+
+ :param size: The kernel size, in pixels.
+ """
+
+ name = "Min"
+
+ def __init__(self, size=3):
+ self.size = size
+ self.rank = 0
+
+
+class MaxFilter(RankFilter):
+ """
+ Create a max filter. Picks the largest pixel value in a window with the
+ given size.
+
+ :param size: The kernel size, in pixels.
+ """
+
+ name = "Max"
+
+ def __init__(self, size=3):
+ self.size = size
+ self.rank = size * size - 1
+
+
+class ModeFilter(Filter):
+ """
+ Create a mode filter. Picks the most frequent pixel value in a box with the
+ given size. Pixel values that occur only once or twice are ignored; if no
+ pixel value occurs more than twice, the original pixel value is preserved.
+
+ :param size: The kernel size, in pixels.
+ """
+
+ name = "Mode"
+
+ def __init__(self, size=3):
+ self.size = size
+
+ def filter(self, image):
+ return image.modefilter(self.size)
+
+
+class GaussianBlur(MultibandFilter):
+ """Gaussian blur filter.
+
+ :param radius: Blur radius.
+ """
+
+ name = "GaussianBlur"
+
+ def __init__(self, radius=2):
+ self.radius = radius
+
+ def filter(self, image):
+ return image.gaussian_blur(self.radius)
+
+
+class BoxBlur(MultibandFilter):
+ """Blurs the image by setting each pixel to the average value of the pixels
+ in a square box extending radius pixels in each direction.
+ Supports float radius of arbitrary size. Uses an optimized implementation
+ which runs in linear time relative to the size of the image
+ for any radius value.
+
+ :param radius: Size of the box in one direction. Radius 0 does not blur,
+ returns an identical image. Radius 1 takes 1 pixel
+ in each direction, i.e. 9 pixels in total.
+ """
+
+ name = "BoxBlur"
+
+ def __init__(self, radius):
+ self.radius = radius
+
+ def filter(self, image):
+ return image.box_blur(self.radius)
+
+
+class UnsharpMask(MultibandFilter):
+ """Unsharp mask filter.
+
+ See Wikipedia's entry on `digital unsharp masking`_ for an explanation of
+ the parameters.
+
+ :param radius: Blur Radius
+ :param percent: Unsharp strength, in percent
+ :param threshold: Threshold controls the minimum brightness change that
+ will be sharpened
+
+ .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking
+
+ """ # noqa: E501
+
+ name = "UnsharpMask"
+
+ def __init__(self, radius=2, percent=150, threshold=3):
+ self.radius = radius
+ self.percent = percent
+ self.threshold = threshold
+
+ def filter(self, image):
+ return image.unsharp_mask(self.radius, self.percent, self.threshold)
+
+
+class BLUR(BuiltinFilter):
+ name = "Blur"
+ # fmt: off
+ filterargs = (5, 5), 16, 0, (
+ 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 1,
+ 1, 0, 0, 0, 1,
+ 1, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1,
+ )
+ # fmt: on
+
+
+class CONTOUR(BuiltinFilter):
+ name = "Contour"
+ # fmt: off
+ filterargs = (3, 3), 1, 255, (
+ -1, -1, -1,
+ -1, 8, -1,
+ -1, -1, -1,
+ )
+ # fmt: on
+
+
+class DETAIL(BuiltinFilter):
+ name = "Detail"
+ # fmt: off
+ filterargs = (3, 3), 6, 0, (
+ 0, -1, 0,
+ -1, 10, -1,
+ 0, -1, 0,
+ )
+ # fmt: on
+
+
+class EDGE_ENHANCE(BuiltinFilter):
+ name = "Edge-enhance"
+ # fmt: off
+ filterargs = (3, 3), 2, 0, (
+ -1, -1, -1,
+ -1, 10, -1,
+ -1, -1, -1,
+ )
+ # fmt: on
+
+
+class EDGE_ENHANCE_MORE(BuiltinFilter):
+ name = "Edge-enhance More"
+ # fmt: off
+ filterargs = (3, 3), 1, 0, (
+ -1, -1, -1,
+ -1, 9, -1,
+ -1, -1, -1,
+ )
+ # fmt: on
+
+
+class EMBOSS(BuiltinFilter):
+ name = "Emboss"
+ # fmt: off
+ filterargs = (3, 3), 1, 128, (
+ -1, 0, 0,
+ 0, 1, 0,
+ 0, 0, 0,
+ )
+ # fmt: on
+
+
+class FIND_EDGES(BuiltinFilter):
+ name = "Find Edges"
+ # fmt: off
+ filterargs = (3, 3), 1, 0, (
+ -1, -1, -1,
+ -1, 8, -1,
+ -1, -1, -1,
+ )
+ # fmt: on
+
+
+class SHARPEN(BuiltinFilter):
+ name = "Sharpen"
+ # fmt: off
+ filterargs = (3, 3), 16, 0, (
+ -2, -2, -2,
+ -2, 32, -2,
+ -2, -2, -2,
+ )
+ # fmt: on
+
+
+class SMOOTH(BuiltinFilter):
+ name = "Smooth"
+ # fmt: off
+ filterargs = (3, 3), 13, 0, (
+ 1, 1, 1,
+ 1, 5, 1,
+ 1, 1, 1,
+ )
+ # fmt: on
+
+
+class SMOOTH_MORE(BuiltinFilter):
+ name = "Smooth More"
+ # fmt: off
+ filterargs = (5, 5), 100, 0, (
+ 1, 1, 1, 1, 1,
+ 1, 5, 5, 5, 1,
+ 1, 5, 44, 5, 1,
+ 1, 5, 5, 5, 1,
+ 1, 1, 1, 1, 1,
+ )
+ # fmt: on
+
+
+class Color3DLUT(MultibandFilter):
+ """Three-dimensional color lookup table.
+
+ Transforms 3-channel pixels using the values of the channels as coordinates
+ in the 3D lookup table and interpolating the nearest elements.
+
+ This method allows you to apply almost any color transformation
+ in constant time by using pre-calculated decimated tables.
+
+ .. versionadded:: 5.2.0
+
+ :param size: Size of the table. One int or tuple of (int, int, int).
+ Minimal size in any dimension is 2, maximum is 65.
+ :param table: Flat lookup table. A list of ``channels * size**3``
+ float elements or a list of ``size**3`` channels-sized
+ tuples with floats. Channels are changed first,
+ then first dimension, then second, then third.
+ Value 0.0 corresponds lowest value of output, 1.0 highest.
+ :param channels: Number of channels in the table. Could be 3 or 4.
+ Default is 3.
+ :param target_mode: A mode for the result image. Should have not less
+ than ``channels`` channels. Default is ``None``,
+ which means that mode wouldn't be changed.
+ """
+
+ name = "Color 3D LUT"
+
+ def __init__(self, size, table, channels=3, target_mode=None, **kwargs):
+ if channels not in (3, 4):
+ raise ValueError("Only 3 or 4 output channels are supported")
+ self.size = size = self._check_size(size)
+ self.channels = channels
+ self.mode = target_mode
+
+ # Hidden flag `_copy_table=False` could be used to avoid extra copying
+ # of the table if the table is specially made for the constructor.
+ copy_table = kwargs.get("_copy_table", True)
+ items = size[0] * size[1] * size[2]
+ wrong_size = False
+
+ if numpy and isinstance(table, numpy.ndarray):
+ if copy_table:
+ table = table.copy()
+
+ if table.shape in [
+ (items * channels,),
+ (items, channels),
+ (size[2], size[1], size[0], channels),
+ ]:
+ table = table.reshape(items * channels)
+ else:
+ wrong_size = True
+
+ else:
+ if copy_table:
+ table = list(table)
+
+ # Convert to a flat list
+ if table and isinstance(table[0], (list, tuple)):
+ table, raw_table = [], table
+ for pixel in raw_table:
+ if len(pixel) != channels:
+ raise ValueError(
+ "The elements of the table should "
+ "have a length of {}.".format(channels)
+ )
+ table.extend(pixel)
+
+ if wrong_size or len(table) != items * channels:
+ raise ValueError(
+ "The table should have either channels * size**3 float items "
+ "or size**3 items of channels-sized tuples with floats. "
+ "Table should be: {}x{}x{}x{}. Actual length: {}".format(
+ channels, size[0], size[1], size[2], len(table)
+ )
+ )
+ self.table = table
+
+ @staticmethod
+ def _check_size(size):
+ try:
+ _, _, _ = size
+ except ValueError:
+ raise ValueError(
+ "Size should be either an integer or a tuple of three integers."
+ )
+ except TypeError:
+ size = (size, size, size)
+ size = [int(x) for x in size]
+ for size1D in size:
+ if not 2 <= size1D <= 65:
+ raise ValueError("Size should be in [2, 65] range.")
+ return size
+
+ @classmethod
+ def generate(cls, size, callback, channels=3, target_mode=None):
+ """Generates new LUT using provided callback.
+
+ :param size: Size of the table. Passed to the constructor.
+ :param callback: Function with three parameters which correspond
+ three color channels. Will be called ``size**3``
+ times with values from 0.0 to 1.0 and should return
+ a tuple with ``channels`` elements.
+ :param channels: The number of channels which should return callback.
+ :param target_mode: Passed to the constructor of the resulting
+ lookup table.
+ """
+ size1D, size2D, size3D = cls._check_size(size)
+ if channels not in (3, 4):
+ raise ValueError("Only 3 or 4 output channels are supported")
+
+ table = [0] * (size1D * size2D * size3D * channels)
+ idx_out = 0
+ for b in range(size3D):
+ for g in range(size2D):
+ for r in range(size1D):
+ table[idx_out : idx_out + channels] = callback(
+ r / (size1D - 1), g / (size2D - 1), b / (size3D - 1)
+ )
+ idx_out += channels
+
+ return cls(
+ (size1D, size2D, size3D),
+ table,
+ channels=channels,
+ target_mode=target_mode,
+ _copy_table=False,
+ )
+
+ def transform(self, callback, with_normals=False, channels=None, target_mode=None):
+ """Transforms the table values using provided callback and returns
+ a new LUT with altered values.
+
+ :param callback: A function which takes old lookup table values
+ and returns a new set of values. The number
+ of arguments which function should take is
+ ``self.channels`` or ``3 + self.channels``
+ if ``with_normals`` flag is set.
+ Should return a tuple of ``self.channels`` or
+ ``channels`` elements if it is set.
+ :param with_normals: If true, ``callback`` will be called with
+ coordinates in the color cube as the first
+ three arguments. Otherwise, ``callback``
+ will be called only with actual color values.
+ :param channels: The number of channels in the resulting lookup table.
+ :param target_mode: Passed to the constructor of the resulting
+ lookup table.
+ """
+ if channels not in (None, 3, 4):
+ raise ValueError("Only 3 or 4 output channels are supported")
+ ch_in = self.channels
+ ch_out = channels or ch_in
+ size1D, size2D, size3D = self.size
+
+ table = [0] * (size1D * size2D * size3D * ch_out)
+ idx_in = 0
+ idx_out = 0
+ for b in range(size3D):
+ for g in range(size2D):
+ for r in range(size1D):
+ values = self.table[idx_in : idx_in + ch_in]
+ if with_normals:
+ values = callback(
+ r / (size1D - 1),
+ g / (size2D - 1),
+ b / (size3D - 1),
+ *values,
+ )
+ else:
+ values = callback(*values)
+ table[idx_out : idx_out + ch_out] = values
+ idx_in += ch_in
+ idx_out += ch_out
+
+ return type(self)(
+ self.size,
+ table,
+ channels=ch_out,
+ target_mode=target_mode or self.mode,
+ _copy_table=False,
+ )
+
+ def __repr__(self):
+ r = [
+ "{} from {}".format(self.__class__.__name__, self.table.__class__.__name__),
+ "size={:d}x{:d}x{:d}".format(*self.size),
+ "channels={:d}".format(self.channels),
+ ]
+ if self.mode:
+ r.append("target_mode={}".format(self.mode))
+ return "<{}>".format(" ".join(r))
+
+ def filter(self, image):
+ from . import Image
+
+ return image.color_lut_3d(
+ self.mode or image.mode,
+ Image.LINEAR,
+ self.channels,
+ self.size[0],
+ self.size[1],
+ self.size[2],
+ self.table,
+ )
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageFont.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageFont.py
new file mode 100644
index 0000000..027e4c4
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageFont.py
@@ -0,0 +1,853 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# PIL raster font management
+#
+# History:
+# 1996-08-07 fl created (experimental)
+# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3
+# 1999-02-06 fl rewrote most font management stuff in C
+# 1999-03-17 fl take pth files into account in load_path (from Richard Jones)
+# 2001-02-17 fl added freetype support
+# 2001-05-09 fl added TransposedFont wrapper class
+# 2002-03-04 fl make sure we have a "L" or "1" font
+# 2002-12-04 fl skip non-directory entries in the system path
+# 2003-04-29 fl add embedded default font
+# 2003-09-27 fl added support for truetype charmap encodings
+#
+# Todo:
+# Adapt to PILFONT2 format (16-bit fonts, compressed, single file)
+#
+# Copyright (c) 1997-2003 by Secret Labs AB
+# Copyright (c) 1996-2003 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import base64
+import os
+import sys
+from io import BytesIO
+
+from . import Image
+from ._util import isDirectory, isPath
+
+LAYOUT_BASIC = 0
+LAYOUT_RAQM = 1
+
+
+class _imagingft_not_installed:
+ # module placeholder
+ def __getattr__(self, id):
+ raise ImportError("The _imagingft C module is not installed")
+
+
+try:
+ from . import _imagingft as core
+except ImportError:
+ core = _imagingft_not_installed()
+
+
+# FIXME: add support for pilfont2 format (see FontFile.py)
+
+# --------------------------------------------------------------------
+# Font metrics format:
+# "PILfont" LF
+# fontdescriptor LF
+# (optional) key=value... LF
+# "DATA" LF
+# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox)
+#
+# To place a character, cut out srcbox and paste at dstbox,
+# relative to the character position. Then move the character
+# position according to dx, dy.
+# --------------------------------------------------------------------
+
+
+class ImageFont:
+ "PIL font wrapper"
+
+ def _load_pilfont(self, filename):
+
+ with open(filename, "rb") as fp:
+ image = None
+ for ext in (".png", ".gif", ".pbm"):
+ if image:
+ image.close()
+ try:
+ fullname = os.path.splitext(filename)[0] + ext
+ image = Image.open(fullname)
+ except Exception:
+ pass
+ else:
+ if image and image.mode in ("1", "L"):
+ break
+ else:
+ if image:
+ image.close()
+ raise OSError("cannot find glyph data file")
+
+ self.file = fullname
+
+ self._load_pilfont_data(fp, image)
+ image.close()
+
+ def _load_pilfont_data(self, file, image):
+
+ # read PILfont header
+ if file.readline() != b"PILfont\n":
+ raise SyntaxError("Not a PILfont file")
+ file.readline().split(b";")
+ self.info = [] # FIXME: should be a dictionary
+ while True:
+ s = file.readline()
+ if not s or s == b"DATA\n":
+ break
+ self.info.append(s)
+
+ # read PILfont metrics
+ data = file.read(256 * 20)
+
+ # check image
+ if image.mode not in ("1", "L"):
+ raise TypeError("invalid font image mode")
+
+ image.load()
+
+ self.font = Image.core.font(image.im, data)
+
+ def getsize(self, text, *args, **kwargs):
+ """
+ Returns width and height (in pixels) of given text.
+
+ :param text: Text to measure.
+
+ :return: (width, height)
+ """
+ return self.font.getsize(text)
+
+ def getmask(self, text, mode="", *args, **kwargs):
+ """
+ Create a bitmap for the text.
+
+ If the font uses antialiasing, the bitmap should have mode ``L`` and use a
+ maximum value of 255. Otherwise, it should have mode ``1``.
+
+ :param text: Text to render.
+ :param mode: Used by some graphics drivers to indicate what mode the
+ driver prefers; if empty, the renderer may return either
+ mode. Note that the mode is always a string, to simplify
+ C-level implementations.
+
+ .. versionadded:: 1.1.5
+
+ :return: An internal PIL storage memory instance as defined by the
+ :py:mod:`PIL.Image.core` interface module.
+ """
+ return self.font.getmask(text, mode)
+
+
+##
+# Wrapper for FreeType fonts. Application code should use the
+# truetype factory function to create font objects.
+
+
+class FreeTypeFont:
+ "FreeType font wrapper (requires _imagingft service)"
+
+ def __init__(self, font=None, size=10, index=0, encoding="", layout_engine=None):
+ # FIXME: use service provider instead
+
+ self.path = font
+ self.size = size
+ self.index = index
+ self.encoding = encoding
+
+ if layout_engine not in (LAYOUT_BASIC, LAYOUT_RAQM):
+ layout_engine = LAYOUT_BASIC
+ if core.HAVE_RAQM:
+ layout_engine = LAYOUT_RAQM
+ elif layout_engine == LAYOUT_RAQM and not core.HAVE_RAQM:
+ layout_engine = LAYOUT_BASIC
+
+ self.layout_engine = layout_engine
+
+ def load_from_bytes(f):
+ self.font_bytes = f.read()
+ self.font = core.getfont(
+ "", size, index, encoding, self.font_bytes, layout_engine
+ )
+
+ if isPath(font):
+ if sys.platform == "win32":
+ font_bytes_path = font if isinstance(font, bytes) else font.encode()
+ try:
+ font_bytes_path.decode("ascii")
+ except UnicodeDecodeError:
+ # FreeType cannot load fonts with non-ASCII characters on Windows
+ # So load it into memory first
+ with open(font, "rb") as f:
+ load_from_bytes(f)
+ return
+ self.font = core.getfont(
+ font, size, index, encoding, layout_engine=layout_engine
+ )
+ else:
+ load_from_bytes(font)
+
+ def _multiline_split(self, text):
+ split_character = "\n" if isinstance(text, str) else b"\n"
+ return text.split(split_character)
+
+ def getname(self):
+ """
+ :return: A tuple of the font family (e.g. Helvetica) and the font style
+ (e.g. Bold)
+ """
+ return self.font.family, self.font.style
+
+ def getmetrics(self):
+ """
+ :return: A tuple of the font ascent (the distance from the baseline to
+ the highest outline point) and descent (the distance from the
+ baseline to the lowest outline point, a negative value)
+ """
+ return self.font.ascent, self.font.descent
+
+ def getsize(
+ self, text, direction=None, features=None, language=None, stroke_width=0
+ ):
+ """
+ Returns width and height (in pixels) of given text if rendered in font with
+ provided direction, features, and language.
+
+ :param text: Text to measure.
+
+ :param direction: Direction of the text. It can be 'rtl' (right to
+ left), 'ltr' (left to right) or 'ttb' (top to bottom).
+ Requires libraqm.
+
+ .. versionadded:: 4.2.0
+
+ :param features: A list of OpenType font features to be used during text
+ layout. This is usually used to turn on optional
+ font features that are not enabled by default,
+ for example 'dlig' or 'ss01', but can be also
+ used to turn off default font features for
+ example '-liga' to disable ligatures or '-kern'
+ to disable kerning. To get all supported
+ features, see
+ https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist
+ Requires libraqm.
+
+ .. versionadded:: 4.2.0
+
+ :param language: Language of the text. Different languages may use
+ different glyph shapes or ligatures. This parameter tells
+ the font which language the text is in, and to apply the
+ correct substitutions as appropriate, if available.
+ It should be a `BCP 47 language code
+ `
+ Requires libraqm.
+
+ .. versionadded:: 6.0.0
+
+ :param stroke_width: The width of the text stroke.
+
+ .. versionadded:: 6.2.0
+
+ :return: (width, height)
+ """
+ size, offset = self.font.getsize(text, direction, features, language)
+ return (
+ size[0] + stroke_width * 2 + offset[0],
+ size[1] + stroke_width * 2 + offset[1],
+ )
+
+ def getsize_multiline(
+ self,
+ text,
+ direction=None,
+ spacing=4,
+ features=None,
+ language=None,
+ stroke_width=0,
+ ):
+ """
+ Returns width and height (in pixels) of given text if rendered in font
+ with provided direction, features, and language, while respecting
+ newline characters.
+
+ :param text: Text to measure.
+
+ :param direction: Direction of the text. It can be 'rtl' (right to
+ left), 'ltr' (left to right) or 'ttb' (top to bottom).
+ Requires libraqm.
+
+ :param spacing: The vertical gap between lines, defaulting to 4 pixels.
+
+ :param features: A list of OpenType font features to be used during text
+ layout. This is usually used to turn on optional
+ font features that are not enabled by default,
+ for example 'dlig' or 'ss01', but can be also
+ used to turn off default font features for
+ example '-liga' to disable ligatures or '-kern'
+ to disable kerning. To get all supported
+ features, see
+ https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist
+ Requires libraqm.
+
+ :param language: Language of the text. Different languages may use
+ different glyph shapes or ligatures. This parameter tells
+ the font which language the text is in, and to apply the
+ correct substitutions as appropriate, if available.
+ It should be a `BCP 47 language code
+ `
+ Requires libraqm.
+
+ .. versionadded:: 6.0.0
+
+ :param stroke_width: The width of the text stroke.
+
+ .. versionadded:: 6.2.0
+
+ :return: (width, height)
+ """
+ max_width = 0
+ lines = self._multiline_split(text)
+ line_spacing = self.getsize("A", stroke_width=stroke_width)[1] + spacing
+ for line in lines:
+ line_width, line_height = self.getsize(
+ line, direction, features, language, stroke_width
+ )
+ max_width = max(max_width, line_width)
+
+ return max_width, len(lines) * line_spacing - spacing
+
+ def getoffset(self, text):
+ """
+ Returns the offset of given text. This is the gap between the
+ starting coordinate and the first marking. Note that this gap is
+ included in the result of :py:func:`~PIL.ImageFont.FreeTypeFont.getsize`.
+
+ :param text: Text to measure.
+
+ :return: A tuple of the x and y offset
+ """
+ return self.font.getsize(text)[1]
+
+ def getmask(
+ self,
+ text,
+ mode="",
+ direction=None,
+ features=None,
+ language=None,
+ stroke_width=0,
+ ):
+ """
+ Create a bitmap for the text.
+
+ If the font uses antialiasing, the bitmap should have mode ``L`` and use a
+ maximum value of 255. Otherwise, it should have mode ``1``.
+
+ :param text: Text to render.
+ :param mode: Used by some graphics drivers to indicate what mode the
+ driver prefers; if empty, the renderer may return either
+ mode. Note that the mode is always a string, to simplify
+ C-level implementations.
+
+ .. versionadded:: 1.1.5
+
+ :param direction: Direction of the text. It can be 'rtl' (right to
+ left), 'ltr' (left to right) or 'ttb' (top to bottom).
+ Requires libraqm.
+
+ .. versionadded:: 4.2.0
+
+ :param features: A list of OpenType font features to be used during text
+ layout. This is usually used to turn on optional
+ font features that are not enabled by default,
+ for example 'dlig' or 'ss01', but can be also
+ used to turn off default font features for
+ example '-liga' to disable ligatures or '-kern'
+ to disable kerning. To get all supported
+ features, see
+ https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist
+ Requires libraqm.
+
+ .. versionadded:: 4.2.0
+
+ :param language: Language of the text. Different languages may use
+ different glyph shapes or ligatures. This parameter tells
+ the font which language the text is in, and to apply the
+ correct substitutions as appropriate, if available.
+ It should be a `BCP 47 language code
+ `
+ Requires libraqm.
+
+ .. versionadded:: 6.0.0
+
+ :param stroke_width: The width of the text stroke.
+
+ .. versionadded:: 6.2.0
+
+ :return: An internal PIL storage memory instance as defined by the
+ :py:mod:`PIL.Image.core` interface module.
+ """
+ return self.getmask2(
+ text,
+ mode,
+ direction=direction,
+ features=features,
+ language=language,
+ stroke_width=stroke_width,
+ )[0]
+
+ def getmask2(
+ self,
+ text,
+ mode="",
+ fill=Image.core.fill,
+ direction=None,
+ features=None,
+ language=None,
+ stroke_width=0,
+ *args,
+ **kwargs
+ ):
+ """
+ Create a bitmap for the text.
+
+ If the font uses antialiasing, the bitmap should have mode ``L`` and use a
+ maximum value of 255. Otherwise, it should have mode ``1``.
+
+ :param text: Text to render.
+ :param mode: Used by some graphics drivers to indicate what mode the
+ driver prefers; if empty, the renderer may return either
+ mode. Note that the mode is always a string, to simplify
+ C-level implementations.
+
+ .. versionadded:: 1.1.5
+
+ :param direction: Direction of the text. It can be 'rtl' (right to
+ left), 'ltr' (left to right) or 'ttb' (top to bottom).
+ Requires libraqm.
+
+ .. versionadded:: 4.2.0
+
+ :param features: A list of OpenType font features to be used during text
+ layout. This is usually used to turn on optional
+ font features that are not enabled by default,
+ for example 'dlig' or 'ss01', but can be also
+ used to turn off default font features for
+ example '-liga' to disable ligatures or '-kern'
+ to disable kerning. To get all supported
+ features, see
+ https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist
+ Requires libraqm.
+
+ .. versionadded:: 4.2.0
+
+ :param language: Language of the text. Different languages may use
+ different glyph shapes or ligatures. This parameter tells
+ the font which language the text is in, and to apply the
+ correct substitutions as appropriate, if available.
+ It should be a `BCP 47 language code
+ `
+ Requires libraqm.
+
+ .. versionadded:: 6.0.0
+
+ :param stroke_width: The width of the text stroke.
+
+ .. versionadded:: 6.2.0
+
+ :return: A tuple of an internal PIL storage memory instance as defined by the
+ :py:mod:`PIL.Image.core` interface module, and the text offset, the
+ gap between the starting coordinate and the first marking
+ """
+ size, offset = self.font.getsize(text, direction, features, language)
+ size = size[0] + stroke_width * 2, size[1] + stroke_width * 2
+ im = fill("L", size, 0)
+ self.font.render(
+ text, im.id, mode == "1", direction, features, language, stroke_width
+ )
+ return im, offset
+
+ def font_variant(
+ self, font=None, size=None, index=None, encoding=None, layout_engine=None
+ ):
+ """
+ Create a copy of this FreeTypeFont object,
+ using any specified arguments to override the settings.
+
+ Parameters are identical to the parameters used to initialize this
+ object.
+
+ :return: A FreeTypeFont object.
+ """
+ return FreeTypeFont(
+ font=self.path if font is None else font,
+ size=self.size if size is None else size,
+ index=self.index if index is None else index,
+ encoding=self.encoding if encoding is None else encoding,
+ layout_engine=layout_engine or self.layout_engine,
+ )
+
+ def get_variation_names(self):
+ """
+ :returns: A list of the named styles in a variation font.
+ :exception IOError: If the font is not a variation font.
+ """
+ try:
+ names = self.font.getvarnames()
+ except AttributeError:
+ raise NotImplementedError("FreeType 2.9.1 or greater is required")
+ return [name.replace(b"\x00", b"") for name in names]
+
+ def set_variation_by_name(self, name):
+ """
+ :param name: The name of the style.
+ :exception IOError: If the font is not a variation font.
+ """
+ names = self.get_variation_names()
+ if not isinstance(name, bytes):
+ name = name.encode()
+ index = names.index(name)
+
+ if index == getattr(self, "_last_variation_index", None):
+ # When the same name is set twice in a row,
+ # there is an 'unknown freetype error'
+ # https://savannah.nongnu.org/bugs/?56186
+ return
+ self._last_variation_index = index
+
+ self.font.setvarname(index)
+
+ def get_variation_axes(self):
+ """
+ :returns: A list of the axes in a variation font.
+ :exception IOError: If the font is not a variation font.
+ """
+ try:
+ axes = self.font.getvaraxes()
+ except AttributeError:
+ raise NotImplementedError("FreeType 2.9.1 or greater is required")
+ for axis in axes:
+ axis["name"] = axis["name"].replace(b"\x00", b"")
+ return axes
+
+ def set_variation_by_axes(self, axes):
+ """
+ :param axes: A list of values for each axis.
+ :exception IOError: If the font is not a variation font.
+ """
+ try:
+ self.font.setvaraxes(axes)
+ except AttributeError:
+ raise NotImplementedError("FreeType 2.9.1 or greater is required")
+
+
+class TransposedFont:
+ "Wrapper for writing rotated or mirrored text"
+
+ def __init__(self, font, orientation=None):
+ """
+ Wrapper that creates a transposed font from any existing font
+ object.
+
+ :param font: A font object.
+ :param orientation: An optional orientation. If given, this should
+ be one of Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM,
+ Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270.
+ """
+ self.font = font
+ self.orientation = orientation # any 'transpose' argument, or None
+
+ def getsize(self, text, *args, **kwargs):
+ w, h = self.font.getsize(text)
+ if self.orientation in (Image.ROTATE_90, Image.ROTATE_270):
+ return h, w
+ return w, h
+
+ def getmask(self, text, mode="", *args, **kwargs):
+ im = self.font.getmask(text, mode, *args, **kwargs)
+ if self.orientation is not None:
+ return im.transpose(self.orientation)
+ return im
+
+
+def load(filename):
+ """
+ Load a font file. This function loads a font object from the given
+ bitmap font file, and returns the corresponding font object.
+
+ :param filename: Name of font file.
+ :return: A font object.
+ :exception IOError: If the file could not be read.
+ """
+ f = ImageFont()
+ f._load_pilfont(filename)
+ return f
+
+
+def truetype(font=None, size=10, index=0, encoding="", layout_engine=None):
+ """
+ Load a TrueType or OpenType font from a file or file-like object,
+ and create a font object.
+ This function loads a font object from the given file or file-like
+ object, and creates a font object for a font of the given size.
+
+ Pillow uses FreeType to open font files. If you are opening many fonts
+ simultaneously on Windows, be aware that Windows limits the number of files
+ that can be open in C at once to 512. If you approach that limit, an
+ ``OSError`` may be thrown, reporting that FreeType "cannot open resource".
+
+ This function requires the _imagingft service.
+
+ :param font: A filename or file-like object containing a TrueType font.
+ If the file is not found in this filename, the loader may also
+ search in other directories, such as the :file:`fonts/`
+ directory on Windows or :file:`/Library/Fonts/`,
+ :file:`/System/Library/Fonts/` and :file:`~/Library/Fonts/` on
+ macOS.
+
+ :param size: The requested size, in points.
+ :param index: Which font face to load (default is first available face).
+ :param encoding: Which font encoding to use (default is Unicode). Possible
+ encodings include (see the FreeType documentation for more
+ information):
+
+ * "unic" (Unicode)
+ * "symb" (Microsoft Symbol)
+ * "ADOB" (Adobe Standard)
+ * "ADBE" (Adobe Expert)
+ * "ADBC" (Adobe Custom)
+ * "armn" (Apple Roman)
+ * "sjis" (Shift JIS)
+ * "gb " (PRC)
+ * "big5"
+ * "wans" (Extended Wansung)
+ * "joha" (Johab)
+ * "lat1" (Latin-1)
+
+ This specifies the character set to use. It does not alter the
+ encoding of any text provided in subsequent operations.
+ :param layout_engine: Which layout engine to use, if available:
+ `ImageFont.LAYOUT_BASIC` or `ImageFont.LAYOUT_RAQM`.
+ :return: A font object.
+ :exception IOError: If the file could not be read.
+ """
+
+ def freetype(font):
+ return FreeTypeFont(font, size, index, encoding, layout_engine)
+
+ try:
+ return freetype(font)
+ except OSError:
+ if not isPath(font):
+ raise
+ ttf_filename = os.path.basename(font)
+
+ dirs = []
+ if sys.platform == "win32":
+ # check the windows font repository
+ # NOTE: must use uppercase WINDIR, to work around bugs in
+ # 1.5.2's os.environ.get()
+ windir = os.environ.get("WINDIR")
+ if windir:
+ dirs.append(os.path.join(windir, "fonts"))
+ elif sys.platform in ("linux", "linux2"):
+ lindirs = os.environ.get("XDG_DATA_DIRS", "")
+ if not lindirs:
+ # According to the freedesktop spec, XDG_DATA_DIRS should
+ # default to /usr/share
+ lindirs = "/usr/share"
+ dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")]
+ elif sys.platform == "darwin":
+ dirs += [
+ "/Library/Fonts",
+ "/System/Library/Fonts",
+ os.path.expanduser("~/Library/Fonts"),
+ ]
+
+ ext = os.path.splitext(ttf_filename)[1]
+ first_font_with_a_different_extension = None
+ for directory in dirs:
+ for walkroot, walkdir, walkfilenames in os.walk(directory):
+ for walkfilename in walkfilenames:
+ if ext and walkfilename == ttf_filename:
+ return freetype(os.path.join(walkroot, walkfilename))
+ elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename:
+ fontpath = os.path.join(walkroot, walkfilename)
+ if os.path.splitext(fontpath)[1] == ".ttf":
+ return freetype(fontpath)
+ if not ext and first_font_with_a_different_extension is None:
+ first_font_with_a_different_extension = fontpath
+ if first_font_with_a_different_extension:
+ return freetype(first_font_with_a_different_extension)
+ raise
+
+
+def load_path(filename):
+ """
+ Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a
+ bitmap font along the Python path.
+
+ :param filename: Name of font file.
+ :return: A font object.
+ :exception IOError: If the file could not be read.
+ """
+ for directory in sys.path:
+ if isDirectory(directory):
+ if not isinstance(filename, str):
+ filename = filename.decode("utf-8")
+ try:
+ return load(os.path.join(directory, filename))
+ except OSError:
+ pass
+ raise OSError("cannot find font file")
+
+
+def load_default():
+ """Load a "better than nothing" default font.
+
+ .. versionadded:: 1.1.4
+
+ :return: A font object.
+ """
+ f = ImageFont()
+ f._load_pilfont_data(
+ # courB08
+ BytesIO(
+ base64.b64decode(
+ b"""
+UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA
+BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL
+AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA
+AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB
+ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A
+BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB
+//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA
+AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH
+AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA
+ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv
+AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/
+/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5
+AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA
+AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG
+AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA
+BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA
+AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA
+2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF
+AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA////
++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA
+////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA
+BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv
+AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA
+AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA
+AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA
+BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP//
+//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA
+AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF
+AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB
+mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn
+AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA
+AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7
+AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA
+Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB
+//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA
+AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ
+AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC
+DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ
+AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/
++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5
+AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/
+///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG
+AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA
+BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA
+Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC
+eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG
+AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA////
++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA
+////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA
+BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT
+AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A
+AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA
+Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA
+Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP//
+//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA
+AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ
+AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA
+LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5
+AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA
+AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5
+AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA
+AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG
+AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA
+EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK
+AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA
+pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG
+AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA////
++QAGAAIAzgAKANUAEw==
+"""
+ )
+ ),
+ Image.open(
+ BytesIO(
+ base64.b64decode(
+ b"""
+iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u
+Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9
+M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g
+LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F
+IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA
+Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791
+NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx
+in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9
+SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY
+AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt
+y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG
+ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY
+lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H
+/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3
+AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47
+c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/
+/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw
+pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv
+oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR
+evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA
+AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v//
+Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR
+w7IkEbzhVQAAAABJRU5ErkJggg==
+"""
+ )
+ )
+ ),
+ )
+ return f
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageGrab.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageGrab.py
new file mode 100644
index 0000000..66e2e85
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageGrab.py
@@ -0,0 +1,104 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# screen grabber (macOS and Windows only)
+#
+# History:
+# 2001-04-26 fl created
+# 2001-09-17 fl use builtin driver, if present
+# 2002-11-19 fl added grabclipboard support
+#
+# Copyright (c) 2001-2002 by Secret Labs AB
+# Copyright (c) 2001-2002 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import sys
+
+from . import Image
+
+if sys.platform == "darwin":
+ import os
+ import tempfile
+ import subprocess
+
+
+def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None):
+ if xdisplay is None:
+ if sys.platform == "darwin":
+ fh, filepath = tempfile.mkstemp(".png")
+ os.close(fh)
+ subprocess.call(["screencapture", "-x", filepath])
+ im = Image.open(filepath)
+ im.load()
+ os.unlink(filepath)
+ if bbox:
+ im_cropped = im.crop(bbox)
+ im.close()
+ return im_cropped
+ return im
+ elif sys.platform == "win32":
+ offset, size, data = Image.core.grabscreen_win32(
+ include_layered_windows, all_screens
+ )
+ im = Image.frombytes(
+ "RGB",
+ size,
+ data,
+ # RGB, 32-bit line padding, origin lower left corner
+ "raw",
+ "BGR",
+ (size[0] * 3 + 3) & -4,
+ -1,
+ )
+ if bbox:
+ x0, y0 = offset
+ left, top, right, bottom = bbox
+ im = im.crop((left - x0, top - y0, right - x0, bottom - y0))
+ return im
+ # use xdisplay=None for default display on non-win32/macOS systems
+ if not Image.core.HAVE_XCB:
+ raise IOError("Pillow was built without XCB support")
+ size, data = Image.core.grabscreen_x11(xdisplay)
+ im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1)
+ if bbox:
+ im = im.crop(bbox)
+ return im
+
+
+def grabclipboard():
+ if sys.platform == "darwin":
+ fh, filepath = tempfile.mkstemp(".jpg")
+ os.close(fh)
+ commands = [
+ 'set theFile to (open for access POSIX file "'
+ + filepath
+ + '" with write permission)',
+ "try",
+ " write (the clipboard as JPEG picture) to theFile",
+ "end try",
+ "close access theFile",
+ ]
+ script = ["osascript"]
+ for command in commands:
+ script += ["-e", command]
+ subprocess.call(script)
+
+ im = None
+ if os.stat(filepath).st_size != 0:
+ im = Image.open(filepath)
+ im.load()
+ os.unlink(filepath)
+ return im
+ elif sys.platform == "win32":
+ data = Image.core.grabclipboard_win32()
+ if isinstance(data, bytes):
+ from . import BmpImagePlugin
+ import io
+
+ return BmpImagePlugin.DibImageFile(io.BytesIO(data))
+ return data
+ else:
+ raise NotImplementedError("ImageGrab.grabclipboard() is macOS and Windows only")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageMath.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageMath.py
new file mode 100644
index 0000000..adbb940
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageMath.py
@@ -0,0 +1,253 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# a simple math add-on for the Python Imaging Library
+#
+# History:
+# 1999-02-15 fl Original PIL Plus release
+# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6
+# 2005-09-12 fl Fixed int() and float() for Python 2.4.1
+#
+# Copyright (c) 1999-2005 by Secret Labs AB
+# Copyright (c) 2005 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import builtins
+
+from . import Image, _imagingmath
+
+VERBOSE = 0
+
+
+def _isconstant(v):
+ return isinstance(v, (int, float))
+
+
+class _Operand:
+ """Wraps an image operand, providing standard operators"""
+
+ def __init__(self, im):
+ self.im = im
+
+ def __fixup(self, im1):
+ # convert image to suitable mode
+ if isinstance(im1, _Operand):
+ # argument was an image.
+ if im1.im.mode in ("1", "L"):
+ return im1.im.convert("I")
+ elif im1.im.mode in ("I", "F"):
+ return im1.im
+ else:
+ raise ValueError("unsupported mode: %s" % im1.im.mode)
+ else:
+ # argument was a constant
+ if _isconstant(im1) and self.im.mode in ("1", "L", "I"):
+ return Image.new("I", self.im.size, im1)
+ else:
+ return Image.new("F", self.im.size, im1)
+
+ def apply(self, op, im1, im2=None, mode=None):
+ im1 = self.__fixup(im1)
+ if im2 is None:
+ # unary operation
+ out = Image.new(mode or im1.mode, im1.size, None)
+ im1.load()
+ try:
+ op = getattr(_imagingmath, op + "_" + im1.mode)
+ except AttributeError:
+ raise TypeError("bad operand type for '%s'" % op)
+ _imagingmath.unop(op, out.im.id, im1.im.id)
+ else:
+ # binary operation
+ im2 = self.__fixup(im2)
+ if im1.mode != im2.mode:
+ # convert both arguments to floating point
+ if im1.mode != "F":
+ im1 = im1.convert("F")
+ if im2.mode != "F":
+ im2 = im2.convert("F")
+ if im1.mode != im2.mode:
+ raise ValueError("mode mismatch")
+ if im1.size != im2.size:
+ # crop both arguments to a common size
+ size = (min(im1.size[0], im2.size[0]), min(im1.size[1], im2.size[1]))
+ if im1.size != size:
+ im1 = im1.crop((0, 0) + size)
+ if im2.size != size:
+ im2 = im2.crop((0, 0) + size)
+ out = Image.new(mode or im1.mode, size, None)
+ else:
+ out = Image.new(mode or im1.mode, im1.size, None)
+ im1.load()
+ im2.load()
+ try:
+ op = getattr(_imagingmath, op + "_" + im1.mode)
+ except AttributeError:
+ raise TypeError("bad operand type for '%s'" % op)
+ _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id)
+ return _Operand(out)
+
+ # unary operators
+ def __bool__(self):
+ # an image is "true" if it contains at least one non-zero pixel
+ return self.im.getbbox() is not None
+
+ def __abs__(self):
+ return self.apply("abs", self)
+
+ def __pos__(self):
+ return self
+
+ def __neg__(self):
+ return self.apply("neg", self)
+
+ # binary operators
+ def __add__(self, other):
+ return self.apply("add", self, other)
+
+ def __radd__(self, other):
+ return self.apply("add", other, self)
+
+ def __sub__(self, other):
+ return self.apply("sub", self, other)
+
+ def __rsub__(self, other):
+ return self.apply("sub", other, self)
+
+ def __mul__(self, other):
+ return self.apply("mul", self, other)
+
+ def __rmul__(self, other):
+ return self.apply("mul", other, self)
+
+ def __truediv__(self, other):
+ return self.apply("div", self, other)
+
+ def __rtruediv__(self, other):
+ return self.apply("div", other, self)
+
+ def __mod__(self, other):
+ return self.apply("mod", self, other)
+
+ def __rmod__(self, other):
+ return self.apply("mod", other, self)
+
+ def __pow__(self, other):
+ return self.apply("pow", self, other)
+
+ def __rpow__(self, other):
+ return self.apply("pow", other, self)
+
+ # bitwise
+ def __invert__(self):
+ return self.apply("invert", self)
+
+ def __and__(self, other):
+ return self.apply("and", self, other)
+
+ def __rand__(self, other):
+ return self.apply("and", other, self)
+
+ def __or__(self, other):
+ return self.apply("or", self, other)
+
+ def __ror__(self, other):
+ return self.apply("or", other, self)
+
+ def __xor__(self, other):
+ return self.apply("xor", self, other)
+
+ def __rxor__(self, other):
+ return self.apply("xor", other, self)
+
+ def __lshift__(self, other):
+ return self.apply("lshift", self, other)
+
+ def __rshift__(self, other):
+ return self.apply("rshift", self, other)
+
+ # logical
+ def __eq__(self, other):
+ return self.apply("eq", self, other)
+
+ def __ne__(self, other):
+ return self.apply("ne", self, other)
+
+ def __lt__(self, other):
+ return self.apply("lt", self, other)
+
+ def __le__(self, other):
+ return self.apply("le", self, other)
+
+ def __gt__(self, other):
+ return self.apply("gt", self, other)
+
+ def __ge__(self, other):
+ return self.apply("ge", self, other)
+
+
+# conversions
+def imagemath_int(self):
+ return _Operand(self.im.convert("I"))
+
+
+def imagemath_float(self):
+ return _Operand(self.im.convert("F"))
+
+
+# logical
+def imagemath_equal(self, other):
+ return self.apply("eq", self, other, mode="I")
+
+
+def imagemath_notequal(self, other):
+ return self.apply("ne", self, other, mode="I")
+
+
+def imagemath_min(self, other):
+ return self.apply("min", self, other)
+
+
+def imagemath_max(self, other):
+ return self.apply("max", self, other)
+
+
+def imagemath_convert(self, mode):
+ return _Operand(self.im.convert(mode))
+
+
+ops = {}
+for k, v in list(globals().items()):
+ if k[:10] == "imagemath_":
+ ops[k[10:]] = v
+
+
+def eval(expression, _dict={}, **kw):
+ """
+ Evaluates an image expression.
+
+ :param expression: A string containing a Python-style expression.
+ :param options: Values to add to the evaluation context. You
+ can either use a dictionary, or one or more keyword
+ arguments.
+ :return: The evaluated expression. This is usually an image object, but can
+ also be an integer, a floating point value, or a pixel tuple,
+ depending on the expression.
+ """
+
+ # build execution namespace
+ args = ops.copy()
+ args.update(_dict)
+ args.update(kw)
+ for k, v in list(args.items()):
+ if hasattr(v, "im"):
+ args[k] = _Operand(v)
+
+ out = builtins.eval(expression, args)
+ try:
+ return out.im
+ except AttributeError:
+ return out
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageMode.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageMode.py
new file mode 100644
index 0000000..9882883
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageMode.py
@@ -0,0 +1,64 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# standard mode descriptors
+#
+# History:
+# 2006-03-20 fl Added
+#
+# Copyright (c) 2006 by Secret Labs AB.
+# Copyright (c) 2006 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+# mode descriptor cache
+_modes = None
+
+
+class ModeDescriptor:
+ """Wrapper for mode strings."""
+
+ def __init__(self, mode, bands, basemode, basetype):
+ self.mode = mode
+ self.bands = bands
+ self.basemode = basemode
+ self.basetype = basetype
+
+ def __str__(self):
+ return self.mode
+
+
+def getmode(mode):
+ """Gets a mode descriptor for the given mode."""
+ global _modes
+ if not _modes:
+ # initialize mode cache
+
+ from . import Image
+
+ modes = {}
+ # core modes
+ for m, (basemode, basetype, bands) in Image._MODEINFO.items():
+ modes[m] = ModeDescriptor(m, bands, basemode, basetype)
+ # extra experimental modes
+ modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L")
+ modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L")
+ modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L")
+ modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L")
+ # mapping modes
+ for i16mode in (
+ "I;16",
+ "I;16S",
+ "I;16L",
+ "I;16LS",
+ "I;16B",
+ "I;16BS",
+ "I;16N",
+ "I;16NS",
+ ):
+ modes[i16mode] = ModeDescriptor(i16mode, ("I",), "L", "L")
+ # set global mode cache atomically
+ _modes = modes
+ return _modes[mode]
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageMorph.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageMorph.py
new file mode 100644
index 0000000..d1ec09e
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageMorph.py
@@ -0,0 +1,245 @@
+# A binary morphology add-on for the Python Imaging Library
+#
+# History:
+# 2014-06-04 Initial version.
+#
+# Copyright (c) 2014 Dov Grobgeld
+
+import re
+
+from . import Image, _imagingmorph
+
+LUT_SIZE = 1 << 9
+
+# fmt: off
+ROTATION_MATRIX = [
+ 6, 3, 0,
+ 7, 4, 1,
+ 8, 5, 2,
+]
+MIRROR_MATRIX = [
+ 2, 1, 0,
+ 5, 4, 3,
+ 8, 7, 6,
+]
+# fmt: on
+
+
+class LutBuilder:
+ """A class for building a MorphLut from a descriptive language
+
+ The input patterns is a list of a strings sequences like these::
+
+ 4:(...
+ .1.
+ 111)->1
+
+ (whitespaces including linebreaks are ignored). The option 4
+ describes a series of symmetry operations (in this case a
+ 4-rotation), the pattern is described by:
+
+ - . or X - Ignore
+ - 1 - Pixel is on
+ - 0 - Pixel is off
+
+ The result of the operation is described after "->" string.
+
+ The default is to return the current pixel value, which is
+ returned if no other match is found.
+
+ Operations:
+
+ - 4 - 4 way rotation
+ - N - Negate
+ - 1 - Dummy op for no other operation (an op must always be given)
+ - M - Mirroring
+
+ Example::
+
+ lb = LutBuilder(patterns = ["4:(... .1. 111)->1"])
+ lut = lb.build_lut()
+
+ """
+
+ def __init__(self, patterns=None, op_name=None):
+ if patterns is not None:
+ self.patterns = patterns
+ else:
+ self.patterns = []
+ self.lut = None
+ if op_name is not None:
+ known_patterns = {
+ "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"],
+ "dilation4": ["4:(... .0. .1.)->1"],
+ "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"],
+ "erosion4": ["4:(... .1. .0.)->0"],
+ "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"],
+ "edge": [
+ "1:(... ... ...)->0",
+ "4:(.0. .1. ...)->1",
+ "4:(01. .1. ...)->1",
+ ],
+ }
+ if op_name not in known_patterns:
+ raise Exception("Unknown pattern " + op_name + "!")
+
+ self.patterns = known_patterns[op_name]
+
+ def add_patterns(self, patterns):
+ self.patterns += patterns
+
+ def build_default_lut(self):
+ symbols = [0, 1]
+ m = 1 << 4 # pos of current pixel
+ self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE))
+
+ def get_lut(self):
+ return self.lut
+
+ def _string_permute(self, pattern, permutation):
+ """string_permute takes a pattern and a permutation and returns the
+ string permuted according to the permutation list.
+ """
+ assert len(permutation) == 9
+ return "".join(pattern[p] for p in permutation)
+
+ def _pattern_permute(self, basic_pattern, options, basic_result):
+ """pattern_permute takes a basic pattern and its result and clones
+ the pattern according to the modifications described in the $options
+ parameter. It returns a list of all cloned patterns."""
+ patterns = [(basic_pattern, basic_result)]
+
+ # rotations
+ if "4" in options:
+ res = patterns[-1][1]
+ for i in range(4):
+ patterns.append(
+ (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res)
+ )
+ # mirror
+ if "M" in options:
+ n = len(patterns)
+ for pattern, res in patterns[0:n]:
+ patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res))
+
+ # negate
+ if "N" in options:
+ n = len(patterns)
+ for pattern, res in patterns[0:n]:
+ # Swap 0 and 1
+ pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1")
+ res = 1 - int(res)
+ patterns.append((pattern, res))
+
+ return patterns
+
+ def build_lut(self):
+ """Compile all patterns into a morphology lut.
+
+ TBD :Build based on (file) morphlut:modify_lut
+ """
+ self.build_default_lut()
+ patterns = []
+
+ # Parse and create symmetries of the patterns strings
+ for p in self.patterns:
+ m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", ""))
+ if not m:
+ raise Exception('Syntax error in pattern "' + p + '"')
+ options = m.group(1)
+ pattern = m.group(2)
+ result = int(m.group(3))
+
+ # Get rid of spaces
+ pattern = pattern.replace(" ", "").replace("\n", "")
+
+ patterns += self._pattern_permute(pattern, options, result)
+
+ # compile the patterns into regular expressions for speed
+ for i, pattern in enumerate(patterns):
+ p = pattern[0].replace(".", "X").replace("X", "[01]")
+ p = re.compile(p)
+ patterns[i] = (p, pattern[1])
+
+ # Step through table and find patterns that match.
+ # Note that all the patterns are searched. The last one
+ # caught overrides
+ for i in range(LUT_SIZE):
+ # Build the bit pattern
+ bitpattern = bin(i)[2:]
+ bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1]
+
+ for p, r in patterns:
+ if p.match(bitpattern):
+ self.lut[i] = [0, 1][r]
+
+ return self.lut
+
+
+class MorphOp:
+ """A class for binary morphological operators"""
+
+ def __init__(self, lut=None, op_name=None, patterns=None):
+ """Create a binary morphological operator"""
+ self.lut = lut
+ if op_name is not None:
+ self.lut = LutBuilder(op_name=op_name).build_lut()
+ elif patterns is not None:
+ self.lut = LutBuilder(patterns=patterns).build_lut()
+
+ def apply(self, image):
+ """Run a single morphological operation on an image
+
+ Returns a tuple of the number of changed pixels and the
+ morphed image"""
+ if self.lut is None:
+ raise Exception("No operator loaded")
+
+ if image.mode != "L":
+ raise Exception("Image must be binary, meaning it must use mode L")
+ outimage = Image.new(image.mode, image.size, None)
+ count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id)
+ return count, outimage
+
+ def match(self, image):
+ """Get a list of coordinates matching the morphological operation on
+ an image.
+
+ Returns a list of tuples of (x,y) coordinates
+ of all matching pixels. See :ref:`coordinate-system`."""
+ if self.lut is None:
+ raise Exception("No operator loaded")
+
+ if image.mode != "L":
+ raise Exception("Image must be binary, meaning it must use mode L")
+ return _imagingmorph.match(bytes(self.lut), image.im.id)
+
+ def get_on_pixels(self, image):
+ """Get a list of all turned on pixels in a binary image
+
+ Returns a list of tuples of (x,y) coordinates
+ of all matching pixels. See :ref:`coordinate-system`."""
+
+ if image.mode != "L":
+ raise Exception("Image must be binary, meaning it must use mode L")
+ return _imagingmorph.get_on_pixels(image.im.id)
+
+ def load_lut(self, filename):
+ """Load an operator from an mrl file"""
+ with open(filename, "rb") as f:
+ self.lut = bytearray(f.read())
+
+ if len(self.lut) != LUT_SIZE:
+ self.lut = None
+ raise Exception("Wrong size operator file!")
+
+ def save_lut(self, filename):
+ """Save an operator to an mrl file"""
+ if self.lut is None:
+ raise Exception("No operator loaded")
+ with open(filename, "wb") as f:
+ f.write(self.lut)
+
+ def set_lut(self, lut):
+ """Set the lut from an external source"""
+ self.lut = lut
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageOps.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageOps.py
new file mode 100644
index 0000000..e4e0840
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageOps.py
@@ -0,0 +1,551 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# standard image operations
+#
+# History:
+# 2001-10-20 fl Created
+# 2001-10-23 fl Added autocontrast operator
+# 2001-12-18 fl Added Kevin's fit operator
+# 2004-03-14 fl Fixed potential division by zero in equalize
+# 2005-05-05 fl Fixed equalize for low number of values
+#
+# Copyright (c) 2001-2004 by Secret Labs AB
+# Copyright (c) 2001-2004 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import functools
+import operator
+
+from . import Image
+
+#
+# helpers
+
+
+def _border(border):
+ if isinstance(border, tuple):
+ if len(border) == 2:
+ left, top = right, bottom = border
+ elif len(border) == 4:
+ left, top, right, bottom = border
+ else:
+ left = top = right = bottom = border
+ return left, top, right, bottom
+
+
+def _color(color, mode):
+ if isinstance(color, str):
+ from . import ImageColor
+
+ color = ImageColor.getcolor(color, mode)
+ return color
+
+
+def _lut(image, lut):
+ if image.mode == "P":
+ # FIXME: apply to lookup table, not image data
+ raise NotImplementedError("mode P support coming soon")
+ elif image.mode in ("L", "RGB"):
+ if image.mode == "RGB" and len(lut) == 256:
+ lut = lut + lut + lut
+ return image.point(lut)
+ else:
+ raise OSError("not supported for this image mode")
+
+
+#
+# actions
+
+
+def autocontrast(image, cutoff=0, ignore=None):
+ """
+ Maximize (normalize) image contrast. This function calculates a
+ histogram of the input image, removes **cutoff** percent of the
+ lightest and darkest pixels from the histogram, and remaps the image
+ so that the darkest pixel becomes black (0), and the lightest
+ becomes white (255).
+
+ :param image: The image to process.
+ :param cutoff: How many percent to cut off from the histogram.
+ :param ignore: The background pixel value (use None for no background).
+ :return: An image.
+ """
+ histogram = image.histogram()
+ lut = []
+ for layer in range(0, len(histogram), 256):
+ h = histogram[layer : layer + 256]
+ if ignore is not None:
+ # get rid of outliers
+ try:
+ h[ignore] = 0
+ except TypeError:
+ # assume sequence
+ for ix in ignore:
+ h[ix] = 0
+ if cutoff:
+ # cut off pixels from both ends of the histogram
+ # get number of pixels
+ n = 0
+ for ix in range(256):
+ n = n + h[ix]
+ # remove cutoff% pixels from the low end
+ cut = n * cutoff // 100
+ for lo in range(256):
+ if cut > h[lo]:
+ cut = cut - h[lo]
+ h[lo] = 0
+ else:
+ h[lo] -= cut
+ cut = 0
+ if cut <= 0:
+ break
+ # remove cutoff% samples from the hi end
+ cut = n * cutoff // 100
+ for hi in range(255, -1, -1):
+ if cut > h[hi]:
+ cut = cut - h[hi]
+ h[hi] = 0
+ else:
+ h[hi] -= cut
+ cut = 0
+ if cut <= 0:
+ break
+ # find lowest/highest samples after preprocessing
+ for lo in range(256):
+ if h[lo]:
+ break
+ for hi in range(255, -1, -1):
+ if h[hi]:
+ break
+ if hi <= lo:
+ # don't bother
+ lut.extend(list(range(256)))
+ else:
+ scale = 255.0 / (hi - lo)
+ offset = -lo * scale
+ for ix in range(256):
+ ix = int(ix * scale + offset)
+ if ix < 0:
+ ix = 0
+ elif ix > 255:
+ ix = 255
+ lut.append(ix)
+ return _lut(image, lut)
+
+
+def colorize(image, black, white, mid=None, blackpoint=0, whitepoint=255, midpoint=127):
+ """
+ Colorize grayscale image.
+ This function calculates a color wedge which maps all black pixels in
+ the source image to the first color and all white pixels to the
+ second color. If **mid** is specified, it uses three-color mapping.
+ The **black** and **white** arguments should be RGB tuples or color names;
+ optionally you can use three-color mapping by also specifying **mid**.
+ Mapping positions for any of the colors can be specified
+ (e.g. **blackpoint**), where these parameters are the integer
+ value corresponding to where the corresponding color should be mapped.
+ These parameters must have logical order, such that
+ **blackpoint** <= **midpoint** <= **whitepoint** (if **mid** is specified).
+
+ :param image: The image to colorize.
+ :param black: The color to use for black input pixels.
+ :param white: The color to use for white input pixels.
+ :param mid: The color to use for midtone input pixels.
+ :param blackpoint: an int value [0, 255] for the black mapping.
+ :param whitepoint: an int value [0, 255] for the white mapping.
+ :param midpoint: an int value [0, 255] for the midtone mapping.
+ :return: An image.
+ """
+
+ # Initial asserts
+ assert image.mode == "L"
+ if mid is None:
+ assert 0 <= blackpoint <= whitepoint <= 255
+ else:
+ assert 0 <= blackpoint <= midpoint <= whitepoint <= 255
+
+ # Define colors from arguments
+ black = _color(black, "RGB")
+ white = _color(white, "RGB")
+ if mid is not None:
+ mid = _color(mid, "RGB")
+
+ # Empty lists for the mapping
+ red = []
+ green = []
+ blue = []
+
+ # Create the low-end values
+ for i in range(0, blackpoint):
+ red.append(black[0])
+ green.append(black[1])
+ blue.append(black[2])
+
+ # Create the mapping (2-color)
+ if mid is None:
+
+ range_map = range(0, whitepoint - blackpoint)
+
+ for i in range_map:
+ red.append(black[0] + i * (white[0] - black[0]) // len(range_map))
+ green.append(black[1] + i * (white[1] - black[1]) // len(range_map))
+ blue.append(black[2] + i * (white[2] - black[2]) // len(range_map))
+
+ # Create the mapping (3-color)
+ else:
+
+ range_map1 = range(0, midpoint - blackpoint)
+ range_map2 = range(0, whitepoint - midpoint)
+
+ for i in range_map1:
+ red.append(black[0] + i * (mid[0] - black[0]) // len(range_map1))
+ green.append(black[1] + i * (mid[1] - black[1]) // len(range_map1))
+ blue.append(black[2] + i * (mid[2] - black[2]) // len(range_map1))
+ for i in range_map2:
+ red.append(mid[0] + i * (white[0] - mid[0]) // len(range_map2))
+ green.append(mid[1] + i * (white[1] - mid[1]) // len(range_map2))
+ blue.append(mid[2] + i * (white[2] - mid[2]) // len(range_map2))
+
+ # Create the high-end values
+ for i in range(0, 256 - whitepoint):
+ red.append(white[0])
+ green.append(white[1])
+ blue.append(white[2])
+
+ # Return converted image
+ image = image.convert("RGB")
+ return _lut(image, red + green + blue)
+
+
+def pad(image, size, method=Image.BICUBIC, color=None, centering=(0.5, 0.5)):
+ """
+ Returns a sized and padded version of the image, expanded to fill the
+ requested aspect ratio and size.
+
+ :param image: The image to size and crop.
+ :param size: The requested output size in pixels, given as a
+ (width, height) tuple.
+ :param method: What resampling method to use. Default is
+ :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`.
+ :param color: The background color of the padded image.
+ :param centering: Control the position of the original image within the
+ padded version.
+
+ (0.5, 0.5) will keep the image centered
+ (0, 0) will keep the image aligned to the top left
+ (1, 1) will keep the image aligned to the bottom
+ right
+ :return: An image.
+ """
+
+ im_ratio = image.width / image.height
+ dest_ratio = size[0] / size[1]
+
+ if im_ratio == dest_ratio:
+ out = image.resize(size, resample=method)
+ else:
+ out = Image.new(image.mode, size, color)
+ if im_ratio > dest_ratio:
+ new_height = int(image.height / image.width * size[0])
+ if new_height != size[1]:
+ image = image.resize((size[0], new_height), resample=method)
+
+ y = int((size[1] - new_height) * max(0, min(centering[1], 1)))
+ out.paste(image, (0, y))
+ else:
+ new_width = int(image.width / image.height * size[1])
+ if new_width != size[0]:
+ image = image.resize((new_width, size[1]), resample=method)
+
+ x = int((size[0] - new_width) * max(0, min(centering[0], 1)))
+ out.paste(image, (x, 0))
+ return out
+
+
+def crop(image, border=0):
+ """
+ Remove border from image. The same amount of pixels are removed
+ from all four sides. This function works on all image modes.
+
+ .. seealso:: :py:meth:`~PIL.Image.Image.crop`
+
+ :param image: The image to crop.
+ :param border: The number of pixels to remove.
+ :return: An image.
+ """
+ left, top, right, bottom = _border(border)
+ return image.crop((left, top, image.size[0] - right, image.size[1] - bottom))
+
+
+def scale(image, factor, resample=Image.BICUBIC):
+ """
+ Returns a rescaled image by a specific factor given in parameter.
+ A factor greater than 1 expands the image, between 0 and 1 contracts the
+ image.
+
+ :param image: The image to rescale.
+ :param factor: The expansion factor, as a float.
+ :param resample: What resampling method to use. Default is
+ :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`.
+ :returns: An :py:class:`~PIL.Image.Image` object.
+ """
+ if factor == 1:
+ return image.copy()
+ elif factor <= 0:
+ raise ValueError("the factor must be greater than 0")
+ else:
+ size = (round(factor * image.width), round(factor * image.height))
+ return image.resize(size, resample)
+
+
+def deform(image, deformer, resample=Image.BILINEAR):
+ """
+ Deform the image.
+
+ :param image: The image to deform.
+ :param deformer: A deformer object. Any object that implements a
+ **getmesh** method can be used.
+ :param resample: An optional resampling filter. Same values possible as
+ in the PIL.Image.transform function.
+ :return: An image.
+ """
+ return image.transform(image.size, Image.MESH, deformer.getmesh(image), resample)
+
+
+def equalize(image, mask=None):
+ """
+ Equalize the image histogram. This function applies a non-linear
+ mapping to the input image, in order to create a uniform
+ distribution of grayscale values in the output image.
+
+ :param image: The image to equalize.
+ :param mask: An optional mask. If given, only the pixels selected by
+ the mask are included in the analysis.
+ :return: An image.
+ """
+ if image.mode == "P":
+ image = image.convert("RGB")
+ h = image.histogram(mask)
+ lut = []
+ for b in range(0, len(h), 256):
+ histo = [_f for _f in h[b : b + 256] if _f]
+ if len(histo) <= 1:
+ lut.extend(list(range(256)))
+ else:
+ step = (functools.reduce(operator.add, histo) - histo[-1]) // 255
+ if not step:
+ lut.extend(list(range(256)))
+ else:
+ n = step // 2
+ for i in range(256):
+ lut.append(n // step)
+ n = n + h[i + b]
+ return _lut(image, lut)
+
+
+def expand(image, border=0, fill=0):
+ """
+ Add border to the image
+
+ :param image: The image to expand.
+ :param border: Border width, in pixels.
+ :param fill: Pixel fill value (a color value). Default is 0 (black).
+ :return: An image.
+ """
+ left, top, right, bottom = _border(border)
+ width = left + image.size[0] + right
+ height = top + image.size[1] + bottom
+ out = Image.new(image.mode, (width, height), _color(fill, image.mode))
+ out.paste(image, (left, top))
+ return out
+
+
+def fit(image, size, method=Image.BICUBIC, bleed=0.0, centering=(0.5, 0.5)):
+ """
+ Returns a sized and cropped version of the image, cropped to the
+ requested aspect ratio and size.
+
+ This function was contributed by Kevin Cazabon.
+
+ :param image: The image to size and crop.
+ :param size: The requested output size in pixels, given as a
+ (width, height) tuple.
+ :param method: What resampling method to use. Default is
+ :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`.
+ :param bleed: Remove a border around the outside of the image from all
+ four edges. The value is a decimal percentage (use 0.01 for
+ one percent). The default value is 0 (no border).
+ Cannot be greater than or equal to 0.5.
+ :param centering: Control the cropping position. Use (0.5, 0.5) for
+ center cropping (e.g. if cropping the width, take 50% off
+ of the left side, and therefore 50% off the right side).
+ (0.0, 0.0) will crop from the top left corner (i.e. if
+ cropping the width, take all of the crop off of the right
+ side, and if cropping the height, take all of it off the
+ bottom). (1.0, 0.0) will crop from the bottom left
+ corner, etc. (i.e. if cropping the width, take all of the
+ crop off the left side, and if cropping the height take
+ none from the top, and therefore all off the bottom).
+ :return: An image.
+ """
+
+ # by Kevin Cazabon, Feb 17/2000
+ # kevin@cazabon.com
+ # http://www.cazabon.com
+
+ # ensure centering is mutable
+ centering = list(centering)
+
+ if not 0.0 <= centering[0] <= 1.0:
+ centering[0] = 0.5
+ if not 0.0 <= centering[1] <= 1.0:
+ centering[1] = 0.5
+
+ if not 0.0 <= bleed < 0.5:
+ bleed = 0.0
+
+ # calculate the area to use for resizing and cropping, subtracting
+ # the 'bleed' around the edges
+
+ # number of pixels to trim off on Top and Bottom, Left and Right
+ bleed_pixels = (bleed * image.size[0], bleed * image.size[1])
+
+ live_size = (
+ image.size[0] - bleed_pixels[0] * 2,
+ image.size[1] - bleed_pixels[1] * 2,
+ )
+
+ # calculate the aspect ratio of the live_size
+ live_size_ratio = live_size[0] / live_size[1]
+
+ # calculate the aspect ratio of the output image
+ output_ratio = size[0] / size[1]
+
+ # figure out if the sides or top/bottom will be cropped off
+ if live_size_ratio == output_ratio:
+ # live_size is already the needed ratio
+ crop_width = live_size[0]
+ crop_height = live_size[1]
+ elif live_size_ratio >= output_ratio:
+ # live_size is wider than what's needed, crop the sides
+ crop_width = output_ratio * live_size[1]
+ crop_height = live_size[1]
+ else:
+ # live_size is taller than what's needed, crop the top and bottom
+ crop_width = live_size[0]
+ crop_height = live_size[0] / output_ratio
+
+ # make the crop
+ crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering[0]
+ crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering[1]
+
+ crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height)
+
+ # resize the image and return it
+ return image.resize(size, method, box=crop)
+
+
+def flip(image):
+ """
+ Flip the image vertically (top to bottom).
+
+ :param image: The image to flip.
+ :return: An image.
+ """
+ return image.transpose(Image.FLIP_TOP_BOTTOM)
+
+
+def grayscale(image):
+ """
+ Convert the image to grayscale.
+
+ :param image: The image to convert.
+ :return: An image.
+ """
+ return image.convert("L")
+
+
+def invert(image):
+ """
+ Invert (negate) the image.
+
+ :param image: The image to invert.
+ :return: An image.
+ """
+ lut = []
+ for i in range(256):
+ lut.append(255 - i)
+ return _lut(image, lut)
+
+
+def mirror(image):
+ """
+ Flip image horizontally (left to right).
+
+ :param image: The image to mirror.
+ :return: An image.
+ """
+ return image.transpose(Image.FLIP_LEFT_RIGHT)
+
+
+def posterize(image, bits):
+ """
+ Reduce the number of bits for each color channel.
+
+ :param image: The image to posterize.
+ :param bits: The number of bits to keep for each channel (1-8).
+ :return: An image.
+ """
+ lut = []
+ mask = ~(2 ** (8 - bits) - 1)
+ for i in range(256):
+ lut.append(i & mask)
+ return _lut(image, lut)
+
+
+def solarize(image, threshold=128):
+ """
+ Invert all pixel values above a threshold.
+
+ :param image: The image to solarize.
+ :param threshold: All pixels above this greyscale level are inverted.
+ :return: An image.
+ """
+ lut = []
+ for i in range(256):
+ if i < threshold:
+ lut.append(i)
+ else:
+ lut.append(255 - i)
+ return _lut(image, lut)
+
+
+def exif_transpose(image):
+ """
+ If an image has an EXIF Orientation tag, return a new image that is
+ transposed accordingly. Otherwise, return a copy of the image.
+
+ :param image: The image to transpose.
+ :return: An image.
+ """
+ exif = image.getexif()
+ orientation = exif.get(0x0112)
+ method = {
+ 2: Image.FLIP_LEFT_RIGHT,
+ 3: Image.ROTATE_180,
+ 4: Image.FLIP_TOP_BOTTOM,
+ 5: Image.TRANSPOSE,
+ 6: Image.ROTATE_270,
+ 7: Image.TRANSVERSE,
+ 8: Image.ROTATE_90,
+ }.get(orientation)
+ if method is not None:
+ transposed_image = image.transpose(method)
+ del exif[0x0112]
+ transposed_image.info["exif"] = exif.tobytes()
+ return transposed_image
+ return image.copy()
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImagePalette.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImagePalette.py
new file mode 100644
index 0000000..e0d439c
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImagePalette.py
@@ -0,0 +1,221 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# image palette object
+#
+# History:
+# 1996-03-11 fl Rewritten.
+# 1997-01-03 fl Up and running.
+# 1997-08-23 fl Added load hack
+# 2001-04-16 fl Fixed randint shadow bug in random()
+#
+# Copyright (c) 1997-2001 by Secret Labs AB
+# Copyright (c) 1996-1997 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import array
+
+from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile
+
+
+class ImagePalette:
+ """
+ Color palette for palette mapped images
+
+ :param mode: The mode to use for the Palette. See:
+ :ref:`concept-modes`. Defaults to "RGB"
+ :param palette: An optional palette. If given, it must be a bytearray,
+ an array or a list of ints between 0-255 and of length ``size``
+ times the number of colors in ``mode``. The list must be aligned
+ by channel (All R values must be contiguous in the list before G
+ and B values.) Defaults to 0 through 255 per channel.
+ :param size: An optional palette size. If given, it cannot be equal to
+ or greater than 256. Defaults to 0.
+ """
+
+ def __init__(self, mode="RGB", palette=None, size=0):
+ self.mode = mode
+ self.rawmode = None # if set, palette contains raw data
+ self.palette = palette or bytearray(range(256)) * len(self.mode)
+ self.colors = {}
+ self.dirty = None
+ if (size == 0 and len(self.mode) * 256 != len(self.palette)) or (
+ size != 0 and size != len(self.palette)
+ ):
+ raise ValueError("wrong palette size")
+
+ def copy(self):
+ new = ImagePalette()
+
+ new.mode = self.mode
+ new.rawmode = self.rawmode
+ if self.palette is not None:
+ new.palette = self.palette[:]
+ new.colors = self.colors.copy()
+ new.dirty = self.dirty
+
+ return new
+
+ def getdata(self):
+ """
+ Get palette contents in format suitable for the low-level
+ ``im.putpalette`` primitive.
+
+ .. warning:: This method is experimental.
+ """
+ if self.rawmode:
+ return self.rawmode, self.palette
+ return self.mode + ";L", self.tobytes()
+
+ def tobytes(self):
+ """Convert palette to bytes.
+
+ .. warning:: This method is experimental.
+ """
+ if self.rawmode:
+ raise ValueError("palette contains raw palette data")
+ if isinstance(self.palette, bytes):
+ return self.palette
+ arr = array.array("B", self.palette)
+ if hasattr(arr, "tobytes"):
+ return arr.tobytes()
+ return arr.tostring()
+
+ # Declare tostring as an alias for tobytes
+ tostring = tobytes
+
+ def getcolor(self, color):
+ """Given an rgb tuple, allocate palette entry.
+
+ .. warning:: This method is experimental.
+ """
+ if self.rawmode:
+ raise ValueError("palette contains raw palette data")
+ if isinstance(color, tuple):
+ try:
+ return self.colors[color]
+ except KeyError:
+ # allocate new color slot
+ if isinstance(self.palette, bytes):
+ self.palette = bytearray(self.palette)
+ index = len(self.colors)
+ if index >= 256:
+ raise ValueError("cannot allocate more than 256 colors")
+ self.colors[color] = index
+ self.palette[index] = color[0]
+ self.palette[index + 256] = color[1]
+ self.palette[index + 512] = color[2]
+ self.dirty = 1
+ return index
+ else:
+ raise ValueError("unknown color specifier: %r" % color)
+
+ def save(self, fp):
+ """Save palette to text file.
+
+ .. warning:: This method is experimental.
+ """
+ if self.rawmode:
+ raise ValueError("palette contains raw palette data")
+ if isinstance(fp, str):
+ fp = open(fp, "w")
+ fp.write("# Palette\n")
+ fp.write("# Mode: %s\n" % self.mode)
+ for i in range(256):
+ fp.write("%d" % i)
+ for j in range(i * len(self.mode), (i + 1) * len(self.mode)):
+ try:
+ fp.write(" %d" % self.palette[j])
+ except IndexError:
+ fp.write(" 0")
+ fp.write("\n")
+ fp.close()
+
+
+# --------------------------------------------------------------------
+# Internal
+
+
+def raw(rawmode, data):
+ palette = ImagePalette()
+ palette.rawmode = rawmode
+ palette.palette = data
+ palette.dirty = 1
+ return palette
+
+
+# --------------------------------------------------------------------
+# Factories
+
+
+def make_linear_lut(black, white):
+ lut = []
+ if black == 0:
+ for i in range(256):
+ lut.append(white * i // 255)
+ else:
+ raise NotImplementedError # FIXME
+ return lut
+
+
+def make_gamma_lut(exp):
+ lut = []
+ for i in range(256):
+ lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5))
+ return lut
+
+
+def negative(mode="RGB"):
+ palette = list(range(256))
+ palette.reverse()
+ return ImagePalette(mode, palette * len(mode))
+
+
+def random(mode="RGB"):
+ from random import randint
+
+ palette = []
+ for i in range(256 * len(mode)):
+ palette.append(randint(0, 255))
+ return ImagePalette(mode, palette)
+
+
+def sepia(white="#fff0c0"):
+ r, g, b = ImageColor.getrgb(white)
+ r = make_linear_lut(0, r)
+ g = make_linear_lut(0, g)
+ b = make_linear_lut(0, b)
+ return ImagePalette("RGB", r + g + b)
+
+
+def wedge(mode="RGB"):
+ return ImagePalette(mode, list(range(256)) * len(mode))
+
+
+def load(filename):
+
+ # FIXME: supports GIMP gradients only
+
+ with open(filename, "rb") as fp:
+
+ for paletteHandler in [
+ GimpPaletteFile.GimpPaletteFile,
+ GimpGradientFile.GimpGradientFile,
+ PaletteFile.PaletteFile,
+ ]:
+ try:
+ fp.seek(0)
+ lut = paletteHandler(fp).getpalette()
+ if lut:
+ break
+ except (SyntaxError, ValueError):
+ # import traceback
+ # traceback.print_exc()
+ pass
+ else:
+ raise OSError("cannot load palette")
+
+ return lut # data, rawmode
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImagePath.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImagePath.py
new file mode 100644
index 0000000..3d3538c
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImagePath.py
@@ -0,0 +1,19 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# path interface
+#
+# History:
+# 1996-11-04 fl Created
+# 2002-04-14 fl Added documentation stub class
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1996.
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image
+
+Path = Image.core.path
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageQt.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageQt.py
new file mode 100644
index 0000000..dfe2f80
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageQt.py
@@ -0,0 +1,200 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# a simple Qt image interface.
+#
+# history:
+# 2006-06-03 fl: created
+# 2006-06-04 fl: inherit from QImage instead of wrapping it
+# 2006-06-05 fl: removed toimage helper; move string support to ImageQt
+# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com)
+#
+# Copyright (c) 2006 by Secret Labs AB
+# Copyright (c) 2006 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import sys
+from io import BytesIO
+
+from . import Image
+from ._util import isPath
+
+qt_versions = [["5", "PyQt5"], ["side2", "PySide2"]]
+
+# If a version has already been imported, attempt it first
+qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True)
+for qt_version, qt_module in qt_versions:
+ try:
+ if qt_module == "PyQt5":
+ from PyQt5.QtGui import QImage, qRgba, QPixmap
+ from PyQt5.QtCore import QBuffer, QIODevice
+ elif qt_module == "PySide2":
+ from PySide2.QtGui import QImage, qRgba, QPixmap
+ from PySide2.QtCore import QBuffer, QIODevice
+ except (ImportError, RuntimeError):
+ continue
+ qt_is_installed = True
+ break
+else:
+ qt_is_installed = False
+ qt_version = None
+
+
+def rgb(r, g, b, a=255):
+ """(Internal) Turns an RGB color into a Qt compatible color integer."""
+ # use qRgb to pack the colors, and then turn the resulting long
+ # into a negative integer with the same bitpattern.
+ return qRgba(r, g, b, a) & 0xFFFFFFFF
+
+
+def fromqimage(im):
+ """
+ :param im: A PIL Image object, or a file name
+ (given either as Python string or a PyQt string object)
+ """
+ buffer = QBuffer()
+ buffer.open(QIODevice.ReadWrite)
+ # preserve alpha channel with png
+ # otherwise ppm is more friendly with Image.open
+ if im.hasAlphaChannel():
+ im.save(buffer, "png")
+ else:
+ im.save(buffer, "ppm")
+
+ b = BytesIO()
+ b.write(buffer.data())
+ buffer.close()
+ b.seek(0)
+
+ return Image.open(b)
+
+
+def fromqpixmap(im):
+ return fromqimage(im)
+ # buffer = QBuffer()
+ # buffer.open(QIODevice.ReadWrite)
+ # # im.save(buffer)
+ # # What if png doesn't support some image features like animation?
+ # im.save(buffer, 'ppm')
+ # bytes_io = BytesIO()
+ # bytes_io.write(buffer.data())
+ # buffer.close()
+ # bytes_io.seek(0)
+ # return Image.open(bytes_io)
+
+
+def align8to32(bytes, width, mode):
+ """
+ converts each scanline of data from 8 bit to 32 bit aligned
+ """
+
+ bits_per_pixel = {"1": 1, "L": 8, "P": 8}[mode]
+
+ # calculate bytes per line and the extra padding if needed
+ bits_per_line = bits_per_pixel * width
+ full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8)
+ bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0)
+
+ extra_padding = -bytes_per_line % 4
+
+ # already 32 bit aligned by luck
+ if not extra_padding:
+ return bytes
+
+ new_data = []
+ for i in range(len(bytes) // bytes_per_line):
+ new_data.append(
+ bytes[i * bytes_per_line : (i + 1) * bytes_per_line]
+ + b"\x00" * extra_padding
+ )
+
+ return b"".join(new_data)
+
+
+def _toqclass_helper(im):
+ data = None
+ colortable = None
+
+ # handle filename, if given instead of image name
+ if hasattr(im, "toUtf8"):
+ # FIXME - is this really the best way to do this?
+ im = str(im.toUtf8(), "utf-8")
+ if isPath(im):
+ im = Image.open(im)
+
+ if im.mode == "1":
+ format = QImage.Format_Mono
+ elif im.mode == "L":
+ format = QImage.Format_Indexed8
+ colortable = []
+ for i in range(256):
+ colortable.append(rgb(i, i, i))
+ elif im.mode == "P":
+ format = QImage.Format_Indexed8
+ colortable = []
+ palette = im.getpalette()
+ for i in range(0, len(palette), 3):
+ colortable.append(rgb(*palette[i : i + 3]))
+ elif im.mode == "RGB":
+ data = im.tobytes("raw", "BGRX")
+ format = QImage.Format_RGB32
+ elif im.mode == "RGBA":
+ try:
+ data = im.tobytes("raw", "BGRA")
+ except SystemError:
+ # workaround for earlier versions
+ r, g, b, a = im.split()
+ im = Image.merge("RGBA", (b, g, r, a))
+ format = QImage.Format_ARGB32
+ else:
+ raise ValueError("unsupported image mode %r" % im.mode)
+
+ __data = data or align8to32(im.tobytes(), im.size[0], im.mode)
+ return {"data": __data, "im": im, "format": format, "colortable": colortable}
+
+
+if qt_is_installed:
+
+ class ImageQt(QImage):
+ def __init__(self, im):
+ """
+ An PIL image wrapper for Qt. This is a subclass of PyQt's QImage
+ class.
+
+ :param im: A PIL Image object, or a file name (given either as
+ Python string or a PyQt string object).
+ """
+ im_data = _toqclass_helper(im)
+ # must keep a reference, or Qt will crash!
+ # All QImage constructors that take data operate on an existing
+ # buffer, so this buffer has to hang on for the life of the image.
+ # Fixes https://github.com/python-pillow/Pillow/issues/1370
+ self.__data = im_data["data"]
+ super().__init__(
+ self.__data,
+ im_data["im"].size[0],
+ im_data["im"].size[1],
+ im_data["format"],
+ )
+ if im_data["colortable"]:
+ self.setColorTable(im_data["colortable"])
+
+
+def toqimage(im):
+ return ImageQt(im)
+
+
+def toqpixmap(im):
+ # # This doesn't work. For now using a dumb approach.
+ # im_data = _toqclass_helper(im)
+ # result = QPixmap(im_data['im'].size[0], im_data['im'].size[1])
+ # result.loadFromData(im_data['data'])
+ # Fix some strange bug that causes
+ if im.mode == "RGB":
+ im = im.convert("RGBA")
+
+ qimage = toqimage(im)
+ return QPixmap.fromImage(qimage)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageSequence.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageSequence.py
new file mode 100644
index 0000000..4e9f5c2
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageSequence.py
@@ -0,0 +1,75 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# sequence support classes
+#
+# history:
+# 1997-02-20 fl Created
+#
+# Copyright (c) 1997 by Secret Labs AB.
+# Copyright (c) 1997 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+##
+
+
+class Iterator:
+ """
+ This class implements an iterator object that can be used to loop
+ over an image sequence.
+
+ You can use the ``[]`` operator to access elements by index. This operator
+ will raise an :py:exc:`IndexError` if you try to access a nonexistent
+ frame.
+
+ :param im: An image object.
+ """
+
+ def __init__(self, im):
+ if not hasattr(im, "seek"):
+ raise AttributeError("im must have seek method")
+ self.im = im
+ self.position = getattr(self.im, "_min_frame", 0)
+
+ def __getitem__(self, ix):
+ try:
+ self.im.seek(ix)
+ return self.im
+ except EOFError:
+ raise IndexError # end of sequence
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ try:
+ self.im.seek(self.position)
+ self.position += 1
+ return self.im
+ except EOFError:
+ raise StopIteration
+
+
+def all_frames(im, func=None):
+ """
+ Applies a given function to all frames in an image or a list of images.
+ The frames are returned as a list of separate images.
+
+ :param im: An image, or a list of images.
+ :param func: The function to apply to all of the image frames.
+ :returns: A list of images.
+ """
+ if not isinstance(im, list):
+ im = [im]
+
+ ims = []
+ for imSequence in im:
+ current = imSequence.tell()
+
+ ims += [im_frame.copy() for im_frame in Iterator(imSequence)]
+
+ imSequence.seek(current)
+ return [func(im) for im in ims] if func else ims
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageShow.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageShow.py
new file mode 100644
index 0000000..fc50894
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageShow.py
@@ -0,0 +1,207 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# im.show() drivers
+#
+# History:
+# 2008-04-06 fl Created
+#
+# Copyright (c) Secret Labs AB 2008.
+#
+# See the README file for information on usage and redistribution.
+#
+import os
+import shutil
+import subprocess
+import sys
+import tempfile
+from shlex import quote
+
+from PIL import Image
+
+_viewers = []
+
+
+def register(viewer, order=1):
+ try:
+ if issubclass(viewer, Viewer):
+ viewer = viewer()
+ except TypeError:
+ pass # raised if viewer wasn't a class
+ if order > 0:
+ _viewers.append(viewer)
+ elif order < 0:
+ _viewers.insert(0, viewer)
+
+
+def show(image, title=None, **options):
+ r"""
+ Display a given image.
+
+ :param image: An image object.
+ :param title: Optional title. Not all viewers can display the title.
+ :param \**options: Additional viewer options.
+ :returns: True if a suitable viewer was found, false otherwise.
+ """
+ for viewer in _viewers:
+ if viewer.show(image, title=title, **options):
+ return 1
+ return 0
+
+
+class Viewer:
+ """Base class for viewers."""
+
+ # main api
+
+ def show(self, image, **options):
+
+ # save temporary image to disk
+ if not (
+ image.mode in ("1", "RGBA") or (self.format == "PNG" and image.mode == "LA")
+ ):
+ base = Image.getmodebase(image.mode)
+ if image.mode != base:
+ image = image.convert(base)
+
+ return self.show_image(image, **options)
+
+ # hook methods
+
+ format = None
+ options = {}
+
+ def get_format(self, image):
+ """Return format name, or None to save as PGM/PPM"""
+ return self.format
+
+ def get_command(self, file, **options):
+ raise NotImplementedError
+
+ def save_image(self, image):
+ """Save to temporary file, and return filename"""
+ return image._dump(format=self.get_format(image), **self.options)
+
+ def show_image(self, image, **options):
+ """Display given image"""
+ return self.show_file(self.save_image(image), **options)
+
+ def show_file(self, file, **options):
+ """Display given file"""
+ os.system(self.get_command(file, **options))
+ return 1
+
+
+# --------------------------------------------------------------------
+
+
+if sys.platform == "win32":
+
+ class WindowsViewer(Viewer):
+ format = "PNG"
+ options = {"compress_level": 1}
+
+ def get_command(self, file, **options):
+ return (
+ 'start "Pillow" /WAIT "%s" '
+ "&& ping -n 2 127.0.0.1 >NUL "
+ '&& del /f "%s"' % (file, file)
+ )
+
+ register(WindowsViewer)
+
+elif sys.platform == "darwin":
+
+ class MacViewer(Viewer):
+ format = "PNG"
+ options = {"compress_level": 1}
+
+ def get_command(self, file, **options):
+ # on darwin open returns immediately resulting in the temp
+ # file removal while app is opening
+ command = "open -a Preview.app"
+ command = "({} {}; sleep 20; rm -f {})&".format(
+ command, quote(file), quote(file)
+ )
+ return command
+
+ def show_file(self, file, **options):
+ """Display given file"""
+ fd, path = tempfile.mkstemp()
+ with os.fdopen(fd, "w") as f:
+ f.write(file)
+ with open(path, "r") as f:
+ subprocess.Popen(
+ ["im=$(cat); open -a Preview.app $im; sleep 20; rm -f $im"],
+ shell=True,
+ stdin=f,
+ )
+ os.remove(path)
+ return 1
+
+ register(MacViewer)
+
+else:
+
+ # unixoids
+
+ class UnixViewer(Viewer):
+ format = "PNG"
+ options = {"compress_level": 1}
+
+ def get_command(self, file, **options):
+ command = self.get_command_ex(file, **options)[0]
+ return "({} {}; rm -f {})&".format(command, quote(file), quote(file))
+
+ def show_file(self, file, **options):
+ """Display given file"""
+ fd, path = tempfile.mkstemp()
+ with os.fdopen(fd, "w") as f:
+ f.write(file)
+ with open(path, "r") as f:
+ command = self.get_command_ex(file, **options)[0]
+ subprocess.Popen(
+ ["im=$(cat);" + command + " $im; rm -f $im"], shell=True, stdin=f
+ )
+ os.remove(path)
+ return 1
+
+ # implementations
+
+ class DisplayViewer(UnixViewer):
+ def get_command_ex(self, file, **options):
+ command = executable = "display"
+ return command, executable
+
+ if shutil.which("display"):
+ register(DisplayViewer)
+
+ class EogViewer(UnixViewer):
+ def get_command_ex(self, file, **options):
+ command = executable = "eog"
+ return command, executable
+
+ if shutil.which("eog"):
+ register(EogViewer)
+
+ class XVViewer(UnixViewer):
+ def get_command_ex(self, file, title=None, **options):
+ # note: xv is pretty outdated. most modern systems have
+ # imagemagick's display command instead.
+ command = executable = "xv"
+ if title:
+ command += " -name %s" % quote(title)
+ return command, executable
+
+ if shutil.which("xv"):
+ register(XVViewer)
+
+if __name__ == "__main__":
+
+ if len(sys.argv) < 2:
+ print("Syntax: python ImageShow.py imagefile [title]")
+ sys.exit()
+
+ with Image.open(sys.argv[1]) as im:
+ print(show(im, *sys.argv[2:]))
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageStat.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageStat.py
new file mode 100644
index 0000000..50bafc9
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageStat.py
@@ -0,0 +1,147 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# global image statistics
+#
+# History:
+# 1996-04-05 fl Created
+# 1997-05-21 fl Added mask; added rms, var, stddev attributes
+# 1997-08-05 fl Added median
+# 1998-07-05 hk Fixed integer overflow error
+#
+# Notes:
+# This class shows how to implement delayed evaluation of attributes.
+# To get a certain value, simply access the corresponding attribute.
+# The __getattr__ dispatcher takes care of the rest.
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1996-97.
+#
+# See the README file for information on usage and redistribution.
+#
+
+import functools
+import math
+import operator
+
+
+class Stat:
+ def __init__(self, image_or_list, mask=None):
+ try:
+ if mask:
+ self.h = image_or_list.histogram(mask)
+ else:
+ self.h = image_or_list.histogram()
+ except AttributeError:
+ self.h = image_or_list # assume it to be a histogram list
+ if not isinstance(self.h, list):
+ raise TypeError("first argument must be image or list")
+ self.bands = list(range(len(self.h) // 256))
+
+ def __getattr__(self, id):
+ """Calculate missing attribute"""
+ if id[:4] == "_get":
+ raise AttributeError(id)
+ # calculate missing attribute
+ v = getattr(self, "_get" + id)()
+ setattr(self, id, v)
+ return v
+
+ def _getextrema(self):
+ """Get min/max values for each band in the image"""
+
+ def minmax(histogram):
+ n = 255
+ x = 0
+ for i in range(256):
+ if histogram[i]:
+ n = min(n, i)
+ x = max(x, i)
+ return n, x # returns (255, 0) if there's no data in the histogram
+
+ v = []
+ for i in range(0, len(self.h), 256):
+ v.append(minmax(self.h[i:]))
+ return v
+
+ def _getcount(self):
+ """Get total number of pixels in each layer"""
+
+ v = []
+ for i in range(0, len(self.h), 256):
+ v.append(functools.reduce(operator.add, self.h[i : i + 256]))
+ return v
+
+ def _getsum(self):
+ """Get sum of all pixels in each layer"""
+
+ v = []
+ for i in range(0, len(self.h), 256):
+ layerSum = 0.0
+ for j in range(256):
+ layerSum += j * self.h[i + j]
+ v.append(layerSum)
+ return v
+
+ def _getsum2(self):
+ """Get squared sum of all pixels in each layer"""
+
+ v = []
+ for i in range(0, len(self.h), 256):
+ sum2 = 0.0
+ for j in range(256):
+ sum2 += (j ** 2) * float(self.h[i + j])
+ v.append(sum2)
+ return v
+
+ def _getmean(self):
+ """Get average pixel level for each layer"""
+
+ v = []
+ for i in self.bands:
+ v.append(self.sum[i] / self.count[i])
+ return v
+
+ def _getmedian(self):
+ """Get median pixel level for each layer"""
+
+ v = []
+ for i in self.bands:
+ s = 0
+ half = self.count[i] // 2
+ b = i * 256
+ for j in range(256):
+ s = s + self.h[b + j]
+ if s > half:
+ break
+ v.append(j)
+ return v
+
+ def _getrms(self):
+ """Get RMS for each layer"""
+
+ v = []
+ for i in self.bands:
+ v.append(math.sqrt(self.sum2[i] / self.count[i]))
+ return v
+
+ def _getvar(self):
+ """Get variance for each layer"""
+
+ v = []
+ for i in self.bands:
+ n = self.count[i]
+ v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n)
+ return v
+
+ def _getstddev(self):
+ """Get standard deviation for each layer"""
+
+ v = []
+ for i in self.bands:
+ v.append(math.sqrt(self.var[i]))
+ return v
+
+
+Global = Stat # compatibility
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageTk.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageTk.py
new file mode 100644
index 0000000..ee707cf
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageTk.py
@@ -0,0 +1,300 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# a Tk display interface
+#
+# History:
+# 96-04-08 fl Created
+# 96-09-06 fl Added getimage method
+# 96-11-01 fl Rewritten, removed image attribute and crop method
+# 97-05-09 fl Use PyImagingPaste method instead of image type
+# 97-05-12 fl Minor tweaks to match the IFUNC95 interface
+# 97-05-17 fl Support the "pilbitmap" booster patch
+# 97-06-05 fl Added file= and data= argument to image constructors
+# 98-03-09 fl Added width and height methods to Image classes
+# 98-07-02 fl Use default mode for "P" images without palette attribute
+# 98-07-02 fl Explicitly destroy Tkinter image objects
+# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch)
+# 99-07-26 fl Automatically hook into Tkinter (if possible)
+# 99-08-15 fl Hook uses _imagingtk instead of _imaging
+#
+# Copyright (c) 1997-1999 by Secret Labs AB
+# Copyright (c) 1996-1997 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import tkinter
+from io import BytesIO
+
+from . import Image
+
+# --------------------------------------------------------------------
+# Check for Tkinter interface hooks
+
+_pilbitmap_ok = None
+
+
+def _pilbitmap_check():
+ global _pilbitmap_ok
+ if _pilbitmap_ok is None:
+ try:
+ im = Image.new("1", (1, 1))
+ tkinter.BitmapImage(data="PIL:%d" % im.im.id)
+ _pilbitmap_ok = 1
+ except tkinter.TclError:
+ _pilbitmap_ok = 0
+ return _pilbitmap_ok
+
+
+def _get_image_from_kw(kw):
+ source = None
+ if "file" in kw:
+ source = kw.pop("file")
+ elif "data" in kw:
+ source = BytesIO(kw.pop("data"))
+ if source:
+ return Image.open(source)
+
+
+# --------------------------------------------------------------------
+# PhotoImage
+
+
+class PhotoImage:
+ """
+ A Tkinter-compatible photo image. This can be used
+ everywhere Tkinter expects an image object. If the image is an RGBA
+ image, pixels having alpha 0 are treated as transparent.
+
+ The constructor takes either a PIL image, or a mode and a size.
+ Alternatively, you can use the **file** or **data** options to initialize
+ the photo image object.
+
+ :param image: Either a PIL image, or a mode string. If a mode string is
+ used, a size must also be given.
+ :param size: If the first argument is a mode string, this defines the size
+ of the image.
+ :keyword file: A filename to load the image from (using
+ ``Image.open(file)``).
+ :keyword data: An 8-bit string containing image data (as loaded from an
+ image file).
+ """
+
+ def __init__(self, image=None, size=None, **kw):
+
+ # Tk compatibility: file or data
+ if image is None:
+ image = _get_image_from_kw(kw)
+
+ if hasattr(image, "mode") and hasattr(image, "size"):
+ # got an image instead of a mode
+ mode = image.mode
+ if mode == "P":
+ # palette mapped data
+ image.load()
+ try:
+ mode = image.palette.mode
+ except AttributeError:
+ mode = "RGB" # default
+ size = image.size
+ kw["width"], kw["height"] = size
+ else:
+ mode = image
+ image = None
+
+ if mode not in ["1", "L", "RGB", "RGBA"]:
+ mode = Image.getmodebase(mode)
+
+ self.__mode = mode
+ self.__size = size
+ self.__photo = tkinter.PhotoImage(**kw)
+ self.tk = self.__photo.tk
+ if image:
+ self.paste(image)
+
+ def __del__(self):
+ name = self.__photo.name
+ self.__photo.name = None
+ try:
+ self.__photo.tk.call("image", "delete", name)
+ except Exception:
+ pass # ignore internal errors
+
+ def __str__(self):
+ """
+ Get the Tkinter photo image identifier. This method is automatically
+ called by Tkinter whenever a PhotoImage object is passed to a Tkinter
+ method.
+
+ :return: A Tkinter photo image identifier (a string).
+ """
+ return str(self.__photo)
+
+ def width(self):
+ """
+ Get the width of the image.
+
+ :return: The width, in pixels.
+ """
+ return self.__size[0]
+
+ def height(self):
+ """
+ Get the height of the image.
+
+ :return: The height, in pixels.
+ """
+ return self.__size[1]
+
+ def paste(self, im, box=None):
+ """
+ Paste a PIL image into the photo image. Note that this can
+ be very slow if the photo image is displayed.
+
+ :param im: A PIL image. The size must match the target region. If the
+ mode does not match, the image is converted to the mode of
+ the bitmap image.
+ :param box: A 4-tuple defining the left, upper, right, and lower pixel
+ coordinate. See :ref:`coordinate-system`. If None is given
+ instead of a tuple, all of the image is assumed.
+ """
+
+ # convert to blittable
+ im.load()
+ image = im.im
+ if image.isblock() and im.mode == self.__mode:
+ block = image
+ else:
+ block = image.new_block(self.__mode, im.size)
+ image.convert2(block, image) # convert directly between buffers
+
+ tk = self.__photo.tk
+
+ try:
+ tk.call("PyImagingPhoto", self.__photo, block.id)
+ except tkinter.TclError:
+ # activate Tkinter hook
+ try:
+ from . import _imagingtk
+
+ try:
+ if hasattr(tk, "interp"):
+ # Required for PyPy, which always has CFFI installed
+ from cffi import FFI
+
+ ffi = FFI()
+
+ # PyPy is using an FFI CDATA element
+ # (Pdb) self.tk.interp
+ #
+ _imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1)
+ else:
+ _imagingtk.tkinit(tk.interpaddr(), 1)
+ except AttributeError:
+ _imagingtk.tkinit(id(tk), 0)
+ tk.call("PyImagingPhoto", self.__photo, block.id)
+ except (ImportError, AttributeError, tkinter.TclError):
+ raise # configuration problem; cannot attach to Tkinter
+
+
+# --------------------------------------------------------------------
+# BitmapImage
+
+
+class BitmapImage:
+ """
+ A Tkinter-compatible bitmap image. This can be used everywhere Tkinter
+ expects an image object.
+
+ The given image must have mode "1". Pixels having value 0 are treated as
+ transparent. Options, if any, are passed on to Tkinter. The most commonly
+ used option is **foreground**, which is used to specify the color for the
+ non-transparent parts. See the Tkinter documentation for information on
+ how to specify colours.
+
+ :param image: A PIL image.
+ """
+
+ def __init__(self, image=None, **kw):
+
+ # Tk compatibility: file or data
+ if image is None:
+ image = _get_image_from_kw(kw)
+
+ self.__mode = image.mode
+ self.__size = image.size
+
+ if _pilbitmap_check():
+ # fast way (requires the pilbitmap booster patch)
+ image.load()
+ kw["data"] = "PIL:%d" % image.im.id
+ self.__im = image # must keep a reference
+ else:
+ # slow but safe way
+ kw["data"] = image.tobitmap()
+ self.__photo = tkinter.BitmapImage(**kw)
+
+ def __del__(self):
+ name = self.__photo.name
+ self.__photo.name = None
+ try:
+ self.__photo.tk.call("image", "delete", name)
+ except Exception:
+ pass # ignore internal errors
+
+ def width(self):
+ """
+ Get the width of the image.
+
+ :return: The width, in pixels.
+ """
+ return self.__size[0]
+
+ def height(self):
+ """
+ Get the height of the image.
+
+ :return: The height, in pixels.
+ """
+ return self.__size[1]
+
+ def __str__(self):
+ """
+ Get the Tkinter bitmap image identifier. This method is automatically
+ called by Tkinter whenever a BitmapImage object is passed to a Tkinter
+ method.
+
+ :return: A Tkinter bitmap image identifier (a string).
+ """
+ return str(self.__photo)
+
+
+def getimage(photo):
+ """Copies the contents of a PhotoImage to a PIL image memory."""
+ im = Image.new("RGBA", (photo.width(), photo.height()))
+ block = im.im
+
+ photo.tk.call("PyImagingPhotoGet", photo, block.id)
+
+ return im
+
+
+def _show(image, title):
+ """Helper for the Image.show method."""
+
+ class UI(tkinter.Label):
+ def __init__(self, master, im):
+ if im.mode == "1":
+ self.image = BitmapImage(im, foreground="white", master=master)
+ else:
+ self.image = PhotoImage(im, master=master)
+ super().__init__(master, image=self.image, bg="black", bd=0)
+
+ if not tkinter._default_root:
+ raise OSError("tkinter not initialized")
+ top = tkinter.Toplevel()
+ if title:
+ top.title(title)
+ UI(top, image).pack()
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageTransform.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageTransform.py
new file mode 100644
index 0000000..77791ab
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageTransform.py
@@ -0,0 +1,102 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# transform wrappers
+#
+# History:
+# 2002-04-08 fl Created
+#
+# Copyright (c) 2002 by Secret Labs AB
+# Copyright (c) 2002 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image
+
+
+class Transform(Image.ImageTransformHandler):
+ def __init__(self, data):
+ self.data = data
+
+ def getdata(self):
+ return self.method, self.data
+
+ def transform(self, size, image, **options):
+ # can be overridden
+ method, data = self.getdata()
+ return image.transform(size, method, data, **options)
+
+
+class AffineTransform(Transform):
+ """
+ Define an affine image transform.
+
+ This function takes a 6-tuple (a, b, c, d, e, f) which contain the first
+ two rows from an affine transform matrix. For each pixel (x, y) in the
+ output image, the new value is taken from a position (a x + b y + c,
+ d x + e y + f) in the input image, rounded to nearest pixel.
+
+ This function can be used to scale, translate, rotate, and shear the
+ original image.
+
+ See :py:meth:`~PIL.Image.Image.transform`
+
+ :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows
+ from an affine transform matrix.
+ """
+
+ method = Image.AFFINE
+
+
+class ExtentTransform(Transform):
+ """
+ Define a transform to extract a subregion from an image.
+
+ Maps a rectangle (defined by two corners) from the image to a rectangle of
+ the given size. The resulting image will contain data sampled from between
+ the corners, such that (x0, y0) in the input image will end up at (0,0) in
+ the output image, and (x1, y1) at size.
+
+ This method can be used to crop, stretch, shrink, or mirror an arbitrary
+ rectangle in the current image. It is slightly slower than crop, but about
+ as fast as a corresponding resize operation.
+
+ See :py:meth:`~PIL.Image.Image.transform`
+
+ :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the
+ input image's coordinate system. See :ref:`coordinate-system`.
+ """
+
+ method = Image.EXTENT
+
+
+class QuadTransform(Transform):
+ """
+ Define a quad image transform.
+
+ Maps a quadrilateral (a region defined by four corners) from the image to a
+ rectangle of the given size.
+
+ See :py:meth:`~PIL.Image.Image.transform`
+
+ :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the
+ upper left, lower left, lower right, and upper right corner of the
+ source quadrilateral.
+ """
+
+ method = Image.QUAD
+
+
+class MeshTransform(Transform):
+ """
+ Define a mesh image transform. A mesh transform consists of one or more
+ individual quad transforms.
+
+ See :py:meth:`~PIL.Image.Image.transform`
+
+ :param data: A list of (bbox, quad) tuples.
+ """
+
+ method = Image.MESH
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImageWin.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImageWin.py
new file mode 100644
index 0000000..927b169
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImageWin.py
@@ -0,0 +1,230 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# a Windows DIB display interface
+#
+# History:
+# 1996-05-20 fl Created
+# 1996-09-20 fl Fixed subregion exposure
+# 1997-09-21 fl Added draw primitive (for tzPrint)
+# 2003-05-21 fl Added experimental Window/ImageWindow classes
+# 2003-09-05 fl Added fromstring/tostring methods
+#
+# Copyright (c) Secret Labs AB 1997-2003.
+# Copyright (c) Fredrik Lundh 1996-2003.
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image
+
+
+class HDC:
+ """
+ Wraps an HDC integer. The resulting object can be passed to the
+ :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose`
+ methods.
+ """
+
+ def __init__(self, dc):
+ self.dc = dc
+
+ def __int__(self):
+ return self.dc
+
+
+class HWND:
+ """
+ Wraps an HWND integer. The resulting object can be passed to the
+ :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose`
+ methods, instead of a DC.
+ """
+
+ def __init__(self, wnd):
+ self.wnd = wnd
+
+ def __int__(self):
+ return self.wnd
+
+
+class Dib:
+ """
+ A Windows bitmap with the given mode and size. The mode can be one of "1",
+ "L", "P", or "RGB".
+
+ If the display requires a palette, this constructor creates a suitable
+ palette and associates it with the image. For an "L" image, 128 greylevels
+ are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together
+ with 20 greylevels.
+
+ To make sure that palettes work properly under Windows, you must call the
+ **palette** method upon certain events from Windows.
+
+ :param image: Either a PIL image, or a mode string. If a mode string is
+ used, a size must also be given. The mode can be one of "1",
+ "L", "P", or "RGB".
+ :param size: If the first argument is a mode string, this
+ defines the size of the image.
+ """
+
+ def __init__(self, image, size=None):
+ if hasattr(image, "mode") and hasattr(image, "size"):
+ mode = image.mode
+ size = image.size
+ else:
+ mode = image
+ image = None
+ if mode not in ["1", "L", "P", "RGB"]:
+ mode = Image.getmodebase(mode)
+ self.image = Image.core.display(mode, size)
+ self.mode = mode
+ self.size = size
+ if image:
+ self.paste(image)
+
+ def expose(self, handle):
+ """
+ Copy the bitmap contents to a device context.
+
+ :param handle: Device context (HDC), cast to a Python integer, or an
+ HDC or HWND instance. In PythonWin, you can use the
+ :py:meth:`CDC.GetHandleAttrib` to get a suitable handle.
+ """
+ if isinstance(handle, HWND):
+ dc = self.image.getdc(handle)
+ try:
+ result = self.image.expose(dc)
+ finally:
+ self.image.releasedc(handle, dc)
+ else:
+ result = self.image.expose(handle)
+ return result
+
+ def draw(self, handle, dst, src=None):
+ """
+ Same as expose, but allows you to specify where to draw the image, and
+ what part of it to draw.
+
+ The destination and source areas are given as 4-tuple rectangles. If
+ the source is omitted, the entire image is copied. If the source and
+ the destination have different sizes, the image is resized as
+ necessary.
+ """
+ if not src:
+ src = (0, 0) + self.size
+ if isinstance(handle, HWND):
+ dc = self.image.getdc(handle)
+ try:
+ result = self.image.draw(dc, dst, src)
+ finally:
+ self.image.releasedc(handle, dc)
+ else:
+ result = self.image.draw(handle, dst, src)
+ return result
+
+ def query_palette(self, handle):
+ """
+ Installs the palette associated with the image in the given device
+ context.
+
+ This method should be called upon **QUERYNEWPALETTE** and
+ **PALETTECHANGED** events from Windows. If this method returns a
+ non-zero value, one or more display palette entries were changed, and
+ the image should be redrawn.
+
+ :param handle: Device context (HDC), cast to a Python integer, or an
+ HDC or HWND instance.
+ :return: A true value if one or more entries were changed (this
+ indicates that the image should be redrawn).
+ """
+ if isinstance(handle, HWND):
+ handle = self.image.getdc(handle)
+ try:
+ result = self.image.query_palette(handle)
+ finally:
+ self.image.releasedc(handle, handle)
+ else:
+ result = self.image.query_palette(handle)
+ return result
+
+ def paste(self, im, box=None):
+ """
+ Paste a PIL image into the bitmap image.
+
+ :param im: A PIL image. The size must match the target region.
+ If the mode does not match, the image is converted to the
+ mode of the bitmap image.
+ :param box: A 4-tuple defining the left, upper, right, and
+ lower pixel coordinate. See :ref:`coordinate-system`. If
+ None is given instead of a tuple, all of the image is
+ assumed.
+ """
+ im.load()
+ if self.mode != im.mode:
+ im = im.convert(self.mode)
+ if box:
+ self.image.paste(im.im, box)
+ else:
+ self.image.paste(im.im)
+
+ def frombytes(self, buffer):
+ """
+ Load display memory contents from byte data.
+
+ :param buffer: A buffer containing display data (usually
+ data returned from tobytes)
+ """
+ return self.image.frombytes(buffer)
+
+ def tobytes(self):
+ """
+ Copy display memory contents to bytes object.
+
+ :return: A bytes object containing display data.
+ """
+ return self.image.tobytes()
+
+
+class Window:
+ """Create a Window with the given title size."""
+
+ def __init__(self, title="PIL", width=None, height=None):
+ self.hwnd = Image.core.createwindow(
+ title, self.__dispatcher, width or 0, height or 0
+ )
+
+ def __dispatcher(self, action, *args):
+ return getattr(self, "ui_handle_" + action)(*args)
+
+ def ui_handle_clear(self, dc, x0, y0, x1, y1):
+ pass
+
+ def ui_handle_damage(self, x0, y0, x1, y1):
+ pass
+
+ def ui_handle_destroy(self):
+ pass
+
+ def ui_handle_repair(self, dc, x0, y0, x1, y1):
+ pass
+
+ def ui_handle_resize(self, width, height):
+ pass
+
+ def mainloop(self):
+ Image.core.eventloop()
+
+
+class ImageWindow(Window):
+ """Create an image window which displays the given image."""
+
+ def __init__(self, image, title="PIL"):
+ if not isinstance(image, Dib):
+ image = Dib(image)
+ self.image = image
+ width, height = image.size
+ super().__init__(title, width=width, height=height)
+
+ def ui_handle_repair(self, dc, x0, y0, x1, y1):
+ self.image.draw(dc, (x0, y0, x1, y1))
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/ImtImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/ImtImagePlugin.py
new file mode 100644
index 0000000..21ffd74
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/ImtImagePlugin.py
@@ -0,0 +1,93 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# IM Tools support for PIL
+#
+# history:
+# 1996-05-27 fl Created (read 8-bit images only)
+# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2)
+#
+# Copyright (c) Secret Labs AB 1997-2001.
+# Copyright (c) Fredrik Lundh 1996-2001.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+import re
+
+from . import Image, ImageFile
+
+#
+# --------------------------------------------------------------------
+
+field = re.compile(br"([a-z]*) ([^ \r\n]*)")
+
+
+##
+# Image plugin for IM Tools images.
+
+
+class ImtImageFile(ImageFile.ImageFile):
+
+ format = "IMT"
+ format_description = "IM Tools"
+
+ def _open(self):
+
+ # Quick rejection: if there's not a LF among the first
+ # 100 bytes, this is (probably) not a text header.
+
+ if b"\n" not in self.fp.read(100):
+ raise SyntaxError("not an IM file")
+ self.fp.seek(0)
+
+ xsize = ysize = 0
+
+ while True:
+
+ s = self.fp.read(1)
+ if not s:
+ break
+
+ if s == b"\x0C":
+
+ # image data begins
+ self.tile = [
+ ("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))
+ ]
+
+ break
+
+ else:
+
+ # read key/value pair
+ # FIXME: dangerous, may read whole file
+ s = s + self.fp.readline()
+ if len(s) == 1 or len(s) > 100:
+ break
+ if s[0] == ord(b"*"):
+ continue # comment
+
+ m = field.match(s)
+ if not m:
+ break
+ k, v = m.group(1, 2)
+ if k == "width":
+ xsize = int(v)
+ self._size = xsize, ysize
+ elif k == "height":
+ ysize = int(v)
+ self._size = xsize, ysize
+ elif k == "pixel" and v == "n8":
+ self.mode = "L"
+
+
+#
+# --------------------------------------------------------------------
+
+Image.register_open(ImtImageFile.format, ImtImageFile)
+
+#
+# no extension registered (".im" is simply too common)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/IptcImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/IptcImagePlugin.py
new file mode 100644
index 0000000..b2f976d
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/IptcImagePlugin.py
@@ -0,0 +1,226 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# IPTC/NAA file handling
+#
+# history:
+# 1995-10-01 fl Created
+# 1998-03-09 fl Cleaned up and added to PIL
+# 2002-06-18 fl Added getiptcinfo helper
+#
+# Copyright (c) Secret Labs AB 1997-2002.
+# Copyright (c) Fredrik Lundh 1995.
+#
+# See the README file for information on usage and redistribution.
+#
+import os
+import tempfile
+
+from . import Image, ImageFile
+from ._binary import i8, i16be as i16, i32be as i32, o8
+
+COMPRESSION = {1: "raw", 5: "jpeg"}
+
+PAD = o8(0) * 4
+
+
+#
+# Helpers
+
+
+def i(c):
+ return i32((PAD + c)[-4:])
+
+
+def dump(c):
+ for i in c:
+ print("%02x" % i8(i), end=" ")
+ print()
+
+
+##
+# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields
+# from TIFF and JPEG files, use the getiptcinfo function.
+
+
+class IptcImageFile(ImageFile.ImageFile):
+
+ format = "IPTC"
+ format_description = "IPTC/NAA"
+
+ def getint(self, key):
+ return i(self.info[key])
+
+ def field(self):
+ #
+ # get a IPTC field header
+ s = self.fp.read(5)
+ if not len(s):
+ return None, 0
+
+ tag = i8(s[1]), i8(s[2])
+
+ # syntax
+ if i8(s[0]) != 0x1C or tag[0] < 1 or tag[0] > 9:
+ raise SyntaxError("invalid IPTC/NAA file")
+
+ # field size
+ size = i8(s[3])
+ if size > 132:
+ raise OSError("illegal field length in IPTC/NAA file")
+ elif size == 128:
+ size = 0
+ elif size > 128:
+ size = i(self.fp.read(size - 128))
+ else:
+ size = i16(s[3:])
+
+ return tag, size
+
+ def _open(self):
+
+ # load descriptive fields
+ while True:
+ offset = self.fp.tell()
+ tag, size = self.field()
+ if not tag or tag == (8, 10):
+ break
+ if size:
+ tagdata = self.fp.read(size)
+ else:
+ tagdata = None
+ if tag in self.info:
+ if isinstance(self.info[tag], list):
+ self.info[tag].append(tagdata)
+ else:
+ self.info[tag] = [self.info[tag], tagdata]
+ else:
+ self.info[tag] = tagdata
+
+ # mode
+ layers = i8(self.info[(3, 60)][0])
+ component = i8(self.info[(3, 60)][1])
+ if (3, 65) in self.info:
+ id = i8(self.info[(3, 65)][0]) - 1
+ else:
+ id = 0
+ if layers == 1 and not component:
+ self.mode = "L"
+ elif layers == 3 and component:
+ self.mode = "RGB"[id]
+ elif layers == 4 and component:
+ self.mode = "CMYK"[id]
+
+ # size
+ self._size = self.getint((3, 20)), self.getint((3, 30))
+
+ # compression
+ try:
+ compression = COMPRESSION[self.getint((3, 120))]
+ except KeyError:
+ raise OSError("Unknown IPTC image compression")
+
+ # tile
+ if tag == (8, 10):
+ self.tile = [
+ ("iptc", (compression, offset), (0, 0, self.size[0], self.size[1]))
+ ]
+
+ def load(self):
+
+ if len(self.tile) != 1 or self.tile[0][0] != "iptc":
+ return ImageFile.ImageFile.load(self)
+
+ type, tile, box = self.tile[0]
+
+ encoding, offset = tile
+
+ self.fp.seek(offset)
+
+ # Copy image data to temporary file
+ o_fd, outfile = tempfile.mkstemp(text=False)
+ o = os.fdopen(o_fd)
+ if encoding == "raw":
+ # To simplify access to the extracted file,
+ # prepend a PPM header
+ o.write("P5\n%d %d\n255\n" % self.size)
+ while True:
+ type, size = self.field()
+ if type != (8, 10):
+ break
+ while size > 0:
+ s = self.fp.read(min(size, 8192))
+ if not s:
+ break
+ o.write(s)
+ size -= len(s)
+ o.close()
+
+ try:
+ with Image.open(outfile) as _im:
+ _im.load()
+ self.im = _im.im
+ finally:
+ try:
+ os.unlink(outfile)
+ except OSError:
+ pass
+
+
+Image.register_open(IptcImageFile.format, IptcImageFile)
+
+Image.register_extension(IptcImageFile.format, ".iim")
+
+
+def getiptcinfo(im):
+ """
+ Get IPTC information from TIFF, JPEG, or IPTC file.
+
+ :param im: An image containing IPTC data.
+ :returns: A dictionary containing IPTC information, or None if
+ no IPTC information block was found.
+ """
+ from . import TiffImagePlugin, JpegImagePlugin
+ import io
+
+ data = None
+
+ if isinstance(im, IptcImageFile):
+ # return info dictionary right away
+ return im.info
+
+ elif isinstance(im, JpegImagePlugin.JpegImageFile):
+ # extract the IPTC/NAA resource
+ photoshop = im.info.get("photoshop")
+ if photoshop:
+ data = photoshop.get(0x0404)
+
+ elif isinstance(im, TiffImagePlugin.TiffImageFile):
+ # get raw data from the IPTC/NAA tag (PhotoShop tags the data
+ # as 4-byte integers, so we cannot use the get method...)
+ try:
+ data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK]
+ except (AttributeError, KeyError):
+ pass
+
+ if data is None:
+ return None # no properties
+
+ # create an IptcImagePlugin object without initializing it
+ class FakeImage:
+ pass
+
+ im = FakeImage()
+ im.__class__ = IptcImageFile
+
+ # parse the IPTC information chunk
+ im.info = {}
+ im.fp = io.BytesIO(data)
+
+ try:
+ im._open()
+ except (IndexError, KeyError):
+ pass # expected failure
+
+ return im.info
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/Jpeg2KImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/Jpeg2KImagePlugin.py
new file mode 100644
index 0000000..0b0d433
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/Jpeg2KImagePlugin.py
@@ -0,0 +1,314 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# JPEG2000 file handling
+#
+# History:
+# 2014-03-12 ajh Created
+#
+# Copyright (c) 2014 Coriolis Systems Limited
+# Copyright (c) 2014 Alastair Houghton
+#
+# See the README file for information on usage and redistribution.
+#
+import io
+import os
+import struct
+
+from . import Image, ImageFile
+
+
+def _parse_codestream(fp):
+ """Parse the JPEG 2000 codestream to extract the size and component
+ count from the SIZ marker segment, returning a PIL (size, mode) tuple."""
+
+ hdr = fp.read(2)
+ lsiz = struct.unpack(">H", hdr)[0]
+ siz = hdr + fp.read(lsiz - 2)
+ lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from(
+ ">HHIIIIIIIIH", siz
+ )
+ ssiz = [None] * csiz
+ xrsiz = [None] * csiz
+ yrsiz = [None] * csiz
+ for i in range(csiz):
+ ssiz[i], xrsiz[i], yrsiz[i] = struct.unpack_from(">BBB", siz, 36 + 3 * i)
+
+ size = (xsiz - xosiz, ysiz - yosiz)
+ if csiz == 1:
+ if (yrsiz[0] & 0x7F) > 8:
+ mode = "I;16"
+ else:
+ mode = "L"
+ elif csiz == 2:
+ mode = "LA"
+ elif csiz == 3:
+ mode = "RGB"
+ elif csiz == 4:
+ mode = "RGBA"
+ else:
+ mode = None
+
+ return (size, mode)
+
+
+def _parse_jp2_header(fp):
+ """Parse the JP2 header box to extract size, component count and
+ color space information, returning a (size, mode, mimetype) tuple."""
+
+ # Find the JP2 header box
+ header = None
+ mimetype = None
+ while True:
+ lbox, tbox = struct.unpack(">I4s", fp.read(8))
+ if lbox == 1:
+ lbox = struct.unpack(">Q", fp.read(8))[0]
+ hlen = 16
+ else:
+ hlen = 8
+
+ if lbox < hlen:
+ raise SyntaxError("Invalid JP2 header length")
+
+ if tbox == b"jp2h":
+ header = fp.read(lbox - hlen)
+ break
+ elif tbox == b"ftyp":
+ if fp.read(4) == b"jpx ":
+ mimetype = "image/jpx"
+ fp.seek(lbox - hlen - 4, os.SEEK_CUR)
+ else:
+ fp.seek(lbox - hlen, os.SEEK_CUR)
+
+ if header is None:
+ raise SyntaxError("could not find JP2 header")
+
+ size = None
+ mode = None
+ bpc = None
+ nc = None
+
+ hio = io.BytesIO(header)
+ while True:
+ lbox, tbox = struct.unpack(">I4s", hio.read(8))
+ if lbox == 1:
+ lbox = struct.unpack(">Q", hio.read(8))[0]
+ hlen = 16
+ else:
+ hlen = 8
+
+ content = hio.read(lbox - hlen)
+
+ if tbox == b"ihdr":
+ height, width, nc, bpc, c, unkc, ipr = struct.unpack(">IIHBBBB", content)
+ size = (width, height)
+ if unkc:
+ if nc == 1 and (bpc & 0x7F) > 8:
+ mode = "I;16"
+ elif nc == 1:
+ mode = "L"
+ elif nc == 2:
+ mode = "LA"
+ elif nc == 3:
+ mode = "RGB"
+ elif nc == 4:
+ mode = "RGBA"
+ break
+ elif tbox == b"colr":
+ meth, prec, approx = struct.unpack_from(">BBB", content)
+ if meth == 1:
+ cs = struct.unpack_from(">I", content, 3)[0]
+ if cs == 16: # sRGB
+ if nc == 1 and (bpc & 0x7F) > 8:
+ mode = "I;16"
+ elif nc == 1:
+ mode = "L"
+ elif nc == 3:
+ mode = "RGB"
+ elif nc == 4:
+ mode = "RGBA"
+ break
+ elif cs == 17: # grayscale
+ if nc == 1 and (bpc & 0x7F) > 8:
+ mode = "I;16"
+ elif nc == 1:
+ mode = "L"
+ elif nc == 2:
+ mode = "LA"
+ break
+ elif cs == 18: # sYCC
+ if nc == 3:
+ mode = "RGB"
+ elif nc == 4:
+ mode = "RGBA"
+ break
+
+ if size is None or mode is None:
+ raise SyntaxError("Malformed jp2 header")
+
+ return (size, mode, mimetype)
+
+
+##
+# Image plugin for JPEG2000 images.
+
+
+class Jpeg2KImageFile(ImageFile.ImageFile):
+ format = "JPEG2000"
+ format_description = "JPEG 2000 (ISO 15444)"
+
+ def _open(self):
+ sig = self.fp.read(4)
+ if sig == b"\xff\x4f\xff\x51":
+ self.codec = "j2k"
+ self._size, self.mode = _parse_codestream(self.fp)
+ else:
+ sig = sig + self.fp.read(8)
+
+ if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a":
+ self.codec = "jp2"
+ header = _parse_jp2_header(self.fp)
+ self._size, self.mode, self.custom_mimetype = header
+ else:
+ raise SyntaxError("not a JPEG 2000 file")
+
+ if self.size is None or self.mode is None:
+ raise SyntaxError("unable to determine size/mode")
+
+ self._reduce = 0
+ self.layers = 0
+
+ fd = -1
+ length = -1
+
+ try:
+ fd = self.fp.fileno()
+ length = os.fstat(fd).st_size
+ except Exception:
+ fd = -1
+ try:
+ pos = self.fp.tell()
+ self.fp.seek(0, io.SEEK_END)
+ length = self.fp.tell()
+ self.fp.seek(pos)
+ except Exception:
+ length = -1
+
+ self.tile = [
+ (
+ "jpeg2k",
+ (0, 0) + self.size,
+ 0,
+ (self.codec, self._reduce, self.layers, fd, length),
+ )
+ ]
+
+ @property
+ def reduce(self):
+ # https://github.com/python-pillow/Pillow/issues/4343 found that the
+ # new Image 'reduce' method was shadowed by this plugin's 'reduce'
+ # property. This attempts to allow for both scenarios
+ return self._reduce or super().reduce
+
+ @reduce.setter
+ def reduce(self, value):
+ self._reduce = value
+
+ def load(self):
+ if self.tile and self._reduce:
+ power = 1 << self._reduce
+ adjust = power >> 1
+ self._size = (
+ int((self.size[0] + adjust) / power),
+ int((self.size[1] + adjust) / power),
+ )
+
+ # Update the reduce and layers settings
+ t = self.tile[0]
+ t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4])
+ self.tile = [(t[0], (0, 0) + self.size, t[2], t3)]
+
+ return ImageFile.ImageFile.load(self)
+
+
+def _accept(prefix):
+ return (
+ prefix[:4] == b"\xff\x4f\xff\x51"
+ or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a"
+ )
+
+
+# ------------------------------------------------------------
+# Save support
+
+
+def _save(im, fp, filename):
+ if filename.endswith(".j2k"):
+ kind = "j2k"
+ else:
+ kind = "jp2"
+
+ # Get the keyword arguments
+ info = im.encoderinfo
+
+ offset = info.get("offset", None)
+ tile_offset = info.get("tile_offset", None)
+ tile_size = info.get("tile_size", None)
+ quality_mode = info.get("quality_mode", "rates")
+ quality_layers = info.get("quality_layers", None)
+ if quality_layers is not None and not (
+ isinstance(quality_layers, (list, tuple))
+ and all(
+ [
+ isinstance(quality_layer, (int, float))
+ for quality_layer in quality_layers
+ ]
+ )
+ ):
+ raise ValueError("quality_layers must be a sequence of numbers")
+
+ num_resolutions = info.get("num_resolutions", 0)
+ cblk_size = info.get("codeblock_size", None)
+ precinct_size = info.get("precinct_size", None)
+ irreversible = info.get("irreversible", False)
+ progression = info.get("progression", "LRCP")
+ cinema_mode = info.get("cinema_mode", "no")
+ fd = -1
+
+ if hasattr(fp, "fileno"):
+ try:
+ fd = fp.fileno()
+ except Exception:
+ fd = -1
+
+ im.encoderconfig = (
+ offset,
+ tile_offset,
+ tile_size,
+ quality_mode,
+ quality_layers,
+ num_resolutions,
+ cblk_size,
+ precinct_size,
+ irreversible,
+ progression,
+ cinema_mode,
+ fd,
+ )
+
+ ImageFile._save(im, fp, [("jpeg2k", (0, 0) + im.size, 0, kind)])
+
+
+# ------------------------------------------------------------
+# Registry stuff
+
+
+Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept)
+Image.register_save(Jpeg2KImageFile.format, _save)
+
+Image.register_extensions(
+ Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"]
+)
+
+Image.register_mime(Jpeg2KImageFile.format, "image/jp2")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/JpegImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/JpegImagePlugin.py
new file mode 100644
index 0000000..2aa029e
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/JpegImagePlugin.py
@@ -0,0 +1,807 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# JPEG (JFIF) file handling
+#
+# See "Digital Compression and Coding of Continuous-Tone Still Images,
+# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1)
+#
+# History:
+# 1995-09-09 fl Created
+# 1995-09-13 fl Added full parser
+# 1996-03-25 fl Added hack to use the IJG command line utilities
+# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug
+# 1996-05-28 fl Added draft support, JFIF version (0.1)
+# 1996-12-30 fl Added encoder options, added progression property (0.2)
+# 1997-08-27 fl Save mode 1 images as BW (0.3)
+# 1998-07-12 fl Added YCbCr to draft and save methods (0.4)
+# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1)
+# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2)
+# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3)
+# 2003-04-25 fl Added experimental EXIF decoder (0.5)
+# 2003-06-06 fl Added experimental EXIF GPSinfo decoder
+# 2003-09-13 fl Extract COM markers
+# 2009-09-06 fl Added icc_profile support (from Florian Hoech)
+# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6)
+# 2009-03-08 fl Added subsampling support (from Justin Huff).
+#
+# Copyright (c) 1997-2003 by Secret Labs AB.
+# Copyright (c) 1995-1996 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+import array
+import io
+import os
+import struct
+import subprocess
+import tempfile
+import warnings
+
+from . import Image, ImageFile, TiffImagePlugin
+from ._binary import i8, i16be as i16, i32be as i32, o8
+from .JpegPresets import presets
+
+#
+# Parser
+
+
+def Skip(self, marker):
+ n = i16(self.fp.read(2)) - 2
+ ImageFile._safe_read(self.fp, n)
+
+
+def APP(self, marker):
+ #
+ # Application marker. Store these in the APP dictionary.
+ # Also look for well-known application markers.
+
+ n = i16(self.fp.read(2)) - 2
+ s = ImageFile._safe_read(self.fp, n)
+
+ app = "APP%d" % (marker & 15)
+
+ self.app[app] = s # compatibility
+ self.applist.append((app, s))
+
+ if marker == 0xFFE0 and s[:4] == b"JFIF":
+ # extract JFIF information
+ self.info["jfif"] = version = i16(s, 5) # version
+ self.info["jfif_version"] = divmod(version, 256)
+ # extract JFIF properties
+ try:
+ jfif_unit = i8(s[7])
+ jfif_density = i16(s, 8), i16(s, 10)
+ except Exception:
+ pass
+ else:
+ if jfif_unit == 1:
+ self.info["dpi"] = jfif_density
+ self.info["jfif_unit"] = jfif_unit
+ self.info["jfif_density"] = jfif_density
+ elif marker == 0xFFE1 and s[:5] == b"Exif\0":
+ if "exif" not in self.info:
+ # extract EXIF information (incomplete)
+ self.info["exif"] = s # FIXME: value will change
+ elif marker == 0xFFE2 and s[:5] == b"FPXR\0":
+ # extract FlashPix information (incomplete)
+ self.info["flashpix"] = s # FIXME: value will change
+ elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0":
+ # Since an ICC profile can be larger than the maximum size of
+ # a JPEG marker (64K), we need provisions to split it into
+ # multiple markers. The format defined by the ICC specifies
+ # one or more APP2 markers containing the following data:
+ # Identifying string ASCII "ICC_PROFILE\0" (12 bytes)
+ # Marker sequence number 1, 2, etc (1 byte)
+ # Number of markers Total of APP2's used (1 byte)
+ # Profile data (remainder of APP2 data)
+ # Decoders should use the marker sequence numbers to
+ # reassemble the profile, rather than assuming that the APP2
+ # markers appear in the correct sequence.
+ self.icclist.append(s)
+ elif marker == 0xFFED and s[:14] == b"Photoshop 3.0\x00":
+ # parse the image resource block
+ offset = 14
+ photoshop = self.info.setdefault("photoshop", {})
+ while s[offset : offset + 4] == b"8BIM":
+ try:
+ offset += 4
+ # resource code
+ code = i16(s, offset)
+ offset += 2
+ # resource name (usually empty)
+ name_len = i8(s[offset])
+ # name = s[offset+1:offset+1+name_len]
+ offset += 1 + name_len
+ offset += offset & 1 # align
+ # resource data block
+ size = i32(s, offset)
+ offset += 4
+ data = s[offset : offset + size]
+ if code == 0x03ED: # ResolutionInfo
+ data = {
+ "XResolution": i32(data[:4]) / 65536,
+ "DisplayedUnitsX": i16(data[4:8]),
+ "YResolution": i32(data[8:12]) / 65536,
+ "DisplayedUnitsY": i16(data[12:]),
+ }
+ photoshop[code] = data
+ offset += size
+ offset += offset & 1 # align
+ except struct.error:
+ break # insufficient data
+
+ elif marker == 0xFFEE and s[:5] == b"Adobe":
+ self.info["adobe"] = i16(s, 5)
+ # extract Adobe custom properties
+ try:
+ adobe_transform = i8(s[1])
+ except Exception:
+ pass
+ else:
+ self.info["adobe_transform"] = adobe_transform
+ elif marker == 0xFFE2 and s[:4] == b"MPF\0":
+ # extract MPO information
+ self.info["mp"] = s[4:]
+ # offset is current location minus buffer size
+ # plus constant header size
+ self.info["mpoffset"] = self.fp.tell() - n + 4
+
+ # If DPI isn't in JPEG header, fetch from EXIF
+ if "dpi" not in self.info and "exif" in self.info:
+ try:
+ exif = self.getexif()
+ resolution_unit = exif[0x0128]
+ x_resolution = exif[0x011A]
+ try:
+ dpi = float(x_resolution[0]) / x_resolution[1]
+ except TypeError:
+ dpi = x_resolution
+ if resolution_unit == 3: # cm
+ # 1 dpcm = 2.54 dpi
+ dpi *= 2.54
+ self.info["dpi"] = int(dpi + 0.5), int(dpi + 0.5)
+ except (KeyError, SyntaxError, ValueError, ZeroDivisionError):
+ # SyntaxError for invalid/unreadable EXIF
+ # KeyError for dpi not included
+ # ZeroDivisionError for invalid dpi rational value
+ # ValueError for x_resolution[0] being an invalid float
+ self.info["dpi"] = 72, 72
+
+
+def COM(self, marker):
+ #
+ # Comment marker. Store these in the APP dictionary.
+ n = i16(self.fp.read(2)) - 2
+ s = ImageFile._safe_read(self.fp, n)
+
+ self.info["comment"] = s
+ self.app["COM"] = s # compatibility
+ self.applist.append(("COM", s))
+
+
+def SOF(self, marker):
+ #
+ # Start of frame marker. Defines the size and mode of the
+ # image. JPEG is colour blind, so we use some simple
+ # heuristics to map the number of layers to an appropriate
+ # mode. Note that this could be made a bit brighter, by
+ # looking for JFIF and Adobe APP markers.
+
+ n = i16(self.fp.read(2)) - 2
+ s = ImageFile._safe_read(self.fp, n)
+ self._size = i16(s[3:]), i16(s[1:])
+
+ self.bits = i8(s[0])
+ if self.bits != 8:
+ raise SyntaxError("cannot handle %d-bit layers" % self.bits)
+
+ self.layers = i8(s[5])
+ if self.layers == 1:
+ self.mode = "L"
+ elif self.layers == 3:
+ self.mode = "RGB"
+ elif self.layers == 4:
+ self.mode = "CMYK"
+ else:
+ raise SyntaxError("cannot handle %d-layer images" % self.layers)
+
+ if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]:
+ self.info["progressive"] = self.info["progression"] = 1
+
+ if self.icclist:
+ # fixup icc profile
+ self.icclist.sort() # sort by sequence number
+ if i8(self.icclist[0][13]) == len(self.icclist):
+ profile = []
+ for p in self.icclist:
+ profile.append(p[14:])
+ icc_profile = b"".join(profile)
+ else:
+ icc_profile = None # wrong number of fragments
+ self.info["icc_profile"] = icc_profile
+ self.icclist = None
+
+ for i in range(6, len(s), 3):
+ t = s[i : i + 3]
+ # 4-tuples: id, vsamp, hsamp, qtable
+ self.layer.append((t[0], i8(t[1]) // 16, i8(t[1]) & 15, i8(t[2])))
+
+
+def DQT(self, marker):
+ #
+ # Define quantization table. Support baseline 8-bit tables
+ # only. Note that there might be more than one table in
+ # each marker.
+
+ # FIXME: The quantization tables can be used to estimate the
+ # compression quality.
+
+ n = i16(self.fp.read(2)) - 2
+ s = ImageFile._safe_read(self.fp, n)
+ while len(s):
+ if len(s) < 65:
+ raise SyntaxError("bad quantization table marker")
+ v = i8(s[0])
+ if v // 16 == 0:
+ self.quantization[v & 15] = array.array("B", s[1:65])
+ s = s[65:]
+ else:
+ return # FIXME: add code to read 16-bit tables!
+ # raise SyntaxError, "bad quantization table element size"
+
+
+#
+# JPEG marker table
+
+MARKER = {
+ 0xFFC0: ("SOF0", "Baseline DCT", SOF),
+ 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF),
+ 0xFFC2: ("SOF2", "Progressive DCT", SOF),
+ 0xFFC3: ("SOF3", "Spatial lossless", SOF),
+ 0xFFC4: ("DHT", "Define Huffman table", Skip),
+ 0xFFC5: ("SOF5", "Differential sequential DCT", SOF),
+ 0xFFC6: ("SOF6", "Differential progressive DCT", SOF),
+ 0xFFC7: ("SOF7", "Differential spatial", SOF),
+ 0xFFC8: ("JPG", "Extension", None),
+ 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF),
+ 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF),
+ 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF),
+ 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip),
+ 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF),
+ 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF),
+ 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF),
+ 0xFFD0: ("RST0", "Restart 0", None),
+ 0xFFD1: ("RST1", "Restart 1", None),
+ 0xFFD2: ("RST2", "Restart 2", None),
+ 0xFFD3: ("RST3", "Restart 3", None),
+ 0xFFD4: ("RST4", "Restart 4", None),
+ 0xFFD5: ("RST5", "Restart 5", None),
+ 0xFFD6: ("RST6", "Restart 6", None),
+ 0xFFD7: ("RST7", "Restart 7", None),
+ 0xFFD8: ("SOI", "Start of image", None),
+ 0xFFD9: ("EOI", "End of image", None),
+ 0xFFDA: ("SOS", "Start of scan", Skip),
+ 0xFFDB: ("DQT", "Define quantization table", DQT),
+ 0xFFDC: ("DNL", "Define number of lines", Skip),
+ 0xFFDD: ("DRI", "Define restart interval", Skip),
+ 0xFFDE: ("DHP", "Define hierarchical progression", SOF),
+ 0xFFDF: ("EXP", "Expand reference component", Skip),
+ 0xFFE0: ("APP0", "Application segment 0", APP),
+ 0xFFE1: ("APP1", "Application segment 1", APP),
+ 0xFFE2: ("APP2", "Application segment 2", APP),
+ 0xFFE3: ("APP3", "Application segment 3", APP),
+ 0xFFE4: ("APP4", "Application segment 4", APP),
+ 0xFFE5: ("APP5", "Application segment 5", APP),
+ 0xFFE6: ("APP6", "Application segment 6", APP),
+ 0xFFE7: ("APP7", "Application segment 7", APP),
+ 0xFFE8: ("APP8", "Application segment 8", APP),
+ 0xFFE9: ("APP9", "Application segment 9", APP),
+ 0xFFEA: ("APP10", "Application segment 10", APP),
+ 0xFFEB: ("APP11", "Application segment 11", APP),
+ 0xFFEC: ("APP12", "Application segment 12", APP),
+ 0xFFED: ("APP13", "Application segment 13", APP),
+ 0xFFEE: ("APP14", "Application segment 14", APP),
+ 0xFFEF: ("APP15", "Application segment 15", APP),
+ 0xFFF0: ("JPG0", "Extension 0", None),
+ 0xFFF1: ("JPG1", "Extension 1", None),
+ 0xFFF2: ("JPG2", "Extension 2", None),
+ 0xFFF3: ("JPG3", "Extension 3", None),
+ 0xFFF4: ("JPG4", "Extension 4", None),
+ 0xFFF5: ("JPG5", "Extension 5", None),
+ 0xFFF6: ("JPG6", "Extension 6", None),
+ 0xFFF7: ("JPG7", "Extension 7", None),
+ 0xFFF8: ("JPG8", "Extension 8", None),
+ 0xFFF9: ("JPG9", "Extension 9", None),
+ 0xFFFA: ("JPG10", "Extension 10", None),
+ 0xFFFB: ("JPG11", "Extension 11", None),
+ 0xFFFC: ("JPG12", "Extension 12", None),
+ 0xFFFD: ("JPG13", "Extension 13", None),
+ 0xFFFE: ("COM", "Comment", COM),
+}
+
+
+def _accept(prefix):
+ return prefix[0:1] == b"\377"
+
+
+##
+# Image plugin for JPEG and JFIF images.
+
+
+class JpegImageFile(ImageFile.ImageFile):
+
+ format = "JPEG"
+ format_description = "JPEG (ISO 10918)"
+
+ def _open(self):
+
+ s = self.fp.read(1)
+
+ if i8(s) != 255:
+ raise SyntaxError("not a JPEG file")
+
+ # Create attributes
+ self.bits = self.layers = 0
+
+ # JPEG specifics (internal)
+ self.layer = []
+ self.huffman_dc = {}
+ self.huffman_ac = {}
+ self.quantization = {}
+ self.app = {} # compatibility
+ self.applist = []
+ self.icclist = []
+
+ while True:
+
+ i = i8(s)
+ if i == 0xFF:
+ s = s + self.fp.read(1)
+ i = i16(s)
+ else:
+ # Skip non-0xFF junk
+ s = self.fp.read(1)
+ continue
+
+ if i in MARKER:
+ name, description, handler = MARKER[i]
+ if handler is not None:
+ handler(self, i)
+ if i == 0xFFDA: # start of scan
+ rawmode = self.mode
+ if self.mode == "CMYK":
+ rawmode = "CMYK;I" # assume adobe conventions
+ self.tile = [("jpeg", (0, 0) + self.size, 0, (rawmode, ""))]
+ # self.__offset = self.fp.tell()
+ break
+ s = self.fp.read(1)
+ elif i == 0 or i == 0xFFFF:
+ # padded marker or junk; move on
+ s = b"\xff"
+ elif i == 0xFF00: # Skip extraneous data (escaped 0xFF)
+ s = self.fp.read(1)
+ else:
+ raise SyntaxError("no marker found")
+
+ def load_read(self, read_bytes):
+ """
+ internal: read more image data
+ For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker
+ so libjpeg can finish decoding
+ """
+ s = self.fp.read(read_bytes)
+
+ if not s and ImageFile.LOAD_TRUNCATED_IMAGES:
+ # Premature EOF.
+ # Pretend file is finished adding EOI marker
+ return b"\xFF\xD9"
+
+ return s
+
+ def draft(self, mode, size):
+
+ if len(self.tile) != 1:
+ return
+
+ # Protect from second call
+ if self.decoderconfig:
+ return
+
+ d, e, o, a = self.tile[0]
+ scale = 1
+ original_size = self.size
+
+ if a[0] == "RGB" and mode in ["L", "YCbCr"]:
+ self.mode = mode
+ a = mode, ""
+
+ if size:
+ scale = min(self.size[0] // size[0], self.size[1] // size[1])
+ for s in [8, 4, 2, 1]:
+ if scale >= s:
+ break
+ e = (
+ e[0],
+ e[1],
+ (e[2] - e[0] + s - 1) // s + e[0],
+ (e[3] - e[1] + s - 1) // s + e[1],
+ )
+ self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s)
+ scale = s
+
+ self.tile = [(d, e, o, a)]
+ self.decoderconfig = (scale, 0)
+
+ box = (0, 0, original_size[0] / scale, original_size[1] / scale)
+ return (self.mode, box)
+
+ def load_djpeg(self):
+
+ # ALTERNATIVE: handle JPEGs via the IJG command line utilities
+
+ f, path = tempfile.mkstemp()
+ os.close(f)
+ if os.path.exists(self.filename):
+ subprocess.check_call(["djpeg", "-outfile", path, self.filename])
+ else:
+ raise ValueError("Invalid Filename")
+
+ try:
+ with Image.open(path) as _im:
+ _im.load()
+ self.im = _im.im
+ finally:
+ try:
+ os.unlink(path)
+ except OSError:
+ pass
+
+ self.mode = self.im.mode
+ self._size = self.im.size
+
+ self.tile = []
+
+ def _getexif(self):
+ return _getexif(self)
+
+ def _getmp(self):
+ return _getmp(self)
+
+
+def _fixup_dict(src_dict):
+ # Helper function for _getexif()
+ # returns a dict with any single item tuples/lists as individual values
+ exif = Image.Exif()
+ return exif._fixup_dict(src_dict)
+
+
+def _getexif(self):
+ if "exif" not in self.info:
+ return None
+ return dict(self.getexif())
+
+
+def _getmp(self):
+ # Extract MP information. This method was inspired by the "highly
+ # experimental" _getexif version that's been in use for years now,
+ # itself based on the ImageFileDirectory class in the TIFF plug-in.
+
+ # The MP record essentially consists of a TIFF file embedded in a JPEG
+ # application marker.
+ try:
+ data = self.info["mp"]
+ except KeyError:
+ return None
+ file_contents = io.BytesIO(data)
+ head = file_contents.read(8)
+ endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<"
+ # process dictionary
+ try:
+ info = TiffImagePlugin.ImageFileDirectory_v2(head)
+ file_contents.seek(info.next)
+ info.load(file_contents)
+ mp = dict(info)
+ except Exception:
+ raise SyntaxError("malformed MP Index (unreadable directory)")
+ # it's an error not to have a number of images
+ try:
+ quant = mp[0xB001]
+ except KeyError:
+ raise SyntaxError("malformed MP Index (no number of images)")
+ # get MP entries
+ mpentries = []
+ try:
+ rawmpentries = mp[0xB002]
+ for entrynum in range(0, quant):
+ unpackedentry = struct.unpack_from(
+ "{}LLLHH".format(endianness), rawmpentries, entrynum * 16
+ )
+ labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2")
+ mpentry = dict(zip(labels, unpackedentry))
+ mpentryattr = {
+ "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)),
+ "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)),
+ "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)),
+ "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27,
+ "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24,
+ "MPType": mpentry["Attribute"] & 0x00FFFFFF,
+ }
+ if mpentryattr["ImageDataFormat"] == 0:
+ mpentryattr["ImageDataFormat"] = "JPEG"
+ else:
+ raise SyntaxError("unsupported picture format in MPO")
+ mptypemap = {
+ 0x000000: "Undefined",
+ 0x010001: "Large Thumbnail (VGA Equivalent)",
+ 0x010002: "Large Thumbnail (Full HD Equivalent)",
+ 0x020001: "Multi-Frame Image (Panorama)",
+ 0x020002: "Multi-Frame Image: (Disparity)",
+ 0x020003: "Multi-Frame Image: (Multi-Angle)",
+ 0x030000: "Baseline MP Primary Image",
+ }
+ mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown")
+ mpentry["Attribute"] = mpentryattr
+ mpentries.append(mpentry)
+ mp[0xB002] = mpentries
+ except KeyError:
+ raise SyntaxError("malformed MP Index (bad MP Entry)")
+ # Next we should try and parse the individual image unique ID list;
+ # we don't because I've never seen this actually used in a real MPO
+ # file and so can't test it.
+ return mp
+
+
+# --------------------------------------------------------------------
+# stuff to save JPEG files
+
+RAWMODE = {
+ "1": "L",
+ "L": "L",
+ "RGB": "RGB",
+ "RGBX": "RGB",
+ "CMYK": "CMYK;I", # assume adobe conventions
+ "YCbCr": "YCbCr",
+}
+
+# fmt: off
+zigzag_index = (
+ 0, 1, 5, 6, 14, 15, 27, 28,
+ 2, 4, 7, 13, 16, 26, 29, 42,
+ 3, 8, 12, 17, 25, 30, 41, 43,
+ 9, 11, 18, 24, 31, 40, 44, 53,
+ 10, 19, 23, 32, 39, 45, 52, 54,
+ 20, 22, 33, 38, 46, 51, 55, 60,
+ 21, 34, 37, 47, 50, 56, 59, 61,
+ 35, 36, 48, 49, 57, 58, 62, 63,
+)
+
+samplings = {
+ (1, 1, 1, 1, 1, 1): 0,
+ (2, 1, 1, 1, 1, 1): 1,
+ (2, 2, 1, 1, 1, 1): 2,
+}
+# fmt: on
+
+
+def convert_dict_qtables(qtables):
+ qtables = [qtables[key] for key in range(len(qtables)) if key in qtables]
+ for idx, table in enumerate(qtables):
+ qtables[idx] = [table[i] for i in zigzag_index]
+ return qtables
+
+
+def get_sampling(im):
+ # There's no subsampling when image have only 1 layer
+ # (grayscale images) or when they are CMYK (4 layers),
+ # so set subsampling to default value.
+ #
+ # NOTE: currently Pillow can't encode JPEG to YCCK format.
+ # If YCCK support is added in the future, subsampling code will have
+ # to be updated (here and in JpegEncode.c) to deal with 4 layers.
+ if not hasattr(im, "layers") or im.layers in (1, 4):
+ return -1
+ sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3]
+ return samplings.get(sampling, -1)
+
+
+def _save(im, fp, filename):
+
+ try:
+ rawmode = RAWMODE[im.mode]
+ except KeyError:
+ raise OSError("cannot write mode %s as JPEG" % im.mode)
+
+ info = im.encoderinfo
+
+ dpi = [round(x) for x in info.get("dpi", (0, 0))]
+
+ quality = info.get("quality", -1)
+ subsampling = info.get("subsampling", -1)
+ qtables = info.get("qtables")
+
+ if quality == "keep":
+ quality = -1
+ subsampling = "keep"
+ qtables = "keep"
+ elif quality in presets:
+ preset = presets[quality]
+ quality = -1
+ subsampling = preset.get("subsampling", -1)
+ qtables = preset.get("quantization")
+ elif not isinstance(quality, int):
+ raise ValueError("Invalid quality setting")
+ else:
+ if subsampling in presets:
+ subsampling = presets[subsampling].get("subsampling", -1)
+ if isinstance(qtables, str) and qtables in presets:
+ qtables = presets[qtables].get("quantization")
+
+ if subsampling == "4:4:4":
+ subsampling = 0
+ elif subsampling == "4:2:2":
+ subsampling = 1
+ elif subsampling == "4:2:0":
+ subsampling = 2
+ elif subsampling == "4:1:1":
+ # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0.
+ # Set 4:2:0 if someone is still using that value.
+ subsampling = 2
+ elif subsampling == "keep":
+ if im.format != "JPEG":
+ raise ValueError("Cannot use 'keep' when original image is not a JPEG")
+ subsampling = get_sampling(im)
+
+ def validate_qtables(qtables):
+ if qtables is None:
+ return qtables
+ if isinstance(qtables, str):
+ try:
+ lines = [
+ int(num)
+ for line in qtables.splitlines()
+ for num in line.split("#", 1)[0].split()
+ ]
+ except ValueError:
+ raise ValueError("Invalid quantization table")
+ else:
+ qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)]
+ if isinstance(qtables, (tuple, list, dict)):
+ if isinstance(qtables, dict):
+ qtables = convert_dict_qtables(qtables)
+ elif isinstance(qtables, tuple):
+ qtables = list(qtables)
+ if not (0 < len(qtables) < 5):
+ raise ValueError("None or too many quantization tables")
+ for idx, table in enumerate(qtables):
+ try:
+ if len(table) != 64:
+ raise TypeError
+ table = array.array("B", table)
+ except TypeError:
+ raise ValueError("Invalid quantization table")
+ else:
+ qtables[idx] = list(table)
+ return qtables
+
+ if qtables == "keep":
+ if im.format != "JPEG":
+ raise ValueError("Cannot use 'keep' when original image is not a JPEG")
+ qtables = getattr(im, "quantization", None)
+ qtables = validate_qtables(qtables)
+
+ extra = b""
+
+ icc_profile = info.get("icc_profile")
+ if icc_profile:
+ ICC_OVERHEAD_LEN = 14
+ MAX_BYTES_IN_MARKER = 65533
+ MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN
+ markers = []
+ while icc_profile:
+ markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER])
+ icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:]
+ i = 1
+ for marker in markers:
+ size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker))
+ extra += (
+ b"\xFF\xE2"
+ + size
+ + b"ICC_PROFILE\0"
+ + o8(i)
+ + o8(len(markers))
+ + marker
+ )
+ i += 1
+
+ # "progressive" is the official name, but older documentation
+ # says "progression"
+ # FIXME: issue a warning if the wrong form is used (post-1.1.7)
+ progressive = info.get("progressive", False) or info.get("progression", False)
+
+ optimize = info.get("optimize", False)
+
+ exif = info.get("exif", b"")
+ if isinstance(exif, Image.Exif):
+ exif = exif.tobytes()
+
+ # get keyword arguments
+ im.encoderconfig = (
+ quality,
+ progressive,
+ info.get("smooth", 0),
+ optimize,
+ info.get("streamtype", 0),
+ dpi[0],
+ dpi[1],
+ subsampling,
+ qtables,
+ extra,
+ exif,
+ )
+
+ # if we optimize, libjpeg needs a buffer big enough to hold the whole image
+ # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is
+ # channels*size, this is a value that's been used in a django patch.
+ # https://github.com/matthewwithanm/django-imagekit/issues/50
+ bufsize = 0
+ if optimize or progressive:
+ # CMYK can be bigger
+ if im.mode == "CMYK":
+ bufsize = 4 * im.size[0] * im.size[1]
+ # keep sets quality to -1, but the actual value may be high.
+ elif quality >= 95 or quality == -1:
+ bufsize = 2 * im.size[0] * im.size[1]
+ else:
+ bufsize = im.size[0] * im.size[1]
+
+ # The EXIF info needs to be written as one block, + APP1, + one spare byte.
+ # Ensure that our buffer is big enough. Same with the icc_profile block.
+ bufsize = max(ImageFile.MAXBLOCK, bufsize, len(exif) + 5, len(extra) + 1)
+
+ ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize)
+
+
+def _save_cjpeg(im, fp, filename):
+ # ALTERNATIVE: handle JPEGs via the IJG command line utilities.
+ tempfile = im._dump()
+ subprocess.check_call(["cjpeg", "-outfile", filename, tempfile])
+ try:
+ os.unlink(tempfile)
+ except OSError:
+ pass
+
+
+##
+# Factory for making JPEG and MPO instances
+def jpeg_factory(fp=None, filename=None):
+ im = JpegImageFile(fp, filename)
+ try:
+ mpheader = im._getmp()
+ if mpheader[45057] > 1:
+ # It's actually an MPO
+ from .MpoImagePlugin import MpoImageFile
+
+ # Don't reload everything, just convert it.
+ im = MpoImageFile.adopt(im, mpheader)
+ except (TypeError, IndexError):
+ # It is really a JPEG
+ pass
+ except SyntaxError:
+ warnings.warn(
+ "Image appears to be a malformed MPO file, it will be "
+ "interpreted as a base JPEG file"
+ )
+ return im
+
+
+# ---------------------------------------------------------------------
+# Registry stuff
+
+Image.register_open(JpegImageFile.format, jpeg_factory, _accept)
+Image.register_save(JpegImageFile.format, _save)
+
+Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"])
+
+Image.register_mime(JpegImageFile.format, "image/jpeg")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/JpegPresets.py b/geekshop/django_2.0/Lib/site-packages/PIL/JpegPresets.py
new file mode 100644
index 0000000..012bf81
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/JpegPresets.py
@@ -0,0 +1,247 @@
+"""
+JPEG quality settings equivalent to the Photoshop settings.
+
+More presets can be added to the presets dict if needed.
+
+Can be use when saving JPEG file.
+
+To apply the preset, specify::
+
+ quality="preset_name"
+
+To apply only the quantization table::
+
+ qtables="preset_name"
+
+To apply only the subsampling setting::
+
+ subsampling="preset_name"
+
+Example::
+
+ im.save("image_name.jpg", quality="web_high")
+
+
+Subsampling
+-----------
+
+Subsampling is the practice of encoding images by implementing less resolution
+for chroma information than for luma information.
+(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling)
+
+Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and
+4:2:0.
+
+You can get the subsampling of a JPEG with the
+`JpegImagePlugin.get_sampling(im)` function.
+
+In JPEG compressed data a JPEG marker is used instead of an EXIF tag.
+(ref.: https://www.exiv2.org/tags.html)
+
+
+Quantization tables
+-------------------
+
+They are values use by the DCT (Discrete cosine transform) to remove
+*unnecessary* information from the image (the lossy part of the compression).
+(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices,
+https://en.wikipedia.org/wiki/JPEG#Quantization)
+
+You can get the quantization tables of a JPEG with::
+
+ im.quantization
+
+This will return a dict with a number of arrays. You can pass this dict
+directly as the qtables argument when saving a JPEG.
+
+The tables format between im.quantization and quantization in presets differ in
+3 ways:
+
+1. The base container of the preset is a list with sublists instead of dict.
+ dict[0] -> list[0], dict[1] -> list[1], ...
+2. Each table in a preset is a list instead of an array.
+3. The zigzag order is remove in the preset (needed by libjpeg >= 6a).
+
+You can convert the dict format to the preset format with the
+`JpegImagePlugin.convert_dict_qtables(dict_qtables)` function.
+
+Libjpeg ref.:
+https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html
+
+"""
+
+# fmt: off
+presets = { # noqa: E128
+ 'web_low': {'subsampling': 2, # "4:2:0"
+ 'quantization': [
+ [20, 16, 25, 39, 50, 46, 62, 68,
+ 16, 18, 23, 38, 38, 53, 65, 68,
+ 25, 23, 31, 38, 53, 65, 68, 68,
+ 39, 38, 38, 53, 65, 68, 68, 68,
+ 50, 38, 53, 65, 68, 68, 68, 68,
+ 46, 53, 65, 68, 68, 68, 68, 68,
+ 62, 65, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68],
+ [21, 25, 32, 38, 54, 68, 68, 68,
+ 25, 28, 24, 38, 54, 68, 68, 68,
+ 32, 24, 32, 43, 66, 68, 68, 68,
+ 38, 38, 43, 53, 68, 68, 68, 68,
+ 54, 54, 66, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68]
+ ]},
+ 'web_medium': {'subsampling': 2, # "4:2:0"
+ 'quantization': [
+ [16, 11, 11, 16, 23, 27, 31, 30,
+ 11, 12, 12, 15, 20, 23, 23, 30,
+ 11, 12, 13, 16, 23, 26, 35, 47,
+ 16, 15, 16, 23, 26, 37, 47, 64,
+ 23, 20, 23, 26, 39, 51, 64, 64,
+ 27, 23, 26, 37, 51, 64, 64, 64,
+ 31, 23, 35, 47, 64, 64, 64, 64,
+ 30, 30, 47, 64, 64, 64, 64, 64],
+ [17, 15, 17, 21, 20, 26, 38, 48,
+ 15, 19, 18, 17, 20, 26, 35, 43,
+ 17, 18, 20, 22, 26, 30, 46, 53,
+ 21, 17, 22, 28, 30, 39, 53, 64,
+ 20, 20, 26, 30, 39, 48, 64, 64,
+ 26, 26, 30, 39, 48, 63, 64, 64,
+ 38, 35, 46, 53, 64, 64, 64, 64,
+ 48, 43, 53, 64, 64, 64, 64, 64]
+ ]},
+ 'web_high': {'subsampling': 0, # "4:4:4"
+ 'quantization': [
+ [6, 4, 4, 6, 9, 11, 12, 16,
+ 4, 5, 5, 6, 8, 10, 12, 12,
+ 4, 5, 5, 6, 10, 12, 14, 19,
+ 6, 6, 6, 11, 12, 15, 19, 28,
+ 9, 8, 10, 12, 16, 20, 27, 31,
+ 11, 10, 12, 15, 20, 27, 31, 31,
+ 12, 12, 14, 19, 27, 31, 31, 31,
+ 16, 12, 19, 28, 31, 31, 31, 31],
+ [7, 7, 13, 24, 26, 31, 31, 31,
+ 7, 12, 16, 21, 31, 31, 31, 31,
+ 13, 16, 17, 31, 31, 31, 31, 31,
+ 24, 21, 31, 31, 31, 31, 31, 31,
+ 26, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31]
+ ]},
+ 'web_very_high': {'subsampling': 0, # "4:4:4"
+ 'quantization': [
+ [2, 2, 2, 2, 3, 4, 5, 6,
+ 2, 2, 2, 2, 3, 4, 5, 6,
+ 2, 2, 2, 2, 4, 5, 7, 9,
+ 2, 2, 2, 4, 5, 7, 9, 12,
+ 3, 3, 4, 5, 8, 10, 12, 12,
+ 4, 4, 5, 7, 10, 12, 12, 12,
+ 5, 5, 7, 9, 12, 12, 12, 12,
+ 6, 6, 9, 12, 12, 12, 12, 12],
+ [3, 3, 5, 9, 13, 15, 15, 15,
+ 3, 4, 6, 11, 14, 12, 12, 12,
+ 5, 6, 9, 14, 12, 12, 12, 12,
+ 9, 11, 14, 12, 12, 12, 12, 12,
+ 13, 14, 12, 12, 12, 12, 12, 12,
+ 15, 12, 12, 12, 12, 12, 12, 12,
+ 15, 12, 12, 12, 12, 12, 12, 12,
+ 15, 12, 12, 12, 12, 12, 12, 12]
+ ]},
+ 'web_maximum': {'subsampling': 0, # "4:4:4"
+ 'quantization': [
+ [1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2,
+ 1, 1, 1, 1, 1, 1, 2, 2,
+ 1, 1, 1, 1, 1, 2, 2, 3,
+ 1, 1, 1, 1, 2, 2, 3, 3,
+ 1, 1, 1, 2, 2, 3, 3, 3,
+ 1, 1, 2, 2, 3, 3, 3, 3],
+ [1, 1, 1, 2, 2, 3, 3, 3,
+ 1, 1, 1, 2, 3, 3, 3, 3,
+ 1, 1, 1, 3, 3, 3, 3, 3,
+ 2, 2, 3, 3, 3, 3, 3, 3,
+ 2, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3]
+ ]},
+ 'low': {'subsampling': 2, # "4:2:0"
+ 'quantization': [
+ [18, 14, 14, 21, 30, 35, 34, 17,
+ 14, 16, 16, 19, 26, 23, 12, 12,
+ 14, 16, 17, 21, 23, 12, 12, 12,
+ 21, 19, 21, 23, 12, 12, 12, 12,
+ 30, 26, 23, 12, 12, 12, 12, 12,
+ 35, 23, 12, 12, 12, 12, 12, 12,
+ 34, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12],
+ [20, 19, 22, 27, 20, 20, 17, 17,
+ 19, 25, 23, 14, 14, 12, 12, 12,
+ 22, 23, 14, 14, 12, 12, 12, 12,
+ 27, 14, 14, 12, 12, 12, 12, 12,
+ 20, 14, 12, 12, 12, 12, 12, 12,
+ 20, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12]
+ ]},
+ 'medium': {'subsampling': 2, # "4:2:0"
+ 'quantization': [
+ [12, 8, 8, 12, 17, 21, 24, 17,
+ 8, 9, 9, 11, 15, 19, 12, 12,
+ 8, 9, 10, 12, 19, 12, 12, 12,
+ 12, 11, 12, 21, 12, 12, 12, 12,
+ 17, 15, 19, 12, 12, 12, 12, 12,
+ 21, 19, 12, 12, 12, 12, 12, 12,
+ 24, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12],
+ [13, 11, 13, 16, 20, 20, 17, 17,
+ 11, 14, 14, 14, 14, 12, 12, 12,
+ 13, 14, 14, 14, 12, 12, 12, 12,
+ 16, 14, 14, 12, 12, 12, 12, 12,
+ 20, 14, 12, 12, 12, 12, 12, 12,
+ 20, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12]
+ ]},
+ 'high': {'subsampling': 0, # "4:4:4"
+ 'quantization': [
+ [6, 4, 4, 6, 9, 11, 12, 16,
+ 4, 5, 5, 6, 8, 10, 12, 12,
+ 4, 5, 5, 6, 10, 12, 12, 12,
+ 6, 6, 6, 11, 12, 12, 12, 12,
+ 9, 8, 10, 12, 12, 12, 12, 12,
+ 11, 10, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 16, 12, 12, 12, 12, 12, 12, 12],
+ [7, 7, 13, 24, 20, 20, 17, 17,
+ 7, 12, 16, 14, 14, 12, 12, 12,
+ 13, 16, 14, 14, 12, 12, 12, 12,
+ 24, 14, 14, 12, 12, 12, 12, 12,
+ 20, 14, 12, 12, 12, 12, 12, 12,
+ 20, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12,
+ 17, 12, 12, 12, 12, 12, 12, 12]
+ ]},
+ 'maximum': {'subsampling': 0, # "4:4:4"
+ 'quantization': [
+ [2, 2, 2, 2, 3, 4, 5, 6,
+ 2, 2, 2, 2, 3, 4, 5, 6,
+ 2, 2, 2, 2, 4, 5, 7, 9,
+ 2, 2, 2, 4, 5, 7, 9, 12,
+ 3, 3, 4, 5, 8, 10, 12, 12,
+ 4, 4, 5, 7, 10, 12, 12, 12,
+ 5, 5, 7, 9, 12, 12, 12, 12,
+ 6, 6, 9, 12, 12, 12, 12, 12],
+ [3, 3, 5, 9, 13, 15, 15, 15,
+ 3, 4, 6, 10, 14, 12, 12, 12,
+ 5, 6, 9, 14, 12, 12, 12, 12,
+ 9, 10, 14, 12, 12, 12, 12, 12,
+ 13, 14, 12, 12, 12, 12, 12, 12,
+ 15, 12, 12, 12, 12, 12, 12, 12,
+ 15, 12, 12, 12, 12, 12, 12, 12,
+ 15, 12, 12, 12, 12, 12, 12, 12]
+ ]},
+}
+# fmt: on
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/McIdasImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/McIdasImagePlugin.py
new file mode 100644
index 0000000..cd047fe
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/McIdasImagePlugin.py
@@ -0,0 +1,75 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# Basic McIdas support for PIL
+#
+# History:
+# 1997-05-05 fl Created (8-bit images only)
+# 2009-03-08 fl Added 16/32-bit support.
+#
+# Thanks to Richard Jones and Craig Swank for specs and samples.
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1997.
+#
+# See the README file for information on usage and redistribution.
+#
+
+import struct
+
+from . import Image, ImageFile
+
+
+def _accept(s):
+ return s[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04"
+
+
+##
+# Image plugin for McIdas area images.
+
+
+class McIdasImageFile(ImageFile.ImageFile):
+
+ format = "MCIDAS"
+ format_description = "McIdas area file"
+
+ def _open(self):
+
+ # parse area file directory
+ s = self.fp.read(256)
+ if not _accept(s) or len(s) != 256:
+ raise SyntaxError("not an McIdas area file")
+
+ self.area_descriptor_raw = s
+ self.area_descriptor = w = [0] + list(struct.unpack("!64i", s))
+
+ # get mode
+ if w[11] == 1:
+ mode = rawmode = "L"
+ elif w[11] == 2:
+ # FIXME: add memory map support
+ mode = "I"
+ rawmode = "I;16B"
+ elif w[11] == 4:
+ # FIXME: add memory map support
+ mode = "I"
+ rawmode = "I;32B"
+ else:
+ raise SyntaxError("unsupported McIdas format")
+
+ self.mode = mode
+ self._size = w[10], w[9]
+
+ offset = w[34] + w[15]
+ stride = w[15] + w[10] * w[11] * w[14]
+
+ self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))]
+
+
+# --------------------------------------------------------------------
+# registry
+
+Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept)
+
+# no default extension
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/MicImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/MicImagePlugin.py
new file mode 100644
index 0000000..8610988
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/MicImagePlugin.py
@@ -0,0 +1,113 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# Microsoft Image Composer support for PIL
+#
+# Notes:
+# uses TiffImagePlugin.py to read the actual image streams
+#
+# History:
+# 97-01-20 fl Created
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1997.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+import olefile
+
+from . import Image, TiffImagePlugin
+
+#
+# --------------------------------------------------------------------
+
+
+def _accept(prefix):
+ return prefix[:8] == olefile.MAGIC
+
+
+##
+# Image plugin for Microsoft's Image Composer file format.
+
+
+class MicImageFile(TiffImagePlugin.TiffImageFile):
+
+ format = "MIC"
+ format_description = "Microsoft Image Composer"
+ _close_exclusive_fp_after_loading = False
+
+ def _open(self):
+
+ # read the OLE directory and see if this is a likely
+ # to be a Microsoft Image Composer file
+
+ try:
+ self.ole = olefile.OleFileIO(self.fp)
+ except OSError:
+ raise SyntaxError("not an MIC file; invalid OLE file")
+
+ # find ACI subfiles with Image members (maybe not the
+ # best way to identify MIC files, but what the... ;-)
+
+ self.images = []
+ for path in self.ole.listdir():
+ if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image":
+ self.images.append(path)
+
+ # if we didn't find any images, this is probably not
+ # an MIC file.
+ if not self.images:
+ raise SyntaxError("not an MIC file; no image entries")
+
+ self.__fp = self.fp
+ self.frame = None
+
+ if len(self.images) > 1:
+ self.category = Image.CONTAINER
+
+ self.seek(0)
+
+ @property
+ def n_frames(self):
+ return len(self.images)
+
+ @property
+ def is_animated(self):
+ return len(self.images) > 1
+
+ def seek(self, frame):
+ if not self._seek_check(frame):
+ return
+ try:
+ filename = self.images[frame]
+ except IndexError:
+ raise EOFError("no such frame")
+
+ self.fp = self.ole.openstream(filename)
+
+ TiffImagePlugin.TiffImageFile._open(self)
+
+ self.frame = frame
+
+ def tell(self):
+ return self.frame
+
+ def _close__fp(self):
+ try:
+ if self.__fp != self.fp:
+ self.__fp.close()
+ except AttributeError:
+ pass
+ finally:
+ self.__fp = None
+
+
+#
+# --------------------------------------------------------------------
+
+Image.register_open(MicImageFile.format, MicImageFile, _accept)
+
+Image.register_extension(MicImageFile.format, ".mic")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/MpegImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/MpegImagePlugin.py
new file mode 100644
index 0000000..a358dfd
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/MpegImagePlugin.py
@@ -0,0 +1,83 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# MPEG file handling
+#
+# History:
+# 95-09-09 fl Created
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1995.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+from . import Image, ImageFile
+from ._binary import i8
+
+#
+# Bitstream parser
+
+
+class BitStream:
+ def __init__(self, fp):
+ self.fp = fp
+ self.bits = 0
+ self.bitbuffer = 0
+
+ def next(self):
+ return i8(self.fp.read(1))
+
+ def peek(self, bits):
+ while self.bits < bits:
+ c = self.next()
+ if c < 0:
+ self.bits = 0
+ continue
+ self.bitbuffer = (self.bitbuffer << 8) + c
+ self.bits += 8
+ return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1
+
+ def skip(self, bits):
+ while self.bits < bits:
+ self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1))
+ self.bits += 8
+ self.bits = self.bits - bits
+
+ def read(self, bits):
+ v = self.peek(bits)
+ self.bits = self.bits - bits
+ return v
+
+
+##
+# Image plugin for MPEG streams. This plugin can identify a stream,
+# but it cannot read it.
+
+
+class MpegImageFile(ImageFile.ImageFile):
+
+ format = "MPEG"
+ format_description = "MPEG"
+
+ def _open(self):
+
+ s = BitStream(self.fp)
+
+ if s.read(32) != 0x1B3:
+ raise SyntaxError("not an MPEG file")
+
+ self.mode = "RGB"
+ self._size = s.read(12), s.read(12)
+
+
+# --------------------------------------------------------------------
+# Registry stuff
+
+Image.register_open(MpegImageFile.format, MpegImageFile)
+
+Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"])
+
+Image.register_mime(MpegImageFile.format, "video/mpeg")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/MpoImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/MpoImagePlugin.py
new file mode 100644
index 0000000..e97176d
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/MpoImagePlugin.py
@@ -0,0 +1,141 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# MPO file handling
+#
+# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the
+# Camera & Imaging Products Association)
+#
+# The multi-picture object combines multiple JPEG images (with a modified EXIF
+# data format) into a single file. While it can theoretically be used much like
+# a GIF animation, it is commonly used to represent 3D photographs and is (as
+# of this writing) the most commonly used format by 3D cameras.
+#
+# History:
+# 2014-03-13 Feneric Created
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image, ImageFile, JpegImagePlugin
+from ._binary import i16be as i16
+
+
+def _accept(prefix):
+ return JpegImagePlugin._accept(prefix)
+
+
+def _save(im, fp, filename):
+ # Note that we can only save the current frame at present
+ return JpegImagePlugin._save(im, fp, filename)
+
+
+##
+# Image plugin for MPO images.
+
+
+class MpoImageFile(JpegImagePlugin.JpegImageFile):
+
+ format = "MPO"
+ format_description = "MPO (CIPA DC-007)"
+ _close_exclusive_fp_after_loading = False
+
+ def _open(self):
+ self.fp.seek(0) # prep the fp in order to pass the JPEG test
+ JpegImagePlugin.JpegImageFile._open(self)
+ self._after_jpeg_open()
+
+ def _after_jpeg_open(self, mpheader=None):
+ self.mpinfo = mpheader if mpheader is not None else self._getmp()
+ self.__framecount = self.mpinfo[0xB001]
+ self.__mpoffsets = [
+ mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002]
+ ]
+ self.__mpoffsets[0] = 0
+ # Note that the following assertion will only be invalid if something
+ # gets broken within JpegImagePlugin.
+ assert self.__framecount == len(self.__mpoffsets)
+ del self.info["mpoffset"] # no longer needed
+ self.__fp = self.fp # FIXME: hack
+ self.__fp.seek(self.__mpoffsets[0]) # get ready to read first frame
+ self.__frame = 0
+ self.offset = 0
+ # for now we can only handle reading and individual frame extraction
+ self.readonly = 1
+
+ def load_seek(self, pos):
+ self.__fp.seek(pos)
+
+ @property
+ def n_frames(self):
+ return self.__framecount
+
+ @property
+ def is_animated(self):
+ return self.__framecount > 1
+
+ def seek(self, frame):
+ if not self._seek_check(frame):
+ return
+ self.fp = self.__fp
+ self.offset = self.__mpoffsets[frame]
+
+ self.fp.seek(self.offset + 2) # skip SOI marker
+ segment = self.fp.read(2)
+ if not segment:
+ raise ValueError("No data found for frame")
+ if i16(segment) == 0xFFE1: # APP1
+ n = i16(self.fp.read(2)) - 2
+ self.info["exif"] = ImageFile._safe_read(self.fp, n)
+
+ exif = self.getexif()
+ if 40962 in exif and 40963 in exif:
+ self._size = (exif[40962], exif[40963])
+ elif "exif" in self.info:
+ del self.info["exif"]
+
+ self.tile = [("jpeg", (0, 0) + self.size, self.offset, (self.mode, ""))]
+ self.__frame = frame
+
+ def tell(self):
+ return self.__frame
+
+ def _close__fp(self):
+ try:
+ if self.__fp != self.fp:
+ self.__fp.close()
+ except AttributeError:
+ pass
+ finally:
+ self.__fp = None
+
+ @staticmethod
+ def adopt(jpeg_instance, mpheader=None):
+ """
+ Transform the instance of JpegImageFile into
+ an instance of MpoImageFile.
+ After the call, the JpegImageFile is extended
+ to be an MpoImageFile.
+
+ This is essentially useful when opening a JPEG
+ file that reveals itself as an MPO, to avoid
+ double call to _open.
+ """
+ jpeg_instance.__class__ = MpoImageFile
+ jpeg_instance._after_jpeg_open(mpheader)
+ return jpeg_instance
+
+
+# ---------------------------------------------------------------------
+# Registry stuff
+
+# Note that since MPO shares a factory with JPEG, we do not need to do a
+# separate registration for it here.
+# Image.register_open(MpoImageFile.format,
+# JpegImagePlugin.jpeg_factory, _accept)
+Image.register_save(MpoImageFile.format, _save)
+
+Image.register_extension(MpoImageFile.format, ".mpo")
+
+Image.register_mime(MpoImageFile.format, "image/mpo")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/MspImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/MspImagePlugin.py
new file mode 100644
index 0000000..2b2937e
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/MspImagePlugin.py
@@ -0,0 +1,193 @@
+#
+# The Python Imaging Library.
+#
+# MSP file handling
+#
+# This is the format used by the Paint program in Windows 1 and 2.
+#
+# History:
+# 95-09-05 fl Created
+# 97-01-03 fl Read/write MSP images
+# 17-02-21 es Fixed RLE interpretation
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1995-97.
+# Copyright (c) Eric Soroos 2017.
+#
+# See the README file for information on usage and redistribution.
+#
+# More info on this format: https://archive.org/details/gg243631
+# Page 313:
+# Figure 205. Windows Paint Version 1: "DanM" Format
+# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03
+#
+# See also: http://www.fileformat.info/format/mspaint/egff.htm
+
+import io
+import struct
+
+from . import Image, ImageFile
+from ._binary import i8, i16le as i16, o16le as o16
+
+#
+# read MSP files
+
+
+def _accept(prefix):
+ return prefix[:4] in [b"DanM", b"LinS"]
+
+
+##
+# Image plugin for Windows MSP images. This plugin supports both
+# uncompressed (Windows 1.0).
+
+
+class MspImageFile(ImageFile.ImageFile):
+
+ format = "MSP"
+ format_description = "Windows Paint"
+
+ def _open(self):
+
+ # Header
+ s = self.fp.read(32)
+ if s[:4] not in [b"DanM", b"LinS"]:
+ raise SyntaxError("not an MSP file")
+
+ # Header checksum
+ checksum = 0
+ for i in range(0, 32, 2):
+ checksum = checksum ^ i16(s[i : i + 2])
+ if checksum != 0:
+ raise SyntaxError("bad MSP checksum")
+
+ self.mode = "1"
+ self._size = i16(s[4:]), i16(s[6:])
+
+ if s[:4] == b"DanM":
+ self.tile = [("raw", (0, 0) + self.size, 32, ("1", 0, 1))]
+ else:
+ self.tile = [("MSP", (0, 0) + self.size, 32, None)]
+
+
+class MspDecoder(ImageFile.PyDecoder):
+ # The algo for the MSP decoder is from
+ # http://www.fileformat.info/format/mspaint/egff.htm
+ # cc-by-attribution -- That page references is taken from the
+ # Encyclopedia of Graphics File Formats and is licensed by
+ # O'Reilly under the Creative Common/Attribution license
+ #
+ # For RLE encoded files, the 32byte header is followed by a scan
+ # line map, encoded as one 16bit word of encoded byte length per
+ # line.
+ #
+ # NOTE: the encoded length of the line can be 0. This was not
+ # handled in the previous version of this encoder, and there's no
+ # mention of how to handle it in the documentation. From the few
+ # examples I've seen, I've assumed that it is a fill of the
+ # background color, in this case, white.
+ #
+ #
+ # Pseudocode of the decoder:
+ # Read a BYTE value as the RunType
+ # If the RunType value is zero
+ # Read next byte as the RunCount
+ # Read the next byte as the RunValue
+ # Write the RunValue byte RunCount times
+ # If the RunType value is non-zero
+ # Use this value as the RunCount
+ # Read and write the next RunCount bytes literally
+ #
+ # e.g.:
+ # 0x00 03 ff 05 00 01 02 03 04
+ # would yield the bytes:
+ # 0xff ff ff 00 01 02 03 04
+ #
+ # which are then interpreted as a bit packed mode '1' image
+
+ _pulls_fd = True
+
+ def decode(self, buffer):
+
+ img = io.BytesIO()
+ blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8))
+ try:
+ self.fd.seek(32)
+ rowmap = struct.unpack_from(
+ "<%dH" % (self.state.ysize), self.fd.read(self.state.ysize * 2)
+ )
+ except struct.error:
+ raise OSError("Truncated MSP file in row map")
+
+ for x, rowlen in enumerate(rowmap):
+ try:
+ if rowlen == 0:
+ img.write(blank_line)
+ continue
+ row = self.fd.read(rowlen)
+ if len(row) != rowlen:
+ raise OSError(
+ "Truncated MSP file, expected %d bytes on row %s", (rowlen, x)
+ )
+ idx = 0
+ while idx < rowlen:
+ runtype = i8(row[idx])
+ idx += 1
+ if runtype == 0:
+ (runcount, runval) = struct.unpack_from("Bc", row, idx)
+ img.write(runval * runcount)
+ idx += 2
+ else:
+ runcount = runtype
+ img.write(row[idx : idx + runcount])
+ idx += runcount
+
+ except struct.error:
+ raise OSError("Corrupted MSP file in row %d" % x)
+
+ self.set_as_raw(img.getvalue(), ("1", 0, 1))
+
+ return 0, 0
+
+
+Image.register_decoder("MSP", MspDecoder)
+
+
+#
+# write MSP files (uncompressed only)
+
+
+def _save(im, fp, filename):
+
+ if im.mode != "1":
+ raise OSError("cannot write mode %s as MSP" % im.mode)
+
+ # create MSP header
+ header = [0] * 16
+
+ header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1
+ header[2], header[3] = im.size
+ header[4], header[5] = 1, 1
+ header[6], header[7] = 1, 1
+ header[8], header[9] = im.size
+
+ checksum = 0
+ for h in header:
+ checksum = checksum ^ h
+ header[12] = checksum # FIXME: is this the right field?
+
+ # header
+ for h in header:
+ fp.write(o16(h))
+
+ # image body
+ ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 32, ("1", 0, 1))])
+
+
+#
+# registry
+
+Image.register_open(MspImageFile.format, MspImageFile, _accept)
+Image.register_save(MspImageFile.format, _save)
+
+Image.register_extension(MspImageFile.format, ".msp")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PSDraw.py b/geekshop/django_2.0/Lib/site-packages/PIL/PSDraw.py
new file mode 100644
index 0000000..762d31e
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PSDraw.py
@@ -0,0 +1,237 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# simple postscript graphics interface
+#
+# History:
+# 1996-04-20 fl Created
+# 1999-01-10 fl Added gsave/grestore to image method
+# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge)
+#
+# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved.
+# Copyright (c) 1996 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+import sys
+
+from . import EpsImagePlugin
+
+##
+# Simple Postscript graphics interface.
+
+
+class PSDraw:
+ """
+ Sets up printing to the given file. If **fp** is omitted,
+ :py:attr:`sys.stdout` is assumed.
+ """
+
+ def __init__(self, fp=None):
+ if not fp:
+ fp = sys.stdout
+ self.fp = fp
+
+ def _fp_write(self, to_write):
+ if self.fp == sys.stdout:
+ self.fp.write(to_write)
+ else:
+ self.fp.write(bytes(to_write, "UTF-8"))
+
+ def begin_document(self, id=None):
+ """Set up printing of a document. (Write Postscript DSC header.)"""
+ # FIXME: incomplete
+ self._fp_write(
+ "%!PS-Adobe-3.0\n"
+ "save\n"
+ "/showpage { } def\n"
+ "%%EndComments\n"
+ "%%BeginDocument\n"
+ )
+ # self._fp_write(ERROR_PS) # debugging!
+ self._fp_write(EDROFF_PS)
+ self._fp_write(VDI_PS)
+ self._fp_write("%%EndProlog\n")
+ self.isofont = {}
+
+ def end_document(self):
+ """Ends printing. (Write Postscript DSC footer.)"""
+ self._fp_write("%%EndDocument\nrestore showpage\n%%End\n")
+ if hasattr(self.fp, "flush"):
+ self.fp.flush()
+
+ def setfont(self, font, size):
+ """
+ Selects which font to use.
+
+ :param font: A Postscript font name
+ :param size: Size in points.
+ """
+ if font not in self.isofont:
+ # reencode font
+ self._fp_write("/PSDraw-{} ISOLatin1Encoding /{} E\n".format(font, font))
+ self.isofont[font] = 1
+ # rough
+ self._fp_write("/F0 %d /PSDraw-%s F\n" % (size, font))
+
+ def line(self, xy0, xy1):
+ """
+ Draws a line between the two points. Coordinates are given in
+ Postscript point coordinates (72 points per inch, (0, 0) is the lower
+ left corner of the page).
+ """
+ xy = xy0 + xy1
+ self._fp_write("%d %d %d %d Vl\n" % xy)
+
+ def rectangle(self, box):
+ """
+ Draws a rectangle.
+
+ :param box: A 4-tuple of integers whose order and function is currently
+ undocumented.
+
+ Hint: the tuple is passed into this format string:
+
+ .. code-block:: python
+
+ %d %d M %d %d 0 Vr\n
+ """
+ self._fp_write("%d %d M %d %d 0 Vr\n" % box)
+
+ def text(self, xy, text):
+ """
+ Draws text at the given position. You must use
+ :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method.
+ """
+ text = "\\(".join(text.split("("))
+ text = "\\)".join(text.split(")"))
+ xy = xy + (text,)
+ self._fp_write("%d %d M (%s) S\n" % xy)
+
+ def image(self, box, im, dpi=None):
+ """Draw a PIL image, centered in the given box."""
+ # default resolution depends on mode
+ if not dpi:
+ if im.mode == "1":
+ dpi = 200 # fax
+ else:
+ dpi = 100 # greyscale
+ # image size (on paper)
+ x = im.size[0] * 72 / dpi
+ y = im.size[1] * 72 / dpi
+ # max allowed size
+ xmax = float(box[2] - box[0])
+ ymax = float(box[3] - box[1])
+ if x > xmax:
+ y = y * xmax / x
+ x = xmax
+ if y > ymax:
+ x = x * ymax / y
+ y = ymax
+ dx = (xmax - x) / 2 + box[0]
+ dy = (ymax - y) / 2 + box[1]
+ self._fp_write("gsave\n{:f} {:f} translate\n".format(dx, dy))
+ if (x, y) != im.size:
+ # EpsImagePlugin._save prints the image at (0,0,xsize,ysize)
+ sx = x / im.size[0]
+ sy = y / im.size[1]
+ self._fp_write("{:f} {:f} scale\n".format(sx, sy))
+ EpsImagePlugin._save(im, self.fp, None, 0)
+ self._fp_write("\ngrestore\n")
+
+
+# --------------------------------------------------------------------
+# Postscript driver
+
+#
+# EDROFF.PS -- Postscript driver for Edroff 2
+#
+# History:
+# 94-01-25 fl: created (edroff 2.04)
+#
+# Copyright (c) Fredrik Lundh 1994.
+#
+
+
+EDROFF_PS = """\
+/S { show } bind def
+/P { moveto show } bind def
+/M { moveto } bind def
+/X { 0 rmoveto } bind def
+/Y { 0 exch rmoveto } bind def
+/E { findfont
+ dup maxlength dict begin
+ {
+ 1 index /FID ne { def } { pop pop } ifelse
+ } forall
+ /Encoding exch def
+ dup /FontName exch def
+ currentdict end definefont pop
+} bind def
+/F { findfont exch scalefont dup setfont
+ [ exch /setfont cvx ] cvx bind def
+} bind def
+"""
+
+#
+# VDI.PS -- Postscript driver for VDI meta commands
+#
+# History:
+# 94-01-25 fl: created (edroff 2.04)
+#
+# Copyright (c) Fredrik Lundh 1994.
+#
+
+VDI_PS = """\
+/Vm { moveto } bind def
+/Va { newpath arcn stroke } bind def
+/Vl { moveto lineto stroke } bind def
+/Vc { newpath 0 360 arc closepath } bind def
+/Vr { exch dup 0 rlineto
+ exch dup neg 0 exch rlineto
+ exch neg 0 rlineto
+ 0 exch rlineto
+ 100 div setgray fill 0 setgray } bind def
+/Tm matrix def
+/Ve { Tm currentmatrix pop
+ translate scale newpath 0 0 .5 0 360 arc closepath
+ Tm setmatrix
+} bind def
+/Vf { currentgray exch setgray fill setgray } bind def
+"""
+
+#
+# ERROR.PS -- Error handler
+#
+# History:
+# 89-11-21 fl: created (pslist 1.10)
+#
+
+ERROR_PS = """\
+/landscape false def
+/errorBUF 200 string def
+/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def
+errordict begin /handleerror {
+ initmatrix /Courier findfont 10 scalefont setfont
+ newpath 72 720 moveto $error begin /newerror false def
+ (PostScript Error) show errorNL errorNL
+ (Error: ) show
+ /errorname load errorBUF cvs show errorNL errorNL
+ (Command: ) show
+ /command load dup type /stringtype ne { errorBUF cvs } if show
+ errorNL errorNL
+ (VMstatus: ) show
+ vmstatus errorBUF cvs show ( bytes available, ) show
+ errorBUF cvs show ( bytes used at level ) show
+ errorBUF cvs show errorNL errorNL
+ (Operand stargck: ) show errorNL /ostargck load {
+ dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL
+ } forall errorNL
+ (Execution stargck: ) show errorNL /estargck load {
+ dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL
+ } forall
+ end showpage
+} def end
+"""
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PaletteFile.py b/geekshop/django_2.0/Lib/site-packages/PIL/PaletteFile.py
new file mode 100644
index 0000000..73f1b4b
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PaletteFile.py
@@ -0,0 +1,55 @@
+#
+# Python Imaging Library
+# $Id$
+#
+# stuff to read simple, teragon-style palette files
+#
+# History:
+# 97-08-23 fl Created
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1997.
+#
+# See the README file for information on usage and redistribution.
+#
+
+from ._binary import o8
+
+##
+# File handler for Teragon-style palette files.
+
+
+class PaletteFile:
+
+ rawmode = "RGB"
+
+ def __init__(self, fp):
+
+ self.palette = [(i, i, i) for i in range(256)]
+
+ while True:
+
+ s = fp.readline()
+
+ if not s:
+ break
+ if s[0:1] == b"#":
+ continue
+ if len(s) > 100:
+ raise SyntaxError("bad palette file")
+
+ v = [int(x) for x in s.split()]
+ try:
+ [i, r, g, b] = v
+ except ValueError:
+ [i, r] = v
+ g = b = r
+
+ if 0 <= i <= 255:
+ self.palette[i] = o8(r) + o8(g) + o8(b)
+
+ self.palette = b"".join(self.palette)
+
+ def getpalette(self):
+
+ return self.palette, self.rawmode
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PalmImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PalmImagePlugin.py
new file mode 100644
index 0000000..804ece3
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PalmImagePlugin.py
@@ -0,0 +1,226 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+
+##
+# Image plugin for Palm pixmap images (output only).
+##
+
+from . import Image, ImageFile
+from ._binary import o8, o16be as o16b
+
+# fmt: off
+_Palm8BitColormapValues = ( # noqa: E131
+ (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255),
+ (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204),
+ (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204),
+ (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153),
+ (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255),
+ (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255),
+ (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204),
+ (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153),
+ (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153),
+ (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255),
+ (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204),
+ (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204),
+ (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153),
+ (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255),
+ (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255),
+ (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204),
+ (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153),
+ (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153),
+ (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255),
+ (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204),
+ (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204),
+ (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153),
+ (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255),
+ (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255),
+ (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204),
+ (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153),
+ (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153),
+ (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102),
+ (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51),
+ (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51),
+ (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0),
+ (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102),
+ (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102),
+ (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51),
+ (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0),
+ (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0),
+ (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102),
+ (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51),
+ (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51),
+ (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0),
+ (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102),
+ (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102),
+ (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51),
+ (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0),
+ (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0),
+ (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102),
+ (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51),
+ (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51),
+ (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0),
+ (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102),
+ (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102),
+ (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51),
+ (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0),
+ (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17),
+ (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119),
+ (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221),
+ (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128),
+ (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0),
+ (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
+ (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
+ (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
+ (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
+ (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
+ (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0))
+# fmt: on
+
+
+# so build a prototype image to be used for palette resampling
+def build_prototype_image():
+ image = Image.new("L", (1, len(_Palm8BitColormapValues)))
+ image.putdata(list(range(len(_Palm8BitColormapValues))))
+ palettedata = ()
+ for colormapValue in _Palm8BitColormapValues:
+ palettedata += colormapValue
+ palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues))
+ image.putpalette(palettedata)
+ return image
+
+
+Palm8BitColormapImage = build_prototype_image()
+
+# OK, we now have in Palm8BitColormapImage,
+# a "P"-mode image with the right palette
+#
+# --------------------------------------------------------------------
+
+_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000}
+
+_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00}
+
+
+#
+# --------------------------------------------------------------------
+
+##
+# (Internal) Image save plugin for the Palm format.
+
+
+def _save(im, fp, filename):
+
+ if im.mode == "P":
+
+ # we assume this is a color Palm image with the standard colormap,
+ # unless the "info" dict has a "custom-colormap" field
+
+ rawmode = "P"
+ bpp = 8
+ version = 1
+
+ elif im.mode == "L":
+ if im.encoderinfo.get("bpp") in (1, 2, 4):
+ # this is 8-bit grayscale, so we shift it to get the high-order bits,
+ # and invert it because
+ # Palm does greyscale from white (0) to black (1)
+ bpp = im.encoderinfo["bpp"]
+ im = im.point(
+ lambda x, shift=8 - bpp, maxval=(1 << bpp) - 1: maxval - (x >> shift)
+ )
+ elif im.info.get("bpp") in (1, 2, 4):
+ # here we assume that even though the inherent mode is 8-bit grayscale,
+ # only the lower bpp bits are significant.
+ # We invert them to match the Palm.
+ bpp = im.info["bpp"]
+ im = im.point(lambda x, maxval=(1 << bpp) - 1: maxval - (x & maxval))
+ else:
+ raise OSError("cannot write mode %s as Palm" % im.mode)
+
+ # we ignore the palette here
+ im.mode = "P"
+ rawmode = "P;" + str(bpp)
+ version = 1
+
+ elif im.mode == "1":
+
+ # monochrome -- write it inverted, as is the Palm standard
+ rawmode = "1;I"
+ bpp = 1
+ version = 0
+
+ else:
+
+ raise OSError("cannot write mode %s as Palm" % im.mode)
+
+ #
+ # make sure image data is available
+ im.load()
+
+ # write header
+
+ cols = im.size[0]
+ rows = im.size[1]
+
+ rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2
+ transparent_index = 0
+ compression_type = _COMPRESSION_TYPES["none"]
+
+ flags = 0
+ if im.mode == "P" and "custom-colormap" in im.info:
+ flags = flags & _FLAGS["custom-colormap"]
+ colormapsize = 4 * 256 + 2
+ colormapmode = im.palette.mode
+ colormap = im.getdata().getpalette()
+ else:
+ colormapsize = 0
+
+ if "offset" in im.info:
+ offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4
+ else:
+ offset = 0
+
+ fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags))
+ fp.write(o8(bpp))
+ fp.write(o8(version))
+ fp.write(o16b(offset))
+ fp.write(o8(transparent_index))
+ fp.write(o8(compression_type))
+ fp.write(o16b(0)) # reserved by Palm
+
+ # now write colormap if necessary
+
+ if colormapsize > 0:
+ fp.write(o16b(256))
+ for i in range(256):
+ fp.write(o8(i))
+ if colormapmode == "RGB":
+ fp.write(
+ o8(colormap[3 * i])
+ + o8(colormap[3 * i + 1])
+ + o8(colormap[3 * i + 2])
+ )
+ elif colormapmode == "RGBA":
+ fp.write(
+ o8(colormap[4 * i])
+ + o8(colormap[4 * i + 1])
+ + o8(colormap[4 * i + 2])
+ )
+
+ # now convert data to raw form
+ ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))])
+
+ if hasattr(fp, "flush"):
+ fp.flush()
+
+
+#
+# --------------------------------------------------------------------
+
+Image.register_save("Palm", _save)
+
+Image.register_extension("Palm", ".palm")
+
+Image.register_mime("Palm", "image/palm")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PcdImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PcdImagePlugin.py
new file mode 100644
index 0000000..625f556
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PcdImagePlugin.py
@@ -0,0 +1,64 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# PCD file handling
+#
+# History:
+# 96-05-10 fl Created
+# 96-05-27 fl Added draft mode (128x192, 256x384)
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1996.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+from . import Image, ImageFile
+from ._binary import i8
+
+##
+# Image plugin for PhotoCD images. This plugin only reads the 768x512
+# image from the file; higher resolutions are encoded in a proprietary
+# encoding.
+
+
+class PcdImageFile(ImageFile.ImageFile):
+
+ format = "PCD"
+ format_description = "Kodak PhotoCD"
+
+ def _open(self):
+
+ # rough
+ self.fp.seek(2048)
+ s = self.fp.read(2048)
+
+ if s[:4] != b"PCD_":
+ raise SyntaxError("not a PCD file")
+
+ orientation = i8(s[1538]) & 3
+ self.tile_post_rotate = None
+ if orientation == 1:
+ self.tile_post_rotate = 90
+ elif orientation == 3:
+ self.tile_post_rotate = -90
+
+ self.mode = "RGB"
+ self._size = 768, 512 # FIXME: not correct for rotated images!
+ self.tile = [("pcd", (0, 0) + self.size, 96 * 2048, None)]
+
+ def load_end(self):
+ if self.tile_post_rotate:
+ # Handle rotated PCDs
+ self.im = self.im.rotate(self.tile_post_rotate)
+ self._size = self.im.size
+
+
+#
+# registry
+
+Image.register_open(PcdImageFile.format, PcdImageFile)
+
+Image.register_extension(PcdImageFile.format, ".pcd")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PcfFontFile.py b/geekshop/django_2.0/Lib/site-packages/PIL/PcfFontFile.py
new file mode 100644
index 0000000..c463533
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PcfFontFile.py
@@ -0,0 +1,247 @@
+#
+# THIS IS WORK IN PROGRESS
+#
+# The Python Imaging Library
+# $Id$
+#
+# portable compiled font file parser
+#
+# history:
+# 1997-08-19 fl created
+# 2003-09-13 fl fixed loading of unicode fonts
+#
+# Copyright (c) 1997-2003 by Secret Labs AB.
+# Copyright (c) 1997-2003 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+import io
+
+from . import FontFile, Image
+from ._binary import i8, i16be as b16, i16le as l16, i32be as b32, i32le as l32
+
+# --------------------------------------------------------------------
+# declarations
+
+PCF_MAGIC = 0x70636601 # "\x01fcp"
+
+PCF_PROPERTIES = 1 << 0
+PCF_ACCELERATORS = 1 << 1
+PCF_METRICS = 1 << 2
+PCF_BITMAPS = 1 << 3
+PCF_INK_METRICS = 1 << 4
+PCF_BDF_ENCODINGS = 1 << 5
+PCF_SWIDTHS = 1 << 6
+PCF_GLYPH_NAMES = 1 << 7
+PCF_BDF_ACCELERATORS = 1 << 8
+
+BYTES_PER_ROW = [
+ lambda bits: ((bits + 7) >> 3),
+ lambda bits: ((bits + 15) >> 3) & ~1,
+ lambda bits: ((bits + 31) >> 3) & ~3,
+ lambda bits: ((bits + 63) >> 3) & ~7,
+]
+
+
+def sz(s, o):
+ return s[o : s.index(b"\0", o)]
+
+
+##
+# Font file plugin for the X11 PCF format.
+
+
+class PcfFontFile(FontFile.FontFile):
+
+ name = "name"
+
+ def __init__(self, fp, charset_encoding="iso8859-1"):
+
+ self.charset_encoding = charset_encoding
+
+ magic = l32(fp.read(4))
+ if magic != PCF_MAGIC:
+ raise SyntaxError("not a PCF file")
+
+ super().__init__()
+
+ count = l32(fp.read(4))
+ self.toc = {}
+ for i in range(count):
+ type = l32(fp.read(4))
+ self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4))
+
+ self.fp = fp
+
+ self.info = self._load_properties()
+
+ metrics = self._load_metrics()
+ bitmaps = self._load_bitmaps(metrics)
+ encoding = self._load_encoding()
+
+ #
+ # create glyph structure
+
+ for ch in range(256):
+ ix = encoding[ch]
+ if ix is not None:
+ x, y, l, r, w, a, d, f = metrics[ix]
+ glyph = (w, 0), (l, d - y, x + l, d), (0, 0, x, y), bitmaps[ix]
+ self.glyph[ch] = glyph
+
+ def _getformat(self, tag):
+
+ format, size, offset = self.toc[tag]
+
+ fp = self.fp
+ fp.seek(offset)
+
+ format = l32(fp.read(4))
+
+ if format & 4:
+ i16, i32 = b16, b32
+ else:
+ i16, i32 = l16, l32
+
+ return fp, format, i16, i32
+
+ def _load_properties(self):
+
+ #
+ # font properties
+
+ properties = {}
+
+ fp, format, i16, i32 = self._getformat(PCF_PROPERTIES)
+
+ nprops = i32(fp.read(4))
+
+ # read property description
+ p = []
+ for i in range(nprops):
+ p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))))
+ if nprops & 3:
+ fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad
+
+ data = fp.read(i32(fp.read(4)))
+
+ for k, s, v in p:
+ k = sz(data, k)
+ if s:
+ v = sz(data, v)
+ properties[k] = v
+
+ return properties
+
+ def _load_metrics(self):
+
+ #
+ # font metrics
+
+ metrics = []
+
+ fp, format, i16, i32 = self._getformat(PCF_METRICS)
+
+ append = metrics.append
+
+ if (format & 0xFF00) == 0x100:
+
+ # "compressed" metrics
+ for i in range(i16(fp.read(2))):
+ left = i8(fp.read(1)) - 128
+ right = i8(fp.read(1)) - 128
+ width = i8(fp.read(1)) - 128
+ ascent = i8(fp.read(1)) - 128
+ descent = i8(fp.read(1)) - 128
+ xsize = right - left
+ ysize = ascent + descent
+ append((xsize, ysize, left, right, width, ascent, descent, 0))
+
+ else:
+
+ # "jumbo" metrics
+ for i in range(i32(fp.read(4))):
+ left = i16(fp.read(2))
+ right = i16(fp.read(2))
+ width = i16(fp.read(2))
+ ascent = i16(fp.read(2))
+ descent = i16(fp.read(2))
+ attributes = i16(fp.read(2))
+ xsize = right - left
+ ysize = ascent + descent
+ append((xsize, ysize, left, right, width, ascent, descent, attributes))
+
+ return metrics
+
+ def _load_bitmaps(self, metrics):
+
+ #
+ # bitmap data
+
+ bitmaps = []
+
+ fp, format, i16, i32 = self._getformat(PCF_BITMAPS)
+
+ nbitmaps = i32(fp.read(4))
+
+ if nbitmaps != len(metrics):
+ raise OSError("Wrong number of bitmaps")
+
+ offsets = []
+ for i in range(nbitmaps):
+ offsets.append(i32(fp.read(4)))
+
+ bitmapSizes = []
+ for i in range(4):
+ bitmapSizes.append(i32(fp.read(4)))
+
+ # byteorder = format & 4 # non-zero => MSB
+ bitorder = format & 8 # non-zero => MSB
+ padindex = format & 3
+
+ bitmapsize = bitmapSizes[padindex]
+ offsets.append(bitmapsize)
+
+ data = fp.read(bitmapsize)
+
+ pad = BYTES_PER_ROW[padindex]
+ mode = "1;R"
+ if bitorder:
+ mode = "1"
+
+ for i in range(nbitmaps):
+ x, y, l, r, w, a, d, f = metrics[i]
+ b, e = offsets[i], offsets[i + 1]
+ bitmaps.append(Image.frombytes("1", (x, y), data[b:e], "raw", mode, pad(x)))
+
+ return bitmaps
+
+ def _load_encoding(self):
+
+ # map character code to bitmap index
+ encoding = [None] * 256
+
+ fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS)
+
+ firstCol, lastCol = i16(fp.read(2)), i16(fp.read(2))
+ firstRow, lastRow = i16(fp.read(2)), i16(fp.read(2))
+
+ i16(fp.read(2)) # default
+
+ nencoding = (lastCol - firstCol + 1) * (lastRow - firstRow + 1)
+
+ encodingOffsets = [i16(fp.read(2)) for _ in range(nencoding)]
+
+ for i in range(firstCol, len(encoding)):
+ try:
+ encodingOffset = encodingOffsets[
+ ord(bytearray([i]).decode(self.charset_encoding))
+ ]
+ if encodingOffset != 0xFFFF:
+ encoding[i] = encodingOffset
+ except UnicodeDecodeError:
+ # character is not supported in selected encoding
+ pass
+
+ return encoding
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PcxImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PcxImagePlugin.py
new file mode 100644
index 0000000..6cf10de
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PcxImagePlugin.py
@@ -0,0 +1,206 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# PCX file handling
+#
+# This format was originally used by ZSoft's popular PaintBrush
+# program for the IBM PC. It is also supported by many MS-DOS and
+# Windows applications, including the Windows PaintBrush program in
+# Windows 3.
+#
+# history:
+# 1995-09-01 fl Created
+# 1996-05-20 fl Fixed RGB support
+# 1997-01-03 fl Fixed 2-bit and 4-bit support
+# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1)
+# 1999-02-07 fl Added write support
+# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust
+# 2002-07-30 fl Seek from to current position, not beginning of file
+# 2003-06-03 fl Extract DPI settings (info["dpi"])
+#
+# Copyright (c) 1997-2003 by Secret Labs AB.
+# Copyright (c) 1995-2003 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+import io
+import logging
+
+from . import Image, ImageFile, ImagePalette
+from ._binary import i8, i16le as i16, o8, o16le as o16
+
+logger = logging.getLogger(__name__)
+
+
+def _accept(prefix):
+ return i8(prefix[0]) == 10 and i8(prefix[1]) in [0, 2, 3, 5]
+
+
+##
+# Image plugin for Paintbrush images.
+
+
+class PcxImageFile(ImageFile.ImageFile):
+
+ format = "PCX"
+ format_description = "Paintbrush"
+
+ def _open(self):
+
+ # header
+ s = self.fp.read(128)
+ if not _accept(s):
+ raise SyntaxError("not a PCX file")
+
+ # image
+ bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1
+ if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]:
+ raise SyntaxError("bad PCX image size")
+ logger.debug("BBox: %s %s %s %s", *bbox)
+
+ # format
+ version = i8(s[1])
+ bits = i8(s[3])
+ planes = i8(s[65])
+ stride = i16(s, 66)
+ logger.debug(
+ "PCX version %s, bits %s, planes %s, stride %s",
+ version,
+ bits,
+ planes,
+ stride,
+ )
+
+ self.info["dpi"] = i16(s, 12), i16(s, 14)
+
+ if bits == 1 and planes == 1:
+ mode = rawmode = "1"
+
+ elif bits == 1 and planes in (2, 4):
+ mode = "P"
+ rawmode = "P;%dL" % planes
+ self.palette = ImagePalette.raw("RGB", s[16:64])
+
+ elif version == 5 and bits == 8 and planes == 1:
+ mode = rawmode = "L"
+ # FIXME: hey, this doesn't work with the incremental loader !!!
+ self.fp.seek(-769, io.SEEK_END)
+ s = self.fp.read(769)
+ if len(s) == 769 and i8(s[0]) == 12:
+ # check if the palette is linear greyscale
+ for i in range(256):
+ if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3:
+ mode = rawmode = "P"
+ break
+ if mode == "P":
+ self.palette = ImagePalette.raw("RGB", s[1:])
+ self.fp.seek(128)
+
+ elif version == 5 and bits == 8 and planes == 3:
+ mode = "RGB"
+ rawmode = "RGB;L"
+
+ else:
+ raise OSError("unknown PCX mode")
+
+ self.mode = mode
+ self._size = bbox[2] - bbox[0], bbox[3] - bbox[1]
+
+ bbox = (0, 0) + self.size
+ logger.debug("size: %sx%s", *self.size)
+
+ self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))]
+
+
+# --------------------------------------------------------------------
+# save PCX files
+
+
+SAVE = {
+ # mode: (version, bits, planes, raw mode)
+ "1": (2, 1, 1, "1"),
+ "L": (5, 8, 1, "L"),
+ "P": (5, 8, 1, "P"),
+ "RGB": (5, 8, 3, "RGB;L"),
+}
+
+
+def _save(im, fp, filename):
+
+ try:
+ version, bits, planes, rawmode = SAVE[im.mode]
+ except KeyError:
+ raise ValueError("Cannot save %s images as PCX" % im.mode)
+
+ # bytes per plane
+ stride = (im.size[0] * bits + 7) // 8
+ # stride should be even
+ stride += stride % 2
+ # Stride needs to be kept in sync with the PcxEncode.c version.
+ # Ideally it should be passed in in the state, but the bytes value
+ # gets overwritten.
+
+ logger.debug(
+ "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d",
+ im.size[0],
+ bits,
+ stride,
+ )
+
+ # under windows, we could determine the current screen size with
+ # "Image.core.display_mode()[1]", but I think that's overkill...
+
+ screen = im.size
+
+ dpi = 100, 100
+
+ # PCX header
+ fp.write(
+ o8(10)
+ + o8(version)
+ + o8(1)
+ + o8(bits)
+ + o16(0)
+ + o16(0)
+ + o16(im.size[0] - 1)
+ + o16(im.size[1] - 1)
+ + o16(dpi[0])
+ + o16(dpi[1])
+ + b"\0" * 24
+ + b"\xFF" * 24
+ + b"\0"
+ + o8(planes)
+ + o16(stride)
+ + o16(1)
+ + o16(screen[0])
+ + o16(screen[1])
+ + b"\0" * 54
+ )
+
+ assert fp.tell() == 128
+
+ ImageFile._save(im, fp, [("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))])
+
+ if im.mode == "P":
+ # colour palette
+ fp.write(o8(12))
+ fp.write(im.im.getpalette("RGB", "RGB")) # 768 bytes
+ elif im.mode == "L":
+ # greyscale palette
+ fp.write(o8(12))
+ for i in range(256):
+ fp.write(o8(i) * 3)
+
+
+# --------------------------------------------------------------------
+# registry
+
+
+Image.register_open(PcxImageFile.format, PcxImageFile, _accept)
+Image.register_save(PcxImageFile.format, _save)
+
+Image.register_extension(PcxImageFile.format, ".pcx")
+
+Image.register_mime(PcxImageFile.format, "image/x-pcx")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PdfImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PdfImagePlugin.py
new file mode 100644
index 0000000..47500ba
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PdfImagePlugin.py
@@ -0,0 +1,243 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# PDF (Acrobat) file handling
+#
+# History:
+# 1996-07-16 fl Created
+# 1997-01-18 fl Fixed header
+# 2004-02-21 fl Fixes for 1/L/CMYK images, etc.
+# 2004-02-24 fl Fixes for 1 and P images.
+#
+# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved.
+# Copyright (c) 1996-1997 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+##
+# Image plugin for PDF images (output only).
+##
+
+import io
+import os
+import time
+
+from . import Image, ImageFile, ImageSequence, PdfParser, __version__
+
+#
+# --------------------------------------------------------------------
+
+# object ids:
+# 1. catalogue
+# 2. pages
+# 3. image
+# 4. page
+# 5. page contents
+
+
+def _save_all(im, fp, filename):
+ _save(im, fp, filename, save_all=True)
+
+
+##
+# (Internal) Image save plugin for the PDF format.
+
+
+def _save(im, fp, filename, save_all=False):
+ is_appending = im.encoderinfo.get("append", False)
+ if is_appending:
+ existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b")
+ else:
+ existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b")
+
+ resolution = im.encoderinfo.get("resolution", 72.0)
+
+ info = {
+ "title": None
+ if is_appending
+ else os.path.splitext(os.path.basename(filename))[0],
+ "author": None,
+ "subject": None,
+ "keywords": None,
+ "creator": None,
+ "producer": None,
+ "creationDate": None if is_appending else time.gmtime(),
+ "modDate": None if is_appending else time.gmtime(),
+ }
+ for k, default in info.items():
+ v = im.encoderinfo.get(k) if k in im.encoderinfo else default
+ if v:
+ existing_pdf.info[k[0].upper() + k[1:]] = v
+
+ #
+ # make sure image data is available
+ im.load()
+
+ existing_pdf.start_writing()
+ existing_pdf.write_header()
+ existing_pdf.write_comment("created by Pillow {} PDF driver".format(__version__))
+
+ #
+ # pages
+ ims = [im]
+ if save_all:
+ append_images = im.encoderinfo.get("append_images", [])
+ for append_im in append_images:
+ append_im.encoderinfo = im.encoderinfo.copy()
+ ims.append(append_im)
+ numberOfPages = 0
+ image_refs = []
+ page_refs = []
+ contents_refs = []
+ for im in ims:
+ im_numberOfPages = 1
+ if save_all:
+ try:
+ im_numberOfPages = im.n_frames
+ except AttributeError:
+ # Image format does not have n_frames.
+ # It is a single frame image
+ pass
+ numberOfPages += im_numberOfPages
+ for i in range(im_numberOfPages):
+ image_refs.append(existing_pdf.next_object_id(0))
+ page_refs.append(existing_pdf.next_object_id(0))
+ contents_refs.append(existing_pdf.next_object_id(0))
+ existing_pdf.pages.append(page_refs[-1])
+
+ #
+ # catalog and list of pages
+ existing_pdf.write_catalog()
+
+ pageNumber = 0
+ for imSequence in ims:
+ im_pages = ImageSequence.Iterator(imSequence) if save_all else [imSequence]
+ for im in im_pages:
+ # FIXME: Should replace ASCIIHexDecode with RunLengthDecode
+ # (packbits) or LZWDecode (tiff/lzw compression). Note that
+ # PDF 1.2 also supports Flatedecode (zip compression).
+
+ bits = 8
+ params = None
+
+ if im.mode == "1":
+ filter = "ASCIIHexDecode"
+ colorspace = PdfParser.PdfName("DeviceGray")
+ procset = "ImageB" # grayscale
+ bits = 1
+ elif im.mode == "L":
+ filter = "DCTDecode"
+ # params = "<< /Predictor 15 /Columns %d >>" % (width-2)
+ colorspace = PdfParser.PdfName("DeviceGray")
+ procset = "ImageB" # grayscale
+ elif im.mode == "P":
+ filter = "ASCIIHexDecode"
+ palette = im.im.getpalette("RGB")
+ colorspace = [
+ PdfParser.PdfName("Indexed"),
+ PdfParser.PdfName("DeviceRGB"),
+ 255,
+ PdfParser.PdfBinary(palette),
+ ]
+ procset = "ImageI" # indexed color
+ elif im.mode == "RGB":
+ filter = "DCTDecode"
+ colorspace = PdfParser.PdfName("DeviceRGB")
+ procset = "ImageC" # color images
+ elif im.mode == "CMYK":
+ filter = "DCTDecode"
+ colorspace = PdfParser.PdfName("DeviceCMYK")
+ procset = "ImageC" # color images
+ else:
+ raise ValueError("cannot save mode %s" % im.mode)
+
+ #
+ # image
+
+ op = io.BytesIO()
+
+ if filter == "ASCIIHexDecode":
+ if bits == 1:
+ # FIXME: the hex encoder doesn't support packed 1-bit
+ # images; do things the hard way...
+ data = im.tobytes("raw", "1")
+ im = Image.new("L", im.size)
+ im.putdata(data)
+ ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)])
+ elif filter == "DCTDecode":
+ Image.SAVE["JPEG"](im, op, filename)
+ elif filter == "FlateDecode":
+ ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)])
+ elif filter == "RunLengthDecode":
+ ImageFile._save(im, op, [("packbits", (0, 0) + im.size, 0, im.mode)])
+ else:
+ raise ValueError("unsupported PDF filter (%s)" % filter)
+
+ #
+ # Get image characteristics
+
+ width, height = im.size
+
+ existing_pdf.write_obj(
+ image_refs[pageNumber],
+ stream=op.getvalue(),
+ Type=PdfParser.PdfName("XObject"),
+ Subtype=PdfParser.PdfName("Image"),
+ Width=width, # * 72.0 / resolution,
+ Height=height, # * 72.0 / resolution,
+ Filter=PdfParser.PdfName(filter),
+ BitsPerComponent=bits,
+ DecodeParams=params,
+ ColorSpace=colorspace,
+ )
+
+ #
+ # page
+
+ existing_pdf.write_page(
+ page_refs[pageNumber],
+ Resources=PdfParser.PdfDict(
+ ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)],
+ XObject=PdfParser.PdfDict(image=image_refs[pageNumber]),
+ ),
+ MediaBox=[
+ 0,
+ 0,
+ int(width * 72.0 / resolution),
+ int(height * 72.0 / resolution),
+ ],
+ Contents=contents_refs[pageNumber],
+ )
+
+ #
+ # page contents
+
+ page_contents = b"q %d 0 0 %d 0 0 cm /image Do Q\n" % (
+ int(width * 72.0 / resolution),
+ int(height * 72.0 / resolution),
+ )
+
+ existing_pdf.write_obj(contents_refs[pageNumber], stream=page_contents)
+
+ pageNumber += 1
+
+ #
+ # trailer
+ existing_pdf.write_xref_and_trailer()
+ if hasattr(fp, "flush"):
+ fp.flush()
+ existing_pdf.close()
+
+
+#
+# --------------------------------------------------------------------
+
+
+Image.register_save("PDF", _save)
+Image.register_save_all("PDF", _save_all)
+
+Image.register_extension("PDF", ".pdf")
+
+Image.register_mime("PDF", "application/pdf")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PdfParser.py b/geekshop/django_2.0/Lib/site-packages/PIL/PdfParser.py
new file mode 100644
index 0000000..fdb35ed
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PdfParser.py
@@ -0,0 +1,995 @@
+import calendar
+import codecs
+import collections
+import mmap
+import os
+import re
+import time
+import zlib
+
+
+# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set
+# on page 656
+def encode_text(s):
+ return codecs.BOM_UTF16_BE + s.encode("utf_16_be")
+
+
+PDFDocEncoding = {
+ 0x16: "\u0017",
+ 0x18: "\u02D8",
+ 0x19: "\u02C7",
+ 0x1A: "\u02C6",
+ 0x1B: "\u02D9",
+ 0x1C: "\u02DD",
+ 0x1D: "\u02DB",
+ 0x1E: "\u02DA",
+ 0x1F: "\u02DC",
+ 0x80: "\u2022",
+ 0x81: "\u2020",
+ 0x82: "\u2021",
+ 0x83: "\u2026",
+ 0x84: "\u2014",
+ 0x85: "\u2013",
+ 0x86: "\u0192",
+ 0x87: "\u2044",
+ 0x88: "\u2039",
+ 0x89: "\u203A",
+ 0x8A: "\u2212",
+ 0x8B: "\u2030",
+ 0x8C: "\u201E",
+ 0x8D: "\u201C",
+ 0x8E: "\u201D",
+ 0x8F: "\u2018",
+ 0x90: "\u2019",
+ 0x91: "\u201A",
+ 0x92: "\u2122",
+ 0x93: "\uFB01",
+ 0x94: "\uFB02",
+ 0x95: "\u0141",
+ 0x96: "\u0152",
+ 0x97: "\u0160",
+ 0x98: "\u0178",
+ 0x99: "\u017D",
+ 0x9A: "\u0131",
+ 0x9B: "\u0142",
+ 0x9C: "\u0153",
+ 0x9D: "\u0161",
+ 0x9E: "\u017E",
+ 0xA0: "\u20AC",
+}
+
+
+def decode_text(b):
+ if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE:
+ return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be")
+ else:
+ return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b)
+
+
+class PdfFormatError(RuntimeError):
+ """An error that probably indicates a syntactic or semantic error in the
+ PDF file structure"""
+
+ pass
+
+
+def check_format_condition(condition, error_message):
+ if not condition:
+ raise PdfFormatError(error_message)
+
+
+class IndirectReference(
+ collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"])
+):
+ def __str__(self):
+ return "%s %s R" % self
+
+ def __bytes__(self):
+ return self.__str__().encode("us-ascii")
+
+ def __eq__(self, other):
+ return (
+ other.__class__ is self.__class__
+ and other.object_id == self.object_id
+ and other.generation == self.generation
+ )
+
+ def __ne__(self, other):
+ return not (self == other)
+
+ def __hash__(self):
+ return hash((self.object_id, self.generation))
+
+
+class IndirectObjectDef(IndirectReference):
+ def __str__(self):
+ return "%s %s obj" % self
+
+
+class XrefTable:
+ def __init__(self):
+ self.existing_entries = {} # object ID => (offset, generation)
+ self.new_entries = {} # object ID => (offset, generation)
+ self.deleted_entries = {0: 65536} # object ID => generation
+ self.reading_finished = False
+
+ def __setitem__(self, key, value):
+ if self.reading_finished:
+ self.new_entries[key] = value
+ else:
+ self.existing_entries[key] = value
+ if key in self.deleted_entries:
+ del self.deleted_entries[key]
+
+ def __getitem__(self, key):
+ try:
+ return self.new_entries[key]
+ except KeyError:
+ return self.existing_entries[key]
+
+ def __delitem__(self, key):
+ if key in self.new_entries:
+ generation = self.new_entries[key][1] + 1
+ del self.new_entries[key]
+ self.deleted_entries[key] = generation
+ elif key in self.existing_entries:
+ generation = self.existing_entries[key][1] + 1
+ self.deleted_entries[key] = generation
+ elif key in self.deleted_entries:
+ generation = self.deleted_entries[key]
+ else:
+ raise IndexError(
+ "object ID " + str(key) + " cannot be deleted because it doesn't exist"
+ )
+
+ def __contains__(self, key):
+ return key in self.existing_entries or key in self.new_entries
+
+ def __len__(self):
+ return len(
+ set(self.existing_entries.keys())
+ | set(self.new_entries.keys())
+ | set(self.deleted_entries.keys())
+ )
+
+ def keys(self):
+ return (
+ set(self.existing_entries.keys()) - set(self.deleted_entries.keys())
+ ) | set(self.new_entries.keys())
+
+ def write(self, f):
+ keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys()))
+ deleted_keys = sorted(set(self.deleted_entries.keys()))
+ startxref = f.tell()
+ f.write(b"xref\n")
+ while keys:
+ # find a contiguous sequence of object IDs
+ prev = None
+ for index, key in enumerate(keys):
+ if prev is None or prev + 1 == key:
+ prev = key
+ else:
+ contiguous_keys = keys[:index]
+ keys = keys[index:]
+ break
+ else:
+ contiguous_keys = keys
+ keys = None
+ f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys)))
+ for object_id in contiguous_keys:
+ if object_id in self.new_entries:
+ f.write(b"%010d %05d n \n" % self.new_entries[object_id])
+ else:
+ this_deleted_object_id = deleted_keys.pop(0)
+ check_format_condition(
+ object_id == this_deleted_object_id,
+ "expected the next deleted object ID to be %s, instead found %s"
+ % (object_id, this_deleted_object_id),
+ )
+ try:
+ next_in_linked_list = deleted_keys[0]
+ except IndexError:
+ next_in_linked_list = 0
+ f.write(
+ b"%010d %05d f \n"
+ % (next_in_linked_list, self.deleted_entries[object_id])
+ )
+ return startxref
+
+
+class PdfName:
+ def __init__(self, name):
+ if isinstance(name, PdfName):
+ self.name = name.name
+ elif isinstance(name, bytes):
+ self.name = name
+ else:
+ self.name = name.encode("us-ascii")
+
+ def name_as_str(self):
+ return self.name.decode("us-ascii")
+
+ def __eq__(self, other):
+ return (
+ isinstance(other, PdfName) and other.name == self.name
+ ) or other == self.name
+
+ def __hash__(self):
+ return hash(self.name)
+
+ def __repr__(self):
+ return "PdfName(%s)" % repr(self.name)
+
+ @classmethod
+ def from_pdf_stream(cls, data):
+ return cls(PdfParser.interpret_name(data))
+
+ allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"}
+
+ def __bytes__(self):
+ result = bytearray(b"/")
+ for b in self.name:
+ if b in self.allowed_chars:
+ result.append(b)
+ else:
+ result.extend(b"#%02X" % b)
+ return bytes(result)
+
+
+class PdfArray(list):
+ def __bytes__(self):
+ return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]"
+
+
+class PdfDict(collections.UserDict):
+ def __setattr__(self, key, value):
+ if key == "data":
+ collections.UserDict.__setattr__(self, key, value)
+ else:
+ self[key.encode("us-ascii")] = value
+
+ def __getattr__(self, key):
+ try:
+ value = self[key.encode("us-ascii")]
+ except KeyError:
+ raise AttributeError(key)
+ if isinstance(value, bytes):
+ value = decode_text(value)
+ if key.endswith("Date"):
+ if value.startswith("D:"):
+ value = value[2:]
+
+ relationship = "Z"
+ if len(value) > 17:
+ relationship = value[14]
+ offset = int(value[15:17]) * 60
+ if len(value) > 20:
+ offset += int(value[18:20])
+
+ format = "%Y%m%d%H%M%S"[: len(value) - 2]
+ value = time.strptime(value[: len(format) + 2], format)
+ if relationship in ["+", "-"]:
+ offset *= 60
+ if relationship == "+":
+ offset *= -1
+ value = time.gmtime(calendar.timegm(value) + offset)
+ return value
+
+ def __bytes__(self):
+ out = bytearray(b"<<")
+ for key, value in self.items():
+ if value is None:
+ continue
+ value = pdf_repr(value)
+ out.extend(b"\n")
+ out.extend(bytes(PdfName(key)))
+ out.extend(b" ")
+ out.extend(value)
+ out.extend(b"\n>>")
+ return bytes(out)
+
+
+class PdfBinary:
+ def __init__(self, data):
+ self.data = data
+
+ def __bytes__(self):
+ return b"<%s>" % b"".join(b"%02X" % b for b in self.data)
+
+
+class PdfStream:
+ def __init__(self, dictionary, buf):
+ self.dictionary = dictionary
+ self.buf = buf
+
+ def decode(self):
+ try:
+ filter = self.dictionary.Filter
+ except AttributeError:
+ return self.buf
+ if filter == b"FlateDecode":
+ try:
+ expected_length = self.dictionary.DL
+ except AttributeError:
+ expected_length = self.dictionary.Length
+ return zlib.decompress(self.buf, bufsize=int(expected_length))
+ else:
+ raise NotImplementedError(
+ "stream filter %s unknown/unsupported" % repr(self.dictionary.Filter)
+ )
+
+
+def pdf_repr(x):
+ if x is True:
+ return b"true"
+ elif x is False:
+ return b"false"
+ elif x is None:
+ return b"null"
+ elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)):
+ return bytes(x)
+ elif isinstance(x, int):
+ return str(x).encode("us-ascii")
+ elif isinstance(x, time.struct_time):
+ return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")"
+ elif isinstance(x, dict):
+ return bytes(PdfDict(x))
+ elif isinstance(x, list):
+ return bytes(PdfArray(x))
+ elif isinstance(x, str):
+ return pdf_repr(encode_text(x))
+ elif isinstance(x, bytes):
+ # XXX escape more chars? handle binary garbage
+ x = x.replace(b"\\", b"\\\\")
+ x = x.replace(b"(", b"\\(")
+ x = x.replace(b")", b"\\)")
+ return b"(" + x + b")"
+ else:
+ return bytes(x)
+
+
+class PdfParser:
+ """Based on
+ https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
+ Supports PDF up to 1.4
+ """
+
+ def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"):
+ if buf and f:
+ raise RuntimeError("specify buf or f or filename, but not both buf and f")
+ self.filename = filename
+ self.buf = buf
+ self.f = f
+ self.start_offset = start_offset
+ self.should_close_buf = False
+ self.should_close_file = False
+ if filename is not None and f is None:
+ self.f = f = open(filename, mode)
+ self.should_close_file = True
+ if f is not None:
+ self.buf = buf = self.get_buf_from_file(f)
+ self.should_close_buf = True
+ if not filename and hasattr(f, "name"):
+ self.filename = f.name
+ self.cached_objects = {}
+ if buf:
+ self.read_pdf_info()
+ else:
+ self.file_size_total = self.file_size_this = 0
+ self.root = PdfDict()
+ self.root_ref = None
+ self.info = PdfDict()
+ self.info_ref = None
+ self.page_tree_root = {}
+ self.pages = []
+ self.orig_pages = []
+ self.pages_ref = None
+ self.last_xref_section_offset = None
+ self.trailer_dict = {}
+ self.xref_table = XrefTable()
+ self.xref_table.reading_finished = True
+ if f:
+ self.seek_end()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self.close()
+ return False # do not suppress exceptions
+
+ def start_writing(self):
+ self.close_buf()
+ self.seek_end()
+
+ def close_buf(self):
+ try:
+ self.buf.close()
+ except AttributeError:
+ pass
+ self.buf = None
+
+ def close(self):
+ if self.should_close_buf:
+ self.close_buf()
+ if self.f is not None and self.should_close_file:
+ self.f.close()
+ self.f = None
+
+ def seek_end(self):
+ self.f.seek(0, os.SEEK_END)
+
+ def write_header(self):
+ self.f.write(b"%PDF-1.4\n")
+
+ def write_comment(self, s):
+ self.f.write(("% {}\n".format(s)).encode("utf-8"))
+
+ def write_catalog(self):
+ self.del_root()
+ self.root_ref = self.next_object_id(self.f.tell())
+ self.pages_ref = self.next_object_id(0)
+ self.rewrite_pages()
+ self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref)
+ self.write_obj(
+ self.pages_ref,
+ Type=PdfName(b"Pages"),
+ Count=len(self.pages),
+ Kids=self.pages,
+ )
+ return self.root_ref
+
+ def rewrite_pages(self):
+ pages_tree_nodes_to_delete = []
+ for i, page_ref in enumerate(self.orig_pages):
+ page_info = self.cached_objects[page_ref]
+ del self.xref_table[page_ref.object_id]
+ pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")])
+ if page_ref not in self.pages:
+ # the page has been deleted
+ continue
+ # make dict keys into strings for passing to write_page
+ stringified_page_info = {}
+ for key, value in page_info.items():
+ # key should be a PdfName
+ stringified_page_info[key.name_as_str()] = value
+ stringified_page_info["Parent"] = self.pages_ref
+ new_page_ref = self.write_page(None, **stringified_page_info)
+ for j, cur_page_ref in enumerate(self.pages):
+ if cur_page_ref == page_ref:
+ # replace the page reference with the new one
+ self.pages[j] = new_page_ref
+ # delete redundant Pages tree nodes from xref table
+ for pages_tree_node_ref in pages_tree_nodes_to_delete:
+ while pages_tree_node_ref:
+ pages_tree_node = self.cached_objects[pages_tree_node_ref]
+ if pages_tree_node_ref.object_id in self.xref_table:
+ del self.xref_table[pages_tree_node_ref.object_id]
+ pages_tree_node_ref = pages_tree_node.get(b"Parent", None)
+ self.orig_pages = []
+
+ def write_xref_and_trailer(self, new_root_ref=None):
+ if new_root_ref:
+ self.del_root()
+ self.root_ref = new_root_ref
+ if self.info:
+ self.info_ref = self.write_obj(None, self.info)
+ start_xref = self.xref_table.write(self.f)
+ num_entries = len(self.xref_table)
+ trailer_dict = {b"Root": self.root_ref, b"Size": num_entries}
+ if self.last_xref_section_offset is not None:
+ trailer_dict[b"Prev"] = self.last_xref_section_offset
+ if self.info:
+ trailer_dict[b"Info"] = self.info_ref
+ self.last_xref_section_offset = start_xref
+ self.f.write(
+ b"trailer\n"
+ + bytes(PdfDict(trailer_dict))
+ + b"\nstartxref\n%d\n%%%%EOF" % start_xref
+ )
+
+ def write_page(self, ref, *objs, **dict_obj):
+ if isinstance(ref, int):
+ ref = self.pages[ref]
+ if "Type" not in dict_obj:
+ dict_obj["Type"] = PdfName(b"Page")
+ if "Parent" not in dict_obj:
+ dict_obj["Parent"] = self.pages_ref
+ return self.write_obj(ref, *objs, **dict_obj)
+
+ def write_obj(self, ref, *objs, **dict_obj):
+ f = self.f
+ if ref is None:
+ ref = self.next_object_id(f.tell())
+ else:
+ self.xref_table[ref.object_id] = (f.tell(), ref.generation)
+ f.write(bytes(IndirectObjectDef(*ref)))
+ stream = dict_obj.pop("stream", None)
+ if stream is not None:
+ dict_obj["Length"] = len(stream)
+ if dict_obj:
+ f.write(pdf_repr(dict_obj))
+ for obj in objs:
+ f.write(pdf_repr(obj))
+ if stream is not None:
+ f.write(b"stream\n")
+ f.write(stream)
+ f.write(b"\nendstream\n")
+ f.write(b"endobj\n")
+ return ref
+
+ def del_root(self):
+ if self.root_ref is None:
+ return
+ del self.xref_table[self.root_ref.object_id]
+ del self.xref_table[self.root[b"Pages"].object_id]
+
+ @staticmethod
+ def get_buf_from_file(f):
+ if hasattr(f, "getbuffer"):
+ return f.getbuffer()
+ elif hasattr(f, "getvalue"):
+ return f.getvalue()
+ else:
+ try:
+ return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
+ except ValueError: # cannot mmap an empty file
+ return b""
+
+ def read_pdf_info(self):
+ self.file_size_total = len(self.buf)
+ self.file_size_this = self.file_size_total - self.start_offset
+ self.read_trailer()
+ self.root_ref = self.trailer_dict[b"Root"]
+ self.info_ref = self.trailer_dict.get(b"Info", None)
+ self.root = PdfDict(self.read_indirect(self.root_ref))
+ if self.info_ref is None:
+ self.info = PdfDict()
+ else:
+ self.info = PdfDict(self.read_indirect(self.info_ref))
+ check_format_condition(b"Type" in self.root, "/Type missing in Root")
+ check_format_condition(
+ self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog"
+ )
+ check_format_condition(b"Pages" in self.root, "/Pages missing in Root")
+ check_format_condition(
+ isinstance(self.root[b"Pages"], IndirectReference),
+ "/Pages in Root is not an indirect reference",
+ )
+ self.pages_ref = self.root[b"Pages"]
+ self.page_tree_root = self.read_indirect(self.pages_ref)
+ self.pages = self.linearize_page_tree(self.page_tree_root)
+ # save the original list of page references
+ # in case the user modifies, adds or deletes some pages
+ # and we need to rewrite the pages and their list
+ self.orig_pages = self.pages[:]
+
+ def next_object_id(self, offset=None):
+ try:
+ # TODO: support reuse of deleted objects
+ reference = IndirectReference(max(self.xref_table.keys()) + 1, 0)
+ except ValueError:
+ reference = IndirectReference(1, 0)
+ if offset is not None:
+ self.xref_table[reference.object_id] = (offset, 0)
+ return reference
+
+ delimiter = br"[][()<>{}/%]"
+ delimiter_or_ws = br"[][()<>{}/%\000\011\012\014\015\040]"
+ whitespace = br"[\000\011\012\014\015\040]"
+ whitespace_or_hex = br"[\000\011\012\014\015\0400-9a-fA-F]"
+ whitespace_optional = whitespace + b"*"
+ whitespace_mandatory = whitespace + b"+"
+ newline_only = br"[\r\n]+"
+ newline = whitespace_optional + newline_only + whitespace_optional
+ re_trailer_end = re.compile(
+ whitespace_mandatory
+ + br"trailer"
+ + whitespace_optional
+ + br"\<\<(.*\>\>)"
+ + newline
+ + br"startxref"
+ + newline
+ + br"([0-9]+)"
+ + newline
+ + br"%%EOF"
+ + whitespace_optional
+ + br"$",
+ re.DOTALL,
+ )
+ re_trailer_prev = re.compile(
+ whitespace_optional
+ + br"trailer"
+ + whitespace_optional
+ + br"\<\<(.*?\>\>)"
+ + newline
+ + br"startxref"
+ + newline
+ + br"([0-9]+)"
+ + newline
+ + br"%%EOF"
+ + whitespace_optional,
+ re.DOTALL,
+ )
+
+ def read_trailer(self):
+ search_start_offset = len(self.buf) - 16384
+ if search_start_offset < self.start_offset:
+ search_start_offset = self.start_offset
+ m = self.re_trailer_end.search(self.buf, search_start_offset)
+ check_format_condition(m, "trailer end not found")
+ # make sure we found the LAST trailer
+ last_match = m
+ while m:
+ last_match = m
+ m = self.re_trailer_end.search(self.buf, m.start() + 16)
+ if not m:
+ m = last_match
+ trailer_data = m.group(1)
+ self.last_xref_section_offset = int(m.group(2))
+ self.trailer_dict = self.interpret_trailer(trailer_data)
+ self.xref_table = XrefTable()
+ self.read_xref_table(xref_section_offset=self.last_xref_section_offset)
+ if b"Prev" in self.trailer_dict:
+ self.read_prev_trailer(self.trailer_dict[b"Prev"])
+
+ def read_prev_trailer(self, xref_section_offset):
+ trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset)
+ m = self.re_trailer_prev.search(
+ self.buf[trailer_offset : trailer_offset + 16384]
+ )
+ check_format_condition(m, "previous trailer not found")
+ trailer_data = m.group(1)
+ check_format_condition(
+ int(m.group(2)) == xref_section_offset,
+ "xref section offset in previous trailer doesn't match what was expected",
+ )
+ trailer_dict = self.interpret_trailer(trailer_data)
+ if b"Prev" in trailer_dict:
+ self.read_prev_trailer(trailer_dict[b"Prev"])
+
+ re_whitespace_optional = re.compile(whitespace_optional)
+ re_name = re.compile(
+ whitespace_optional
+ + br"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?="
+ + delimiter_or_ws
+ + br")"
+ )
+ re_dict_start = re.compile(whitespace_optional + br"\<\<")
+ re_dict_end = re.compile(whitespace_optional + br"\>\>" + whitespace_optional)
+
+ @classmethod
+ def interpret_trailer(cls, trailer_data):
+ trailer = {}
+ offset = 0
+ while True:
+ m = cls.re_name.match(trailer_data, offset)
+ if not m:
+ m = cls.re_dict_end.match(trailer_data, offset)
+ check_format_condition(
+ m and m.end() == len(trailer_data),
+ "name not found in trailer, remaining data: "
+ + repr(trailer_data[offset:]),
+ )
+ break
+ key = cls.interpret_name(m.group(1))
+ value, offset = cls.get_value(trailer_data, m.end())
+ trailer[key] = value
+ check_format_condition(
+ b"Size" in trailer and isinstance(trailer[b"Size"], int),
+ "/Size not in trailer or not an integer",
+ )
+ check_format_condition(
+ b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference),
+ "/Root not in trailer or not an indirect reference",
+ )
+ return trailer
+
+ re_hashes_in_name = re.compile(br"([^#]*)(#([0-9a-fA-F]{2}))?")
+
+ @classmethod
+ def interpret_name(cls, raw, as_text=False):
+ name = b""
+ for m in cls.re_hashes_in_name.finditer(raw):
+ if m.group(3):
+ name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii"))
+ else:
+ name += m.group(1)
+ if as_text:
+ return name.decode("utf-8")
+ else:
+ return bytes(name)
+
+ re_null = re.compile(whitespace_optional + br"null(?=" + delimiter_or_ws + br")")
+ re_true = re.compile(whitespace_optional + br"true(?=" + delimiter_or_ws + br")")
+ re_false = re.compile(whitespace_optional + br"false(?=" + delimiter_or_ws + br")")
+ re_int = re.compile(
+ whitespace_optional + br"([-+]?[0-9]+)(?=" + delimiter_or_ws + br")"
+ )
+ re_real = re.compile(
+ whitespace_optional
+ + br"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?="
+ + delimiter_or_ws
+ + br")"
+ )
+ re_array_start = re.compile(whitespace_optional + br"\[")
+ re_array_end = re.compile(whitespace_optional + br"]")
+ re_string_hex = re.compile(
+ whitespace_optional + br"\<(" + whitespace_or_hex + br"*)\>"
+ )
+ re_string_lit = re.compile(whitespace_optional + br"\(")
+ re_indirect_reference = re.compile(
+ whitespace_optional
+ + br"([-+]?[0-9]+)"
+ + whitespace_mandatory
+ + br"([-+]?[0-9]+)"
+ + whitespace_mandatory
+ + br"R(?="
+ + delimiter_or_ws
+ + br")"
+ )
+ re_indirect_def_start = re.compile(
+ whitespace_optional
+ + br"([-+]?[0-9]+)"
+ + whitespace_mandatory
+ + br"([-+]?[0-9]+)"
+ + whitespace_mandatory
+ + br"obj(?="
+ + delimiter_or_ws
+ + br")"
+ )
+ re_indirect_def_end = re.compile(
+ whitespace_optional + br"endobj(?=" + delimiter_or_ws + br")"
+ )
+ re_comment = re.compile(
+ br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*"
+ )
+ re_stream_start = re.compile(whitespace_optional + br"stream\r?\n")
+ re_stream_end = re.compile(
+ whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")"
+ )
+
+ @classmethod
+ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1):
+ if max_nesting == 0:
+ return None, None
+ m = cls.re_comment.match(data, offset)
+ if m:
+ offset = m.end()
+ m = cls.re_indirect_def_start.match(data, offset)
+ if m:
+ check_format_condition(
+ int(m.group(1)) > 0,
+ "indirect object definition: object ID must be greater than 0",
+ )
+ check_format_condition(
+ int(m.group(2)) >= 0,
+ "indirect object definition: generation must be non-negative",
+ )
+ check_format_condition(
+ expect_indirect is None
+ or expect_indirect
+ == IndirectReference(int(m.group(1)), int(m.group(2))),
+ "indirect object definition different than expected",
+ )
+ object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting - 1)
+ if offset is None:
+ return object, None
+ m = cls.re_indirect_def_end.match(data, offset)
+ check_format_condition(m, "indirect object definition end not found")
+ return object, m.end()
+ check_format_condition(
+ not expect_indirect, "indirect object definition not found"
+ )
+ m = cls.re_indirect_reference.match(data, offset)
+ if m:
+ check_format_condition(
+ int(m.group(1)) > 0,
+ "indirect object reference: object ID must be greater than 0",
+ )
+ check_format_condition(
+ int(m.group(2)) >= 0,
+ "indirect object reference: generation must be non-negative",
+ )
+ return IndirectReference(int(m.group(1)), int(m.group(2))), m.end()
+ m = cls.re_dict_start.match(data, offset)
+ if m:
+ offset = m.end()
+ result = {}
+ m = cls.re_dict_end.match(data, offset)
+ while not m:
+ key, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1)
+ if offset is None:
+ return result, None
+ value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1)
+ result[key] = value
+ if offset is None:
+ return result, None
+ m = cls.re_dict_end.match(data, offset)
+ offset = m.end()
+ m = cls.re_stream_start.match(data, offset)
+ if m:
+ try:
+ stream_len = int(result[b"Length"])
+ except (TypeError, KeyError, ValueError):
+ raise PdfFormatError(
+ "bad or missing Length in stream dict (%r)"
+ % result.get(b"Length", None)
+ )
+ stream_data = data[m.end() : m.end() + stream_len]
+ m = cls.re_stream_end.match(data, m.end() + stream_len)
+ check_format_condition(m, "stream end not found")
+ offset = m.end()
+ result = PdfStream(PdfDict(result), stream_data)
+ else:
+ result = PdfDict(result)
+ return result, offset
+ m = cls.re_array_start.match(data, offset)
+ if m:
+ offset = m.end()
+ result = []
+ m = cls.re_array_end.match(data, offset)
+ while not m:
+ value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1)
+ result.append(value)
+ if offset is None:
+ return result, None
+ m = cls.re_array_end.match(data, offset)
+ return result, m.end()
+ m = cls.re_null.match(data, offset)
+ if m:
+ return None, m.end()
+ m = cls.re_true.match(data, offset)
+ if m:
+ return True, m.end()
+ m = cls.re_false.match(data, offset)
+ if m:
+ return False, m.end()
+ m = cls.re_name.match(data, offset)
+ if m:
+ return PdfName(cls.interpret_name(m.group(1))), m.end()
+ m = cls.re_int.match(data, offset)
+ if m:
+ return int(m.group(1)), m.end()
+ m = cls.re_real.match(data, offset)
+ if m:
+ # XXX Decimal instead of float???
+ return float(m.group(1)), m.end()
+ m = cls.re_string_hex.match(data, offset)
+ if m:
+ # filter out whitespace
+ hex_string = bytearray(
+ [b for b in m.group(1) if b in b"0123456789abcdefABCDEF"]
+ )
+ if len(hex_string) % 2 == 1:
+ # append a 0 if the length is not even - yes, at the end
+ hex_string.append(ord(b"0"))
+ return bytearray.fromhex(hex_string.decode("us-ascii")), m.end()
+ m = cls.re_string_lit.match(data, offset)
+ if m:
+ return cls.get_literal_string(data, m.end())
+ # return None, offset # fallback (only for debugging)
+ raise PdfFormatError("unrecognized object: " + repr(data[offset : offset + 32]))
+
+ re_lit_str_token = re.compile(
+ br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))"
+ )
+ escaped_chars = {
+ b"n": b"\n",
+ b"r": b"\r",
+ b"t": b"\t",
+ b"b": b"\b",
+ b"f": b"\f",
+ b"(": b"(",
+ b")": b")",
+ b"\\": b"\\",
+ ord(b"n"): b"\n",
+ ord(b"r"): b"\r",
+ ord(b"t"): b"\t",
+ ord(b"b"): b"\b",
+ ord(b"f"): b"\f",
+ ord(b"("): b"(",
+ ord(b")"): b")",
+ ord(b"\\"): b"\\",
+ }
+
+ @classmethod
+ def get_literal_string(cls, data, offset):
+ nesting_depth = 0
+ result = bytearray()
+ for m in cls.re_lit_str_token.finditer(data, offset):
+ result.extend(data[offset : m.start()])
+ if m.group(1):
+ result.extend(cls.escaped_chars[m.group(1)[1]])
+ elif m.group(2):
+ result.append(int(m.group(2)[1:], 8))
+ elif m.group(3):
+ pass
+ elif m.group(5):
+ result.extend(b"\n")
+ elif m.group(6):
+ result.extend(b"(")
+ nesting_depth += 1
+ elif m.group(7):
+ if nesting_depth == 0:
+ return bytes(result), m.end()
+ result.extend(b")")
+ nesting_depth -= 1
+ offset = m.end()
+ raise PdfFormatError("unfinished literal string")
+
+ re_xref_section_start = re.compile(whitespace_optional + br"xref" + newline)
+ re_xref_subsection_start = re.compile(
+ whitespace_optional
+ + br"([0-9]+)"
+ + whitespace_mandatory
+ + br"([0-9]+)"
+ + whitespace_optional
+ + newline_only
+ )
+ re_xref_entry = re.compile(br"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)")
+
+ def read_xref_table(self, xref_section_offset):
+ subsection_found = False
+ m = self.re_xref_section_start.match(
+ self.buf, xref_section_offset + self.start_offset
+ )
+ check_format_condition(m, "xref section start not found")
+ offset = m.end()
+ while True:
+ m = self.re_xref_subsection_start.match(self.buf, offset)
+ if not m:
+ check_format_condition(
+ subsection_found, "xref subsection start not found"
+ )
+ break
+ subsection_found = True
+ offset = m.end()
+ first_object = int(m.group(1))
+ num_objects = int(m.group(2))
+ for i in range(first_object, first_object + num_objects):
+ m = self.re_xref_entry.match(self.buf, offset)
+ check_format_condition(m, "xref entry not found")
+ offset = m.end()
+ is_free = m.group(3) == b"f"
+ generation = int(m.group(2))
+ if not is_free:
+ new_entry = (int(m.group(1)), generation)
+ check_format_condition(
+ i not in self.xref_table or self.xref_table[i] == new_entry,
+ "xref entry duplicated (and not identical)",
+ )
+ self.xref_table[i] = new_entry
+ return offset
+
+ def read_indirect(self, ref, max_nesting=-1):
+ offset, generation = self.xref_table[ref[0]]
+ check_format_condition(
+ generation == ref[1],
+ "expected to find generation %s for object ID %s in xref table, "
+ "instead found generation %s at offset %s"
+ % (ref[1], ref[0], generation, offset),
+ )
+ value = self.get_value(
+ self.buf,
+ offset + self.start_offset,
+ expect_indirect=IndirectReference(*ref),
+ max_nesting=max_nesting,
+ )[0]
+ self.cached_objects[ref] = value
+ return value
+
+ def linearize_page_tree(self, node=None):
+ if node is None:
+ node = self.page_tree_root
+ check_format_condition(
+ node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages"
+ )
+ pages = []
+ for kid in node[b"Kids"]:
+ kid_object = self.read_indirect(kid)
+ if kid_object[b"Type"] == b"Page":
+ pages.append(kid)
+ else:
+ pages.extend(self.linearize_page_tree(node=kid_object))
+ return pages
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PixarImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PixarImagePlugin.py
new file mode 100644
index 0000000..5ea32ba
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PixarImagePlugin.py
@@ -0,0 +1,70 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# PIXAR raster support for PIL
+#
+# history:
+# 97-01-29 fl Created
+#
+# notes:
+# This is incomplete; it is based on a few samples created with
+# Photoshop 2.5 and 3.0, and a summary description provided by
+# Greg Coats . Hopefully, "L" and
+# "RGBA" support will be added in future versions.
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1997.
+#
+# See the README file for information on usage and redistribution.
+#
+
+from . import Image, ImageFile
+from ._binary import i16le as i16
+
+#
+# helpers
+
+
+def _accept(prefix):
+ return prefix[:4] == b"\200\350\000\000"
+
+
+##
+# Image plugin for PIXAR raster images.
+
+
+class PixarImageFile(ImageFile.ImageFile):
+
+ format = "PIXAR"
+ format_description = "PIXAR raster image"
+
+ def _open(self):
+
+ # assuming a 4-byte magic label
+ s = self.fp.read(4)
+ if s != b"\200\350\000\000":
+ raise SyntaxError("not a PIXAR file")
+
+ # read rest of header
+ s = s + self.fp.read(508)
+
+ self._size = i16(s[418:420]), i16(s[416:418])
+
+ # get channel/depth descriptions
+ mode = i16(s[424:426]), i16(s[426:428])
+
+ if mode == (14, 2):
+ self.mode = "RGB"
+ # FIXME: to be continued...
+
+ # create tile descriptor (assuming "dumped")
+ self.tile = [("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1))]
+
+
+#
+# --------------------------------------------------------------------
+
+Image.register_open(PixarImageFile.format, PixarImageFile, _accept)
+
+Image.register_extension(PixarImageFile.format, ".pxr")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PngImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PngImagePlugin.py
new file mode 100644
index 0000000..ee9d52b
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PngImagePlugin.py
@@ -0,0 +1,1340 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# PNG support code
+#
+# See "PNG (Portable Network Graphics) Specification, version 1.0;
+# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.).
+#
+# history:
+# 1996-05-06 fl Created (couldn't resist it)
+# 1996-12-14 fl Upgraded, added read and verify support (0.2)
+# 1996-12-15 fl Separate PNG stream parser
+# 1996-12-29 fl Added write support, added getchunks
+# 1996-12-30 fl Eliminated circular references in decoder (0.3)
+# 1998-07-12 fl Read/write 16-bit images as mode I (0.4)
+# 2001-02-08 fl Added transparency support (from Zircon) (0.5)
+# 2001-04-16 fl Don't close data source in "open" method (0.6)
+# 2004-02-24 fl Don't even pretend to support interlaced files (0.7)
+# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8)
+# 2004-09-20 fl Added PngInfo chunk container
+# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev)
+# 2008-08-13 fl Added tRNS support for RGB images
+# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech)
+# 2009-03-08 fl Added zTXT support (from Lowell Alleman)
+# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua)
+#
+# Copyright (c) 1997-2009 by Secret Labs AB
+# Copyright (c) 1996 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import itertools
+import logging
+import re
+import struct
+import warnings
+import zlib
+
+from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence
+from ._binary import i8, i16be as i16, i32be as i32, o8, o16be as o16, o32be as o32
+
+logger = logging.getLogger(__name__)
+
+is_cid = re.compile(br"\w\w\w\w").match
+
+
+_MAGIC = b"\211PNG\r\n\032\n"
+
+
+_MODES = {
+ # supported bits/color combinations, and corresponding modes/rawmodes
+ # Greyscale
+ (1, 0): ("1", "1"),
+ (2, 0): ("L", "L;2"),
+ (4, 0): ("L", "L;4"),
+ (8, 0): ("L", "L"),
+ (16, 0): ("I", "I;16B"),
+ # Truecolour
+ (8, 2): ("RGB", "RGB"),
+ (16, 2): ("RGB", "RGB;16B"),
+ # Indexed-colour
+ (1, 3): ("P", "P;1"),
+ (2, 3): ("P", "P;2"),
+ (4, 3): ("P", "P;4"),
+ (8, 3): ("P", "P"),
+ # Greyscale with alpha
+ (8, 4): ("LA", "LA"),
+ (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available
+ # Truecolour with alpha
+ (8, 6): ("RGBA", "RGBA"),
+ (16, 6): ("RGBA", "RGBA;16B"),
+}
+
+
+_simple_palette = re.compile(b"^\xff*\x00\xff*$")
+
+# Maximum decompressed size for a iTXt or zTXt chunk.
+# Eliminates decompression bombs where compressed chunks can expand 1000x
+MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK
+# Set the maximum total text chunk size.
+MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK
+
+
+# APNG frame disposal modes
+APNG_DISPOSE_OP_NONE = 0
+APNG_DISPOSE_OP_BACKGROUND = 1
+APNG_DISPOSE_OP_PREVIOUS = 2
+
+# APNG frame blend modes
+APNG_BLEND_OP_SOURCE = 0
+APNG_BLEND_OP_OVER = 1
+
+
+def _safe_zlib_decompress(s):
+ dobj = zlib.decompressobj()
+ plaintext = dobj.decompress(s, MAX_TEXT_CHUNK)
+ if dobj.unconsumed_tail:
+ raise ValueError("Decompressed Data Too Large")
+ return plaintext
+
+
+def _crc32(data, seed=0):
+ return zlib.crc32(data, seed) & 0xFFFFFFFF
+
+
+# --------------------------------------------------------------------
+# Support classes. Suitable for PNG and related formats like MNG etc.
+
+
+class ChunkStream:
+ def __init__(self, fp):
+
+ self.fp = fp
+ self.queue = []
+
+ def read(self):
+ """Fetch a new chunk. Returns header information."""
+ cid = None
+
+ if self.queue:
+ cid, pos, length = self.queue.pop()
+ self.fp.seek(pos)
+ else:
+ s = self.fp.read(8)
+ cid = s[4:]
+ pos = self.fp.tell()
+ length = i32(s)
+
+ if not is_cid(cid):
+ if not ImageFile.LOAD_TRUNCATED_IMAGES:
+ raise SyntaxError("broken PNG file (chunk %s)" % repr(cid))
+
+ return cid, pos, length
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
+ def close(self):
+ self.queue = self.crc = self.fp = None
+
+ def push(self, cid, pos, length):
+
+ self.queue.append((cid, pos, length))
+
+ def call(self, cid, pos, length):
+ """Call the appropriate chunk handler"""
+
+ logger.debug("STREAM %r %s %s", cid, pos, length)
+ return getattr(self, "chunk_" + cid.decode("ascii"))(pos, length)
+
+ def crc(self, cid, data):
+ """Read and verify checksum"""
+
+ # Skip CRC checks for ancillary chunks if allowed to load truncated
+ # images
+ # 5th byte of first char is 1 [specs, section 5.4]
+ if ImageFile.LOAD_TRUNCATED_IMAGES and (i8(cid[0]) >> 5 & 1):
+ self.crc_skip(cid, data)
+ return
+
+ try:
+ crc1 = _crc32(data, _crc32(cid))
+ crc2 = i32(self.fp.read(4))
+ if crc1 != crc2:
+ raise SyntaxError("broken PNG file (bad header checksum in %r)" % cid)
+ except struct.error:
+ raise SyntaxError("broken PNG file (incomplete checksum in %r)" % cid)
+
+ def crc_skip(self, cid, data):
+ """Read checksum. Used if the C module is not present"""
+
+ self.fp.read(4)
+
+ def verify(self, endchunk=b"IEND"):
+
+ # Simple approach; just calculate checksum for all remaining
+ # blocks. Must be called directly after open.
+
+ cids = []
+
+ while True:
+ try:
+ cid, pos, length = self.read()
+ except struct.error:
+ raise OSError("truncated PNG file")
+
+ if cid == endchunk:
+ break
+ self.crc(cid, ImageFile._safe_read(self.fp, length))
+ cids.append(cid)
+
+ return cids
+
+
+class iTXt(str):
+ """
+ Subclass of string to allow iTXt chunks to look like strings while
+ keeping their extra information
+
+ """
+
+ @staticmethod
+ def __new__(cls, text, lang=None, tkey=None):
+ """
+ :param cls: the class to use when creating the instance
+ :param text: value for this key
+ :param lang: language code
+ :param tkey: UTF-8 version of the key name
+ """
+
+ self = str.__new__(cls, text)
+ self.lang = lang
+ self.tkey = tkey
+ return self
+
+
+class PngInfo:
+ """
+ PNG chunk container (for use with save(pnginfo=))
+
+ """
+
+ def __init__(self):
+ self.chunks = []
+
+ def add(self, cid, data):
+ """Appends an arbitrary chunk. Use with caution.
+
+ :param cid: a byte string, 4 bytes long.
+ :param data: a byte string of the encoded data
+
+ """
+
+ self.chunks.append((cid, data))
+
+ def add_itxt(self, key, value, lang="", tkey="", zip=False):
+ """Appends an iTXt chunk.
+
+ :param key: latin-1 encodable text key name
+ :param value: value for this key
+ :param lang: language code
+ :param tkey: UTF-8 version of the key name
+ :param zip: compression flag
+
+ """
+
+ if not isinstance(key, bytes):
+ key = key.encode("latin-1", "strict")
+ if not isinstance(value, bytes):
+ value = value.encode("utf-8", "strict")
+ if not isinstance(lang, bytes):
+ lang = lang.encode("utf-8", "strict")
+ if not isinstance(tkey, bytes):
+ tkey = tkey.encode("utf-8", "strict")
+
+ if zip:
+ self.add(
+ b"iTXt",
+ key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value),
+ )
+ else:
+ self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value)
+
+ def add_text(self, key, value, zip=False):
+ """Appends a text chunk.
+
+ :param key: latin-1 encodable text key name
+ :param value: value for this key, text or an
+ :py:class:`PIL.PngImagePlugin.iTXt` instance
+ :param zip: compression flag
+
+ """
+ if isinstance(value, iTXt):
+ return self.add_itxt(key, value, value.lang, value.tkey, zip=zip)
+
+ # The tEXt chunk stores latin-1 text
+ if not isinstance(value, bytes):
+ try:
+ value = value.encode("latin-1", "strict")
+ except UnicodeError:
+ return self.add_itxt(key, value, zip=zip)
+
+ if not isinstance(key, bytes):
+ key = key.encode("latin-1", "strict")
+
+ if zip:
+ self.add(b"zTXt", key + b"\0\0" + zlib.compress(value))
+ else:
+ self.add(b"tEXt", key + b"\0" + value)
+
+
+# --------------------------------------------------------------------
+# PNG image stream (IHDR/IEND)
+
+
+class PngStream(ChunkStream):
+ def __init__(self, fp):
+ super().__init__(fp)
+
+ # local copies of Image attributes
+ self.im_info = {}
+ self.im_text = {}
+ self.im_size = (0, 0)
+ self.im_mode = None
+ self.im_tile = None
+ self.im_palette = None
+ self.im_custom_mimetype = None
+ self.im_n_frames = None
+ self._seq_num = None
+ self.rewind_state = None
+
+ self.text_memory = 0
+
+ def check_text_memory(self, chunklen):
+ self.text_memory += chunklen
+ if self.text_memory > MAX_TEXT_MEMORY:
+ raise ValueError(
+ "Too much memory used in text chunks: %s>MAX_TEXT_MEMORY"
+ % self.text_memory
+ )
+
+ def save_rewind(self):
+ self.rewind_state = {
+ "info": self.im_info.copy(),
+ "tile": self.im_tile,
+ "seq_num": self._seq_num,
+ }
+
+ def rewind(self):
+ self.im_info = self.rewind_state["info"]
+ self.im_tile = self.rewind_state["tile"]
+ self._seq_num = self.rewind_state["seq_num"]
+
+ def chunk_iCCP(self, pos, length):
+
+ # ICC profile
+ s = ImageFile._safe_read(self.fp, length)
+ # according to PNG spec, the iCCP chunk contains:
+ # Profile name 1-79 bytes (character string)
+ # Null separator 1 byte (null character)
+ # Compression method 1 byte (0)
+ # Compressed profile n bytes (zlib with deflate compression)
+ i = s.find(b"\0")
+ logger.debug("iCCP profile name %r", s[:i])
+ logger.debug("Compression method %s", i8(s[i]))
+ comp_method = i8(s[i])
+ if comp_method != 0:
+ raise SyntaxError(
+ "Unknown compression method %s in iCCP chunk" % comp_method
+ )
+ try:
+ icc_profile = _safe_zlib_decompress(s[i + 2 :])
+ except ValueError:
+ if ImageFile.LOAD_TRUNCATED_IMAGES:
+ icc_profile = None
+ else:
+ raise
+ except zlib.error:
+ icc_profile = None # FIXME
+ self.im_info["icc_profile"] = icc_profile
+ return s
+
+ def chunk_IHDR(self, pos, length):
+
+ # image header
+ s = ImageFile._safe_read(self.fp, length)
+ self.im_size = i32(s), i32(s[4:])
+ try:
+ self.im_mode, self.im_rawmode = _MODES[(i8(s[8]), i8(s[9]))]
+ except Exception:
+ pass
+ if i8(s[12]):
+ self.im_info["interlace"] = 1
+ if i8(s[11]):
+ raise SyntaxError("unknown filter category")
+ return s
+
+ def chunk_IDAT(self, pos, length):
+
+ # image data
+ if "bbox" in self.im_info:
+ tile = [("zip", self.im_info["bbox"], pos, self.im_rawmode)]
+ else:
+ if self.im_n_frames is not None:
+ self.im_info["default_image"] = True
+ tile = [("zip", (0, 0) + self.im_size, pos, self.im_rawmode)]
+ self.im_tile = tile
+ self.im_idat = length
+ raise EOFError
+
+ def chunk_IEND(self, pos, length):
+
+ # end of PNG image
+ raise EOFError
+
+ def chunk_PLTE(self, pos, length):
+
+ # palette
+ s = ImageFile._safe_read(self.fp, length)
+ if self.im_mode == "P":
+ self.im_palette = "RGB", s
+ return s
+
+ def chunk_tRNS(self, pos, length):
+
+ # transparency
+ s = ImageFile._safe_read(self.fp, length)
+ if self.im_mode == "P":
+ if _simple_palette.match(s):
+ # tRNS contains only one full-transparent entry,
+ # other entries are full opaque
+ i = s.find(b"\0")
+ if i >= 0:
+ self.im_info["transparency"] = i
+ else:
+ # otherwise, we have a byte string with one alpha value
+ # for each palette entry
+ self.im_info["transparency"] = s
+ elif self.im_mode in ("1", "L", "I"):
+ self.im_info["transparency"] = i16(s)
+ elif self.im_mode == "RGB":
+ self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:])
+ return s
+
+ def chunk_gAMA(self, pos, length):
+ # gamma setting
+ s = ImageFile._safe_read(self.fp, length)
+ self.im_info["gamma"] = i32(s) / 100000.0
+ return s
+
+ def chunk_cHRM(self, pos, length):
+ # chromaticity, 8 unsigned ints, actual value is scaled by 100,000
+ # WP x,y, Red x,y, Green x,y Blue x,y
+
+ s = ImageFile._safe_read(self.fp, length)
+ raw_vals = struct.unpack(">%dI" % (len(s) // 4), s)
+ self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals)
+ return s
+
+ def chunk_sRGB(self, pos, length):
+ # srgb rendering intent, 1 byte
+ # 0 perceptual
+ # 1 relative colorimetric
+ # 2 saturation
+ # 3 absolute colorimetric
+
+ s = ImageFile._safe_read(self.fp, length)
+ self.im_info["srgb"] = i8(s)
+ return s
+
+ def chunk_pHYs(self, pos, length):
+
+ # pixels per unit
+ s = ImageFile._safe_read(self.fp, length)
+ px, py = i32(s), i32(s[4:])
+ unit = i8(s[8])
+ if unit == 1: # meter
+ dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5)
+ self.im_info["dpi"] = dpi
+ elif unit == 0:
+ self.im_info["aspect"] = px, py
+ return s
+
+ def chunk_tEXt(self, pos, length):
+
+ # text
+ s = ImageFile._safe_read(self.fp, length)
+ try:
+ k, v = s.split(b"\0", 1)
+ except ValueError:
+ # fallback for broken tEXt tags
+ k = s
+ v = b""
+ if k:
+ k = k.decode("latin-1", "strict")
+ v = v.decode("latin-1", "replace")
+
+ self.im_info[k] = self.im_text[k] = v
+ self.check_text_memory(len(v))
+
+ return s
+
+ def chunk_zTXt(self, pos, length):
+
+ # compressed text
+ s = ImageFile._safe_read(self.fp, length)
+ try:
+ k, v = s.split(b"\0", 1)
+ except ValueError:
+ k = s
+ v = b""
+ if v:
+ comp_method = i8(v[0])
+ else:
+ comp_method = 0
+ if comp_method != 0:
+ raise SyntaxError(
+ "Unknown compression method %s in zTXt chunk" % comp_method
+ )
+ try:
+ v = _safe_zlib_decompress(v[1:])
+ except ValueError:
+ if ImageFile.LOAD_TRUNCATED_IMAGES:
+ v = b""
+ else:
+ raise
+ except zlib.error:
+ v = b""
+
+ if k:
+ k = k.decode("latin-1", "strict")
+ v = v.decode("latin-1", "replace")
+
+ self.im_info[k] = self.im_text[k] = v
+ self.check_text_memory(len(v))
+
+ return s
+
+ def chunk_iTXt(self, pos, length):
+
+ # international text
+ r = s = ImageFile._safe_read(self.fp, length)
+ try:
+ k, r = r.split(b"\0", 1)
+ except ValueError:
+ return s
+ if len(r) < 2:
+ return s
+ cf, cm, r = i8(r[0]), i8(r[1]), r[2:]
+ try:
+ lang, tk, v = r.split(b"\0", 2)
+ except ValueError:
+ return s
+ if cf != 0:
+ if cm == 0:
+ try:
+ v = _safe_zlib_decompress(v)
+ except ValueError:
+ if ImageFile.LOAD_TRUNCATED_IMAGES:
+ return s
+ else:
+ raise
+ except zlib.error:
+ return s
+ else:
+ return s
+ try:
+ k = k.decode("latin-1", "strict")
+ lang = lang.decode("utf-8", "strict")
+ tk = tk.decode("utf-8", "strict")
+ v = v.decode("utf-8", "strict")
+ except UnicodeError:
+ return s
+
+ self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk)
+ self.check_text_memory(len(v))
+
+ return s
+
+ def chunk_eXIf(self, pos, length):
+ s = ImageFile._safe_read(self.fp, length)
+ self.im_info["exif"] = b"Exif\x00\x00" + s
+ return s
+
+ # APNG chunks
+ def chunk_acTL(self, pos, length):
+ s = ImageFile._safe_read(self.fp, length)
+ if self.im_n_frames is not None:
+ self.im_n_frames = None
+ warnings.warn("Invalid APNG, will use default PNG image if possible")
+ return s
+ n_frames = i32(s)
+ if n_frames == 0 or n_frames > 0x80000000:
+ warnings.warn("Invalid APNG, will use default PNG image if possible")
+ return s
+ self.im_n_frames = n_frames
+ self.im_info["loop"] = i32(s[4:])
+ self.im_custom_mimetype = "image/apng"
+ return s
+
+ def chunk_fcTL(self, pos, length):
+ s = ImageFile._safe_read(self.fp, length)
+ seq = i32(s)
+ if (self._seq_num is None and seq != 0) or (
+ self._seq_num is not None and self._seq_num != seq - 1
+ ):
+ raise SyntaxError("APNG contains frame sequence errors")
+ self._seq_num = seq
+ width, height = i32(s[4:]), i32(s[8:])
+ px, py = i32(s[12:]), i32(s[16:])
+ im_w, im_h = self.im_size
+ if px + width > im_w or py + height > im_h:
+ raise SyntaxError("APNG contains invalid frames")
+ self.im_info["bbox"] = (px, py, px + width, py + height)
+ delay_num, delay_den = i16(s[20:]), i16(s[22:])
+ if delay_den == 0:
+ delay_den = 100
+ self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000
+ self.im_info["disposal"] = i8(s[24])
+ self.im_info["blend"] = i8(s[25])
+ return s
+
+ def chunk_fdAT(self, pos, length):
+ s = ImageFile._safe_read(self.fp, 4)
+ seq = i32(s)
+ if self._seq_num != seq - 1:
+ raise SyntaxError("APNG contains frame sequence errors")
+ self._seq_num = seq
+ return self.chunk_IDAT(pos + 4, length - 4)
+
+
+# --------------------------------------------------------------------
+# PNG reader
+
+
+def _accept(prefix):
+ return prefix[:8] == _MAGIC
+
+
+##
+# Image plugin for PNG images.
+
+
+class PngImageFile(ImageFile.ImageFile):
+
+ format = "PNG"
+ format_description = "Portable network graphics"
+
+ def _open(self):
+
+ if self.fp.read(8) != _MAGIC:
+ raise SyntaxError("not a PNG file")
+ self.__fp = self.fp
+ self.__frame = 0
+
+ #
+ # Parse headers up to the first IDAT or fDAT chunk
+
+ self.png = PngStream(self.fp)
+
+ while True:
+
+ #
+ # get next chunk
+
+ cid, pos, length = self.png.read()
+
+ try:
+ s = self.png.call(cid, pos, length)
+ except EOFError:
+ break
+ except AttributeError:
+ logger.debug("%r %s %s (unknown)", cid, pos, length)
+ s = ImageFile._safe_read(self.fp, length)
+
+ self.png.crc(cid, s)
+
+ #
+ # Copy relevant attributes from the PngStream. An alternative
+ # would be to let the PngStream class modify these attributes
+ # directly, but that introduces circular references which are
+ # difficult to break if things go wrong in the decoder...
+ # (believe me, I've tried ;-)
+
+ self.mode = self.png.im_mode
+ self._size = self.png.im_size
+ self.info = self.png.im_info
+ self._text = None
+ self.tile = self.png.im_tile
+ self.custom_mimetype = self.png.im_custom_mimetype
+ self.n_frames = self.png.im_n_frames or 1
+ self.default_image = self.info.get("default_image", False)
+
+ if self.png.im_palette:
+ rawmode, data = self.png.im_palette
+ self.palette = ImagePalette.raw(rawmode, data)
+
+ if cid == b"fdAT":
+ self.__prepare_idat = length - 4
+ else:
+ self.__prepare_idat = length # used by load_prepare()
+
+ if self.png.im_n_frames is not None:
+ self._close_exclusive_fp_after_loading = False
+ self.png.save_rewind()
+ self.__rewind_idat = self.__prepare_idat
+ self.__rewind = self.__fp.tell()
+ if self.default_image:
+ # IDAT chunk contains default image and not first animation frame
+ self.n_frames += 1
+ self._seek(0)
+ self.is_animated = self.n_frames > 1
+
+ @property
+ def text(self):
+ # experimental
+ if self._text is None:
+ # iTxt, tEXt and zTXt chunks may appear at the end of the file
+ # So load the file to ensure that they are read
+ if self.is_animated:
+ frame = self.__frame
+ # for APNG, seek to the final frame before loading
+ self.seek(self.n_frames - 1)
+ self.load()
+ if self.is_animated:
+ self.seek(frame)
+ return self._text
+
+ def verify(self):
+ """Verify PNG file"""
+
+ if self.fp is None:
+ raise RuntimeError("verify must be called directly after open")
+
+ # back up to beginning of IDAT block
+ self.fp.seek(self.tile[0][2] - 8)
+
+ self.png.verify()
+ self.png.close()
+
+ if self._exclusive_fp:
+ self.fp.close()
+ self.fp = None
+
+ def seek(self, frame):
+ if not self._seek_check(frame):
+ return
+ if frame < self.__frame:
+ self._seek(0, True)
+
+ last_frame = self.__frame
+ for f in range(self.__frame + 1, frame + 1):
+ try:
+ self._seek(f)
+ except EOFError:
+ self.seek(last_frame)
+ raise EOFError("no more images in APNG file")
+
+ def _seek(self, frame, rewind=False):
+ if frame == 0:
+ if rewind:
+ self.__fp.seek(self.__rewind)
+ self.png.rewind()
+ self.__prepare_idat = self.__rewind_idat
+ self.im = None
+ if self.pyaccess:
+ self.pyaccess = None
+ self.info = self.png.im_info
+ self.tile = self.png.im_tile
+ self.fp = self.__fp
+ self._prev_im = None
+ self.dispose = None
+ self.default_image = self.info.get("default_image", False)
+ self.dispose_op = self.info.get("disposal")
+ self.blend_op = self.info.get("blend")
+ self.dispose_extent = self.info.get("bbox")
+ self.__frame = 0
+ return
+ else:
+ if frame != self.__frame + 1:
+ raise ValueError("cannot seek to frame %d" % frame)
+
+ # ensure previous frame was loaded
+ self.load()
+
+ self.fp = self.__fp
+
+ # advance to the next frame
+ if self.__prepare_idat:
+ ImageFile._safe_read(self.fp, self.__prepare_idat)
+ self.__prepare_idat = 0
+ frame_start = False
+ while True:
+ self.fp.read(4) # CRC
+
+ try:
+ cid, pos, length = self.png.read()
+ except (struct.error, SyntaxError):
+ break
+
+ if cid == b"IEND":
+ raise EOFError("No more images in APNG file")
+ if cid == b"fcTL":
+ if frame_start:
+ # there must be at least one fdAT chunk between fcTL chunks
+ raise SyntaxError("APNG missing frame data")
+ frame_start = True
+
+ try:
+ self.png.call(cid, pos, length)
+ except UnicodeDecodeError:
+ break
+ except EOFError:
+ if cid == b"fdAT":
+ length -= 4
+ if frame_start:
+ self.__prepare_idat = length
+ break
+ ImageFile._safe_read(self.fp, length)
+ except AttributeError:
+ logger.debug("%r %s %s (unknown)", cid, pos, length)
+ ImageFile._safe_read(self.fp, length)
+
+ self.__frame = frame
+ self.tile = self.png.im_tile
+ self.dispose_op = self.info.get("disposal")
+ self.blend_op = self.info.get("blend")
+ self.dispose_extent = self.info.get("bbox")
+
+ if not self.tile:
+ raise EOFError
+
+ def tell(self):
+ return self.__frame
+
+ def load_prepare(self):
+ """internal: prepare to read PNG file"""
+
+ if self.info.get("interlace"):
+ self.decoderconfig = self.decoderconfig + (1,)
+
+ self.__idat = self.__prepare_idat # used by load_read()
+ ImageFile.ImageFile.load_prepare(self)
+
+ def load_read(self, read_bytes):
+ """internal: read more image data"""
+
+ while self.__idat == 0:
+ # end of chunk, skip forward to next one
+
+ self.fp.read(4) # CRC
+
+ cid, pos, length = self.png.read()
+
+ if cid not in [b"IDAT", b"DDAT", b"fdAT"]:
+ self.png.push(cid, pos, length)
+ return b""
+
+ if cid == b"fdAT":
+ try:
+ self.png.call(cid, pos, length)
+ except EOFError:
+ pass
+ self.__idat = length - 4 # sequence_num has already been read
+ else:
+ self.__idat = length # empty chunks are allowed
+
+ # read more data from this chunk
+ if read_bytes <= 0:
+ read_bytes = self.__idat
+ else:
+ read_bytes = min(read_bytes, self.__idat)
+
+ self.__idat = self.__idat - read_bytes
+
+ return self.fp.read(read_bytes)
+
+ def load_end(self):
+ """internal: finished reading image data"""
+ while True:
+ self.fp.read(4) # CRC
+
+ try:
+ cid, pos, length = self.png.read()
+ except (struct.error, SyntaxError):
+ break
+
+ if cid == b"IEND":
+ break
+ elif cid == b"fcTL" and self.is_animated:
+ # start of the next frame, stop reading
+ self.__prepare_idat = 0
+ self.png.push(cid, pos, length)
+ break
+
+ try:
+ self.png.call(cid, pos, length)
+ except UnicodeDecodeError:
+ break
+ except EOFError:
+ if cid == b"fdAT":
+ length -= 4
+ ImageFile._safe_read(self.fp, length)
+ except AttributeError:
+ logger.debug("%r %s %s (unknown)", cid, pos, length)
+ ImageFile._safe_read(self.fp, length)
+ self._text = self.png.im_text
+ if not self.is_animated:
+ self.png.close()
+ self.png = None
+ else:
+ # setup frame disposal (actual disposal done when needed in _seek())
+ if self._prev_im is None and self.dispose_op == APNG_DISPOSE_OP_PREVIOUS:
+ self.dispose_op = APNG_DISPOSE_OP_BACKGROUND
+
+ if self.dispose_op == APNG_DISPOSE_OP_PREVIOUS:
+ dispose = self._prev_im.copy()
+ dispose = self._crop(dispose, self.dispose_extent)
+ elif self.dispose_op == APNG_DISPOSE_OP_BACKGROUND:
+ dispose = Image.core.fill("RGBA", self.size, (0, 0, 0, 0))
+ dispose = self._crop(dispose, self.dispose_extent)
+ else:
+ dispose = None
+
+ if self._prev_im and self.blend_op == APNG_BLEND_OP_OVER:
+ updated = self._crop(self.im, self.dispose_extent)
+ self._prev_im.paste(
+ updated, self.dispose_extent, updated.convert("RGBA")
+ )
+ self.im = self._prev_im
+ if self.pyaccess:
+ self.pyaccess = None
+ self._prev_im = self.im.copy()
+
+ if dispose:
+ self._prev_im.paste(dispose, self.dispose_extent)
+
+ def _getexif(self):
+ if "exif" not in self.info:
+ self.load()
+ if "exif" not in self.info and "Raw profile type exif" not in self.info:
+ return None
+ return dict(self.getexif())
+
+ def getexif(self):
+ if "exif" not in self.info:
+ self.load()
+
+ if self._exif is None:
+ self._exif = Image.Exif()
+
+ exif_info = self.info.get("exif")
+ if exif_info is None and "Raw profile type exif" in self.info:
+ exif_info = bytes.fromhex(
+ "".join(self.info["Raw profile type exif"].split("\n")[3:])
+ )
+ self._exif.load(exif_info)
+ return self._exif
+
+ def _close__fp(self):
+ try:
+ if self.__fp != self.fp:
+ self.__fp.close()
+ except AttributeError:
+ pass
+ finally:
+ self.__fp = None
+
+
+# --------------------------------------------------------------------
+# PNG writer
+
+_OUTMODES = {
+ # supported PIL modes, and corresponding rawmodes/bits/color combinations
+ "1": ("1", b"\x01\x00"),
+ "L;1": ("L;1", b"\x01\x00"),
+ "L;2": ("L;2", b"\x02\x00"),
+ "L;4": ("L;4", b"\x04\x00"),
+ "L": ("L", b"\x08\x00"),
+ "LA": ("LA", b"\x08\x04"),
+ "I": ("I;16B", b"\x10\x00"),
+ "I;16": ("I;16B", b"\x10\x00"),
+ "P;1": ("P;1", b"\x01\x03"),
+ "P;2": ("P;2", b"\x02\x03"),
+ "P;4": ("P;4", b"\x04\x03"),
+ "P": ("P", b"\x08\x03"),
+ "RGB": ("RGB", b"\x08\x02"),
+ "RGBA": ("RGBA", b"\x08\x06"),
+}
+
+
+def putchunk(fp, cid, *data):
+ """Write a PNG chunk (including CRC field)"""
+
+ data = b"".join(data)
+
+ fp.write(o32(len(data)) + cid)
+ fp.write(data)
+ crc = _crc32(data, _crc32(cid))
+ fp.write(o32(crc))
+
+
+class _idat:
+ # wrap output from the encoder in IDAT chunks
+
+ def __init__(self, fp, chunk):
+ self.fp = fp
+ self.chunk = chunk
+
+ def write(self, data):
+ self.chunk(self.fp, b"IDAT", data)
+
+
+class _fdat:
+ # wrap encoder output in fdAT chunks
+
+ def __init__(self, fp, chunk, seq_num):
+ self.fp = fp
+ self.chunk = chunk
+ self.seq_num = seq_num
+
+ def write(self, data):
+ self.chunk(self.fp, b"fdAT", o32(self.seq_num), data)
+ self.seq_num += 1
+
+
+def _write_multiple_frames(im, fp, chunk, rawmode):
+ default_image = im.encoderinfo.get("default_image", im.info.get("default_image"))
+ duration = im.encoderinfo.get("duration", im.info.get("duration", 0))
+ loop = im.encoderinfo.get("loop", im.info.get("loop", 0))
+ disposal = im.encoderinfo.get("disposal", im.info.get("disposal"))
+ blend = im.encoderinfo.get("blend", im.info.get("blend"))
+
+ if default_image:
+ chain = itertools.chain(im.encoderinfo.get("append_images", []))
+ else:
+ chain = itertools.chain([im], im.encoderinfo.get("append_images", []))
+
+ im_frames = []
+ frame_count = 0
+ for im_seq in chain:
+ for im_frame in ImageSequence.Iterator(im_seq):
+ im_frame = im_frame.copy()
+ if im_frame.mode != im.mode:
+ if im.mode == "P":
+ im_frame = im_frame.convert(im.mode, palette=im.palette)
+ else:
+ im_frame = im_frame.convert(im.mode)
+ encoderinfo = im.encoderinfo.copy()
+ if isinstance(duration, (list, tuple)):
+ encoderinfo["duration"] = duration[frame_count]
+ if isinstance(disposal, (list, tuple)):
+ encoderinfo["disposal"] = disposal[frame_count]
+ if isinstance(blend, (list, tuple)):
+ encoderinfo["blend"] = blend[frame_count]
+ frame_count += 1
+
+ if im_frames:
+ previous = im_frames[-1]
+ prev_disposal = previous["encoderinfo"].get("disposal")
+ prev_blend = previous["encoderinfo"].get("blend")
+ if prev_disposal == APNG_DISPOSE_OP_PREVIOUS and len(im_frames) < 2:
+ prev_disposal == APNG_DISPOSE_OP_BACKGROUND
+
+ if prev_disposal == APNG_DISPOSE_OP_BACKGROUND:
+ base_im = previous["im"]
+ dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0))
+ bbox = previous["bbox"]
+ if bbox:
+ dispose = dispose.crop(bbox)
+ else:
+ bbox = (0, 0) + im.size
+ base_im.paste(dispose, bbox)
+ elif prev_disposal == APNG_DISPOSE_OP_PREVIOUS:
+ base_im = im_frames[-2]["im"]
+ else:
+ base_im = previous["im"]
+ delta = ImageChops.subtract_modulo(
+ im_frame.convert("RGB"), base_im.convert("RGB")
+ )
+ bbox = delta.getbbox()
+ if (
+ not bbox
+ and prev_disposal == encoderinfo.get("disposal")
+ and prev_blend == encoderinfo.get("blend")
+ ):
+ duration = encoderinfo.get("duration", 0)
+ if duration:
+ if "duration" in previous["encoderinfo"]:
+ previous["encoderinfo"]["duration"] += duration
+ else:
+ previous["encoderinfo"]["duration"] = duration
+ continue
+ else:
+ bbox = None
+ im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo})
+
+ # animation control
+ chunk(
+ fp, b"acTL", o32(len(im_frames)), o32(loop), # 0: num_frames # 4: num_plays
+ )
+
+ # default image IDAT (if it exists)
+ if default_image:
+ ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)])
+
+ seq_num = 0
+ for frame, frame_data in enumerate(im_frames):
+ im_frame = frame_data["im"]
+ if not frame_data["bbox"]:
+ bbox = (0, 0) + im_frame.size
+ else:
+ bbox = frame_data["bbox"]
+ im_frame = im_frame.crop(bbox)
+ size = im_frame.size
+ duration = int(round(frame_data["encoderinfo"].get("duration", 0)))
+ disposal = frame_data["encoderinfo"].get("disposal", APNG_DISPOSE_OP_NONE)
+ blend = frame_data["encoderinfo"].get("blend", APNG_BLEND_OP_SOURCE)
+ # frame control
+ chunk(
+ fp,
+ b"fcTL",
+ o32(seq_num), # sequence_number
+ o32(size[0]), # width
+ o32(size[1]), # height
+ o32(bbox[0]), # x_offset
+ o32(bbox[1]), # y_offset
+ o16(duration), # delay_numerator
+ o16(1000), # delay_denominator
+ o8(disposal), # dispose_op
+ o8(blend), # blend_op
+ )
+ seq_num += 1
+ # frame data
+ if frame == 0 and not default_image:
+ # first frame must be in IDAT chunks for backwards compatibility
+ ImageFile._save(
+ im_frame,
+ _idat(fp, chunk),
+ [("zip", (0, 0) + im_frame.size, 0, rawmode)],
+ )
+ else:
+ fdat_chunks = _fdat(fp, chunk, seq_num)
+ ImageFile._save(
+ im_frame, fdat_chunks, [("zip", (0, 0) + im_frame.size, 0, rawmode)],
+ )
+ seq_num = fdat_chunks.seq_num
+
+
+def _save_all(im, fp, filename):
+ _save(im, fp, filename, save_all=True)
+
+
+def _save(im, fp, filename, chunk=putchunk, save_all=False):
+ # save an image to disk (called by the save method)
+
+ mode = im.mode
+
+ if mode == "P":
+
+ #
+ # attempt to minimize storage requirements for palette images
+ if "bits" in im.encoderinfo:
+ # number of bits specified by user
+ colors = 1 << im.encoderinfo["bits"]
+ else:
+ # check palette contents
+ if im.palette:
+ colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 2)
+ else:
+ colors = 256
+
+ if colors <= 2:
+ bits = 1
+ elif colors <= 4:
+ bits = 2
+ elif colors <= 16:
+ bits = 4
+ else:
+ bits = 8
+ if bits != 8:
+ mode = "%s;%d" % (mode, bits)
+
+ # encoder options
+ im.encoderconfig = (
+ im.encoderinfo.get("optimize", False),
+ im.encoderinfo.get("compress_level", -1),
+ im.encoderinfo.get("compress_type", -1),
+ im.encoderinfo.get("dictionary", b""),
+ )
+
+ # get the corresponding PNG mode
+ try:
+ rawmode, mode = _OUTMODES[mode]
+ except KeyError:
+ raise OSError("cannot write mode %s as PNG" % mode)
+
+ #
+ # write minimal PNG file
+
+ fp.write(_MAGIC)
+
+ chunk(
+ fp,
+ b"IHDR",
+ o32(im.size[0]), # 0: size
+ o32(im.size[1]),
+ mode, # 8: depth/type
+ b"\0", # 10: compression
+ b"\0", # 11: filter category
+ b"\0", # 12: interlace flag
+ )
+
+ chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"]
+
+ icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile"))
+ if icc:
+ # ICC profile
+ # according to PNG spec, the iCCP chunk contains:
+ # Profile name 1-79 bytes (character string)
+ # Null separator 1 byte (null character)
+ # Compression method 1 byte (0)
+ # Compressed profile n bytes (zlib with deflate compression)
+ name = b"ICC Profile"
+ data = name + b"\0\0" + zlib.compress(icc)
+ chunk(fp, b"iCCP", data)
+
+ # You must either have sRGB or iCCP.
+ # Disallow sRGB chunks when an iCCP-chunk has been emitted.
+ chunks.remove(b"sRGB")
+
+ info = im.encoderinfo.get("pnginfo")
+ if info:
+ chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"]
+ for cid, data in info.chunks:
+ if cid in chunks:
+ chunks.remove(cid)
+ chunk(fp, cid, data)
+ elif cid in chunks_multiple_allowed:
+ chunk(fp, cid, data)
+
+ if im.mode == "P":
+ palette_byte_number = (2 ** bits) * 3
+ palette_bytes = im.im.getpalette("RGB")[:palette_byte_number]
+ while len(palette_bytes) < palette_byte_number:
+ palette_bytes += b"\0"
+ chunk(fp, b"PLTE", palette_bytes)
+
+ transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None))
+
+ if transparency or transparency == 0:
+ if im.mode == "P":
+ # limit to actual palette size
+ alpha_bytes = 2 ** bits
+ if isinstance(transparency, bytes):
+ chunk(fp, b"tRNS", transparency[:alpha_bytes])
+ else:
+ transparency = max(0, min(255, transparency))
+ alpha = b"\xFF" * transparency + b"\0"
+ chunk(fp, b"tRNS", alpha[:alpha_bytes])
+ elif im.mode in ("1", "L", "I"):
+ transparency = max(0, min(65535, transparency))
+ chunk(fp, b"tRNS", o16(transparency))
+ elif im.mode == "RGB":
+ red, green, blue = transparency
+ chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue))
+ else:
+ if "transparency" in im.encoderinfo:
+ # don't bother with transparency if it's an RGBA
+ # and it's in the info dict. It's probably just stale.
+ raise OSError("cannot use transparency for this mode")
+ else:
+ if im.mode == "P" and im.im.getpalettemode() == "RGBA":
+ alpha = im.im.getpalette("RGBA", "A")
+ alpha_bytes = 2 ** bits
+ chunk(fp, b"tRNS", alpha[:alpha_bytes])
+
+ dpi = im.encoderinfo.get("dpi")
+ if dpi:
+ chunk(
+ fp,
+ b"pHYs",
+ o32(int(dpi[0] / 0.0254 + 0.5)),
+ o32(int(dpi[1] / 0.0254 + 0.5)),
+ b"\x01",
+ )
+
+ if info:
+ chunks = [b"bKGD", b"hIST"]
+ for cid, data in info.chunks:
+ if cid in chunks:
+ chunks.remove(cid)
+ chunk(fp, cid, data)
+
+ exif = im.encoderinfo.get("exif", im.info.get("exif"))
+ if exif:
+ if isinstance(exif, Image.Exif):
+ exif = exif.tobytes(8)
+ if exif.startswith(b"Exif\x00\x00"):
+ exif = exif[6:]
+ chunk(fp, b"eXIf", exif)
+
+ if save_all:
+ _write_multiple_frames(im, fp, chunk, rawmode)
+ else:
+ ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)])
+
+ chunk(fp, b"IEND", b"")
+
+ if hasattr(fp, "flush"):
+ fp.flush()
+
+
+# --------------------------------------------------------------------
+# PNG chunk converter
+
+
+def getchunks(im, **params):
+ """Return a list of PNG chunks representing this image."""
+
+ class collector:
+ data = []
+
+ def write(self, data):
+ pass
+
+ def append(self, chunk):
+ self.data.append(chunk)
+
+ def append(fp, cid, *data):
+ data = b"".join(data)
+ crc = o32(_crc32(data, _crc32(cid)))
+ fp.append((cid, data, crc))
+
+ fp = collector()
+
+ try:
+ im.encoderinfo = params
+ _save(im, fp, None, append)
+ finally:
+ del im.encoderinfo
+
+ return fp.data
+
+
+# --------------------------------------------------------------------
+# Registry
+
+Image.register_open(PngImageFile.format, PngImageFile, _accept)
+Image.register_save(PngImageFile.format, _save)
+Image.register_save_all(PngImageFile.format, _save_all)
+
+Image.register_extensions(PngImageFile.format, [".png", ".apng"])
+
+Image.register_mime(PngImageFile.format, "image/png")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PpmImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PpmImagePlugin.py
new file mode 100644
index 0000000..35a77ba
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PpmImagePlugin.py
@@ -0,0 +1,164 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# PPM support for PIL
+#
+# History:
+# 96-03-24 fl Created
+# 98-03-06 fl Write RGBA images (as RGB, that is)
+#
+# Copyright (c) Secret Labs AB 1997-98.
+# Copyright (c) Fredrik Lundh 1996.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+from . import Image, ImageFile
+
+#
+# --------------------------------------------------------------------
+
+b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d"
+
+MODES = {
+ # standard
+ b"P4": "1",
+ b"P5": "L",
+ b"P6": "RGB",
+ # extensions
+ b"P0CMYK": "CMYK",
+ # PIL extensions (for test purposes only)
+ b"PyP": "P",
+ b"PyRGBA": "RGBA",
+ b"PyCMYK": "CMYK",
+}
+
+
+def _accept(prefix):
+ return prefix[0:1] == b"P" and prefix[1] in b"0456y"
+
+
+##
+# Image plugin for PBM, PGM, and PPM images.
+
+
+class PpmImageFile(ImageFile.ImageFile):
+
+ format = "PPM"
+ format_description = "Pbmplus image"
+
+ def _token(self, s=b""):
+ while True: # read until next whitespace
+ c = self.fp.read(1)
+ if not c or c in b_whitespace:
+ break
+ if c > b"\x79":
+ raise ValueError("Expected ASCII value, found binary")
+ s = s + c
+ if len(s) > 9:
+ raise ValueError("Expected int, got > 9 digits")
+ return s
+
+ def _open(self):
+
+ # check magic
+ s = self.fp.read(1)
+ if s != b"P":
+ raise SyntaxError("not a PPM file")
+ magic_number = self._token(s)
+ mode = MODES[magic_number]
+
+ self.custom_mimetype = {
+ b"P4": "image/x-portable-bitmap",
+ b"P5": "image/x-portable-graymap",
+ b"P6": "image/x-portable-pixmap",
+ }.get(magic_number)
+
+ if mode == "1":
+ self.mode = "1"
+ rawmode = "1;I"
+ else:
+ self.mode = rawmode = mode
+
+ for ix in range(3):
+ while True:
+ while True:
+ s = self.fp.read(1)
+ if s not in b_whitespace:
+ break
+ if s == b"":
+ raise ValueError("File does not extend beyond magic number")
+ if s != b"#":
+ break
+ s = self.fp.readline()
+ s = int(self._token(s))
+ if ix == 0:
+ xsize = s
+ elif ix == 1:
+ ysize = s
+ if mode == "1":
+ break
+ elif ix == 2:
+ # maxgrey
+ if s > 255:
+ if not mode == "L":
+ raise ValueError("Too many colors for band: %s" % s)
+ if s < 2 ** 16:
+ self.mode = "I"
+ rawmode = "I;16B"
+ else:
+ self.mode = "I"
+ rawmode = "I;32B"
+
+ self._size = xsize, ysize
+ self.tile = [("raw", (0, 0, xsize, ysize), self.fp.tell(), (rawmode, 0, 1))]
+
+
+#
+# --------------------------------------------------------------------
+
+
+def _save(im, fp, filename):
+ if im.mode == "1":
+ rawmode, head = "1;I", b"P4"
+ elif im.mode == "L":
+ rawmode, head = "L", b"P5"
+ elif im.mode == "I":
+ if im.getextrema()[1] < 2 ** 16:
+ rawmode, head = "I;16B", b"P5"
+ else:
+ rawmode, head = "I;32B", b"P5"
+ elif im.mode == "RGB":
+ rawmode, head = "RGB", b"P6"
+ elif im.mode == "RGBA":
+ rawmode, head = "RGB", b"P6"
+ else:
+ raise OSError("cannot write mode %s as PPM" % im.mode)
+ fp.write(head + ("\n%d %d\n" % im.size).encode("ascii"))
+ if head == b"P6":
+ fp.write(b"255\n")
+ if head == b"P5":
+ if rawmode == "L":
+ fp.write(b"255\n")
+ elif rawmode == "I;16B":
+ fp.write(b"65535\n")
+ elif rawmode == "I;32B":
+ fp.write(b"2147483648\n")
+ ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))])
+
+ # ALTERNATIVE: save via builtin debug function
+ # im._dump(filename)
+
+
+#
+# --------------------------------------------------------------------
+
+
+Image.register_open(PpmImageFile.format, PpmImageFile, _accept)
+Image.register_save(PpmImageFile.format, _save)
+
+Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm"])
+
+Image.register_mime(PpmImageFile.format, "image/x-portable-anymap")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PsdImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/PsdImagePlugin.py
new file mode 100644
index 0000000..cceb85c
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PsdImagePlugin.py
@@ -0,0 +1,315 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# Adobe PSD 2.5/3.0 file handling
+#
+# History:
+# 1995-09-01 fl Created
+# 1997-01-03 fl Read most PSD images
+# 1997-01-18 fl Fixed P and CMYK support
+# 2001-10-21 fl Added seek/tell support (for layers)
+#
+# Copyright (c) 1997-2001 by Secret Labs AB.
+# Copyright (c) 1995-2001 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import io
+
+from . import Image, ImageFile, ImagePalette
+from ._binary import i8, i16be as i16, i32be as i32
+
+MODES = {
+ # (photoshop mode, bits) -> (pil mode, required channels)
+ (0, 1): ("1", 1),
+ (0, 8): ("L", 1),
+ (1, 8): ("L", 1),
+ (2, 8): ("P", 1),
+ (3, 8): ("RGB", 3),
+ (4, 8): ("CMYK", 4),
+ (7, 8): ("L", 1), # FIXME: multilayer
+ (8, 8): ("L", 1), # duotone
+ (9, 8): ("LAB", 3),
+}
+
+
+# --------------------------------------------------------------------.
+# read PSD images
+
+
+def _accept(prefix):
+ return prefix[:4] == b"8BPS"
+
+
+##
+# Image plugin for Photoshop images.
+
+
+class PsdImageFile(ImageFile.ImageFile):
+
+ format = "PSD"
+ format_description = "Adobe Photoshop"
+ _close_exclusive_fp_after_loading = False
+
+ def _open(self):
+
+ read = self.fp.read
+
+ #
+ # header
+
+ s = read(26)
+ if s[:4] != b"8BPS" or i16(s[4:]) != 1:
+ raise SyntaxError("not a PSD file")
+
+ psd_bits = i16(s[22:])
+ psd_channels = i16(s[12:])
+ psd_mode = i16(s[24:])
+
+ mode, channels = MODES[(psd_mode, psd_bits)]
+
+ if channels > psd_channels:
+ raise OSError("not enough channels")
+
+ self.mode = mode
+ self._size = i32(s[18:]), i32(s[14:])
+
+ #
+ # color mode data
+
+ size = i32(read(4))
+ if size:
+ data = read(size)
+ if mode == "P" and size == 768:
+ self.palette = ImagePalette.raw("RGB;L", data)
+
+ #
+ # image resources
+
+ self.resources = []
+
+ size = i32(read(4))
+ if size:
+ # load resources
+ end = self.fp.tell() + size
+ while self.fp.tell() < end:
+ read(4) # signature
+ id = i16(read(2))
+ name = read(i8(read(1)))
+ if not (len(name) & 1):
+ read(1) # padding
+ data = read(i32(read(4)))
+ if len(data) & 1:
+ read(1) # padding
+ self.resources.append((id, name, data))
+ if id == 1039: # ICC profile
+ self.info["icc_profile"] = data
+
+ #
+ # layer and mask information
+
+ self.layers = []
+
+ size = i32(read(4))
+ if size:
+ end = self.fp.tell() + size
+ size = i32(read(4))
+ if size:
+ self.layers = _layerinfo(self.fp)
+ self.fp.seek(end)
+
+ #
+ # image descriptor
+
+ self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels)
+
+ # keep the file open
+ self.__fp = self.fp
+ self.frame = 1
+ self._min_frame = 1
+
+ @property
+ def n_frames(self):
+ return len(self.layers)
+
+ @property
+ def is_animated(self):
+ return len(self.layers) > 1
+
+ def seek(self, layer):
+ if not self._seek_check(layer):
+ return
+
+ # seek to given layer (1..max)
+ try:
+ name, mode, bbox, tile = self.layers[layer - 1]
+ self.mode = mode
+ self.tile = tile
+ self.frame = layer
+ self.fp = self.__fp
+ return name, bbox
+ except IndexError:
+ raise EOFError("no such layer")
+
+ def tell(self):
+ # return layer number (0=image, 1..max=layers)
+ return self.frame
+
+ def load_prepare(self):
+ # create image memory if necessary
+ if not self.im or self.im.mode != self.mode or self.im.size != self.size:
+ self.im = Image.core.fill(self.mode, self.size, 0)
+ # create palette (optional)
+ if self.mode == "P":
+ Image.Image.load(self)
+
+ def _close__fp(self):
+ try:
+ if self.__fp != self.fp:
+ self.__fp.close()
+ except AttributeError:
+ pass
+ finally:
+ self.__fp = None
+
+
+def _layerinfo(file):
+ # read layerinfo block
+ layers = []
+ read = file.read
+ for i in range(abs(i16(read(2)))):
+
+ # bounding box
+ y0 = i32(read(4))
+ x0 = i32(read(4))
+ y1 = i32(read(4))
+ x1 = i32(read(4))
+
+ # image info
+ info = []
+ mode = []
+ types = list(range(i16(read(2))))
+ if len(types) > 4:
+ continue
+
+ for i in types:
+ type = i16(read(2))
+
+ if type == 65535:
+ m = "A"
+ else:
+ m = "RGBA"[type]
+
+ mode.append(m)
+ size = i32(read(4))
+ info.append((m, size))
+
+ # figure out the image mode
+ mode.sort()
+ if mode == ["R"]:
+ mode = "L"
+ elif mode == ["B", "G", "R"]:
+ mode = "RGB"
+ elif mode == ["A", "B", "G", "R"]:
+ mode = "RGBA"
+ else:
+ mode = None # unknown
+
+ # skip over blend flags and extra information
+ read(12) # filler
+ name = ""
+ size = i32(read(4)) # length of the extra data field
+ combined = 0
+ if size:
+ data_end = file.tell() + size
+
+ length = i32(read(4))
+ if length:
+ file.seek(length - 16, io.SEEK_CUR)
+ combined += length + 4
+
+ length = i32(read(4))
+ if length:
+ file.seek(length, io.SEEK_CUR)
+ combined += length + 4
+
+ length = i8(read(1))
+ if length:
+ # Don't know the proper encoding,
+ # Latin-1 should be a good guess
+ name = read(length).decode("latin-1", "replace")
+ combined += length + 1
+
+ file.seek(data_end)
+ layers.append((name, mode, (x0, y0, x1, y1)))
+
+ # get tiles
+ i = 0
+ for name, mode, bbox in layers:
+ tile = []
+ for m in mode:
+ t = _maketile(file, m, bbox, 1)
+ if t:
+ tile.extend(t)
+ layers[i] = name, mode, bbox, tile
+ i += 1
+
+ return layers
+
+
+def _maketile(file, mode, bbox, channels):
+
+ tile = None
+ read = file.read
+
+ compression = i16(read(2))
+
+ xsize = bbox[2] - bbox[0]
+ ysize = bbox[3] - bbox[1]
+
+ offset = file.tell()
+
+ if compression == 0:
+ #
+ # raw compression
+ tile = []
+ for channel in range(channels):
+ layer = mode[channel]
+ if mode == "CMYK":
+ layer += ";I"
+ tile.append(("raw", bbox, offset, layer))
+ offset = offset + xsize * ysize
+
+ elif compression == 1:
+ #
+ # packbits compression
+ i = 0
+ tile = []
+ bytecount = read(channels * ysize * 2)
+ offset = file.tell()
+ for channel in range(channels):
+ layer = mode[channel]
+ if mode == "CMYK":
+ layer += ";I"
+ tile.append(("packbits", bbox, offset, layer))
+ for y in range(ysize):
+ offset = offset + i16(bytecount[i : i + 2])
+ i += 2
+
+ file.seek(offset)
+
+ if offset & 1:
+ read(1) # padding
+
+ return tile
+
+
+# --------------------------------------------------------------------
+# registry
+
+
+Image.register_open(PsdImageFile.format, PsdImageFile, _accept)
+
+Image.register_extension(PsdImageFile.format, ".psd")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/PyAccess.py b/geekshop/django_2.0/Lib/site-packages/PIL/PyAccess.py
new file mode 100644
index 0000000..359a949
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/PyAccess.py
@@ -0,0 +1,346 @@
+#
+# The Python Imaging Library
+# Pillow fork
+#
+# Python implementation of the PixelAccess Object
+#
+# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved.
+# Copyright (c) 1995-2009 by Fredrik Lundh.
+# Copyright (c) 2013 Eric Soroos
+#
+# See the README file for information on usage and redistribution
+#
+
+# Notes:
+#
+# * Implements the pixel access object following Access.
+# * Does not implement the line functions, as they don't appear to be used
+# * Taking only the tuple form, which is used from python.
+# * Fill.c uses the integer form, but it's still going to use the old
+# Access.c implementation.
+#
+
+import logging
+import sys
+
+from cffi import FFI
+
+logger = logging.getLogger(__name__)
+
+
+defs = """
+struct Pixel_RGBA {
+ unsigned char r,g,b,a;
+};
+struct Pixel_I16 {
+ unsigned char l,r;
+};
+"""
+ffi = FFI()
+ffi.cdef(defs)
+
+
+class PyAccess:
+ def __init__(self, img, readonly=False):
+ vals = dict(img.im.unsafe_ptrs)
+ self.readonly = readonly
+ self.image8 = ffi.cast("unsigned char **", vals["image8"])
+ self.image32 = ffi.cast("int **", vals["image32"])
+ self.image = ffi.cast("unsigned char **", vals["image"])
+ self.xsize, self.ysize = img.im.size
+
+ # Keep pointer to im object to prevent dereferencing.
+ self._im = img.im
+ if self._im.mode == "P":
+ self._palette = img.palette
+
+ # Debugging is polluting test traces, only useful here
+ # when hacking on PyAccess
+ # logger.debug("%s", vals)
+ self._post_init()
+
+ def _post_init(self):
+ pass
+
+ def __setitem__(self, xy, color):
+ """
+ Modifies the pixel at x,y. The color is given as a single
+ numerical value for single band images, and a tuple for
+ multi-band images
+
+ :param xy: The pixel coordinate, given as (x, y). See
+ :ref:`coordinate-system`.
+ :param color: The pixel value.
+ """
+ if self.readonly:
+ raise ValueError("Attempt to putpixel a read only image")
+ (x, y) = xy
+ if x < 0:
+ x = self.xsize + x
+ if y < 0:
+ y = self.ysize + y
+ (x, y) = self.check_xy((x, y))
+
+ if (
+ self._im.mode == "P"
+ and isinstance(color, (list, tuple))
+ and len(color) in [3, 4]
+ ):
+ # RGB or RGBA value for a P image
+ color = self._palette.getcolor(color)
+
+ return self.set_pixel(x, y, color)
+
+ def __getitem__(self, xy):
+ """
+ Returns the pixel at x,y. The pixel is returned as a single
+ value for single band images or a tuple for multiple band
+ images
+
+ :param xy: The pixel coordinate, given as (x, y). See
+ :ref:`coordinate-system`.
+ :returns: a pixel value for single band images, a tuple of
+ pixel values for multiband images.
+ """
+ (x, y) = xy
+ if x < 0:
+ x = self.xsize + x
+ if y < 0:
+ y = self.ysize + y
+ (x, y) = self.check_xy((x, y))
+ return self.get_pixel(x, y)
+
+ putpixel = __setitem__
+ getpixel = __getitem__
+
+ def check_xy(self, xy):
+ (x, y) = xy
+ if not (0 <= x < self.xsize and 0 <= y < self.ysize):
+ raise ValueError("pixel location out of range")
+ return xy
+
+
+class _PyAccess32_2(PyAccess):
+ """ PA, LA, stored in first and last bytes of a 32 bit word """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32)
+
+ def get_pixel(self, x, y):
+ pixel = self.pixels[y][x]
+ return (pixel.r, pixel.a)
+
+ def set_pixel(self, x, y, color):
+ pixel = self.pixels[y][x]
+ # tuple
+ pixel.r = min(color[0], 255)
+ pixel.a = min(color[1], 255)
+
+
+class _PyAccess32_3(PyAccess):
+ """ RGB and friends, stored in the first three bytes of a 32 bit word """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32)
+
+ def get_pixel(self, x, y):
+ pixel = self.pixels[y][x]
+ return (pixel.r, pixel.g, pixel.b)
+
+ def set_pixel(self, x, y, color):
+ pixel = self.pixels[y][x]
+ # tuple
+ pixel.r = min(color[0], 255)
+ pixel.g = min(color[1], 255)
+ pixel.b = min(color[2], 255)
+ pixel.a = 255
+
+
+class _PyAccess32_4(PyAccess):
+ """ RGBA etc, all 4 bytes of a 32 bit word """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32)
+
+ def get_pixel(self, x, y):
+ pixel = self.pixels[y][x]
+ return (pixel.r, pixel.g, pixel.b, pixel.a)
+
+ def set_pixel(self, x, y, color):
+ pixel = self.pixels[y][x]
+ # tuple
+ pixel.r = min(color[0], 255)
+ pixel.g = min(color[1], 255)
+ pixel.b = min(color[2], 255)
+ pixel.a = min(color[3], 255)
+
+
+class _PyAccess8(PyAccess):
+ """ 1, L, P, 8 bit images stored as uint8 """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = self.image8
+
+ def get_pixel(self, x, y):
+ return self.pixels[y][x]
+
+ def set_pixel(self, x, y, color):
+ try:
+ # integer
+ self.pixels[y][x] = min(color, 255)
+ except TypeError:
+ # tuple
+ self.pixels[y][x] = min(color[0], 255)
+
+
+class _PyAccessI16_N(PyAccess):
+ """ I;16 access, native bitendian without conversion """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = ffi.cast("unsigned short **", self.image)
+
+ def get_pixel(self, x, y):
+ return self.pixels[y][x]
+
+ def set_pixel(self, x, y, color):
+ try:
+ # integer
+ self.pixels[y][x] = min(color, 65535)
+ except TypeError:
+ # tuple
+ self.pixels[y][x] = min(color[0], 65535)
+
+
+class _PyAccessI16_L(PyAccess):
+ """ I;16L access, with conversion """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = ffi.cast("struct Pixel_I16 **", self.image)
+
+ def get_pixel(self, x, y):
+ pixel = self.pixels[y][x]
+ return pixel.l + pixel.r * 256
+
+ def set_pixel(self, x, y, color):
+ pixel = self.pixels[y][x]
+ try:
+ color = min(color, 65535)
+ except TypeError:
+ color = min(color[0], 65535)
+
+ pixel.l = color & 0xFF # noqa: E741
+ pixel.r = color >> 8
+
+
+class _PyAccessI16_B(PyAccess):
+ """ I;16B access, with conversion """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = ffi.cast("struct Pixel_I16 **", self.image)
+
+ def get_pixel(self, x, y):
+ pixel = self.pixels[y][x]
+ return pixel.l * 256 + pixel.r
+
+ def set_pixel(self, x, y, color):
+ pixel = self.pixels[y][x]
+ try:
+ color = min(color, 65535)
+ except Exception:
+ color = min(color[0], 65535)
+
+ pixel.l = color >> 8 # noqa: E741
+ pixel.r = color & 0xFF
+
+
+class _PyAccessI32_N(PyAccess):
+ """ Signed Int32 access, native endian """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = self.image32
+
+ def get_pixel(self, x, y):
+ return self.pixels[y][x]
+
+ def set_pixel(self, x, y, color):
+ self.pixels[y][x] = color
+
+
+class _PyAccessI32_Swap(PyAccess):
+ """ I;32L/B access, with byteswapping conversion """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = self.image32
+
+ def reverse(self, i):
+ orig = ffi.new("int *", i)
+ chars = ffi.cast("unsigned char *", orig)
+ chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], chars[1], chars[0]
+ return ffi.cast("int *", chars)[0]
+
+ def get_pixel(self, x, y):
+ return self.reverse(self.pixels[y][x])
+
+ def set_pixel(self, x, y, color):
+ self.pixels[y][x] = self.reverse(color)
+
+
+class _PyAccessF(PyAccess):
+ """ 32 bit float access """
+
+ def _post_init(self, *args, **kwargs):
+ self.pixels = ffi.cast("float **", self.image32)
+
+ def get_pixel(self, x, y):
+ return self.pixels[y][x]
+
+ def set_pixel(self, x, y, color):
+ try:
+ # not a tuple
+ self.pixels[y][x] = color
+ except TypeError:
+ # tuple
+ self.pixels[y][x] = color[0]
+
+
+mode_map = {
+ "1": _PyAccess8,
+ "L": _PyAccess8,
+ "P": _PyAccess8,
+ "LA": _PyAccess32_2,
+ "La": _PyAccess32_2,
+ "PA": _PyAccess32_2,
+ "RGB": _PyAccess32_3,
+ "LAB": _PyAccess32_3,
+ "HSV": _PyAccess32_3,
+ "YCbCr": _PyAccess32_3,
+ "RGBA": _PyAccess32_4,
+ "RGBa": _PyAccess32_4,
+ "RGBX": _PyAccess32_4,
+ "CMYK": _PyAccess32_4,
+ "F": _PyAccessF,
+ "I": _PyAccessI32_N,
+}
+
+if sys.byteorder == "little":
+ mode_map["I;16"] = _PyAccessI16_N
+ mode_map["I;16L"] = _PyAccessI16_N
+ mode_map["I;16B"] = _PyAccessI16_B
+
+ mode_map["I;32L"] = _PyAccessI32_N
+ mode_map["I;32B"] = _PyAccessI32_Swap
+else:
+ mode_map["I;16"] = _PyAccessI16_L
+ mode_map["I;16L"] = _PyAccessI16_L
+ mode_map["I;16B"] = _PyAccessI16_N
+
+ mode_map["I;32L"] = _PyAccessI32_Swap
+ mode_map["I;32B"] = _PyAccessI32_N
+
+
+def new(img, readonly=False):
+ access_type = mode_map.get(img.mode, None)
+ if not access_type:
+ logger.debug("PyAccess Not Implemented: %s", img.mode)
+ return None
+ return access_type(img, readonly)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/SgiImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/SgiImagePlugin.py
new file mode 100644
index 0000000..ddd3de3
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/SgiImagePlugin.py
@@ -0,0 +1,231 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# SGI image file handling
+#
+# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli.
+#
+#
+#
+# History:
+# 2017-22-07 mb Add RLE decompression
+# 2016-16-10 mb Add save method without compression
+# 1995-09-10 fl Created
+#
+# Copyright (c) 2016 by Mickael Bonfill.
+# Copyright (c) 2008 by Karsten Hiddemann.
+# Copyright (c) 1997 by Secret Labs AB.
+# Copyright (c) 1995 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+import os
+import struct
+
+from . import Image, ImageFile
+from ._binary import i8, i16be as i16, o8
+
+
+def _accept(prefix):
+ return len(prefix) >= 2 and i16(prefix) == 474
+
+
+MODES = {
+ (1, 1, 1): "L",
+ (1, 2, 1): "L",
+ (2, 1, 1): "L;16B",
+ (2, 2, 1): "L;16B",
+ (1, 3, 3): "RGB",
+ (2, 3, 3): "RGB;16B",
+ (1, 3, 4): "RGBA",
+ (2, 3, 4): "RGBA;16B",
+}
+
+
+##
+# Image plugin for SGI images.
+class SgiImageFile(ImageFile.ImageFile):
+
+ format = "SGI"
+ format_description = "SGI Image File Format"
+
+ def _open(self):
+
+ # HEAD
+ headlen = 512
+ s = self.fp.read(headlen)
+
+ # magic number : 474
+ if i16(s) != 474:
+ raise ValueError("Not an SGI image file")
+
+ # compression : verbatim or RLE
+ compression = i8(s[2])
+
+ # bpc : 1 or 2 bytes (8bits or 16bits)
+ bpc = i8(s[3])
+
+ # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize)
+ dimension = i16(s[4:])
+
+ # xsize : width
+ xsize = i16(s[6:])
+
+ # ysize : height
+ ysize = i16(s[8:])
+
+ # zsize : channels count
+ zsize = i16(s[10:])
+
+ # layout
+ layout = bpc, dimension, zsize
+
+ # determine mode from bits/zsize
+ rawmode = ""
+ try:
+ rawmode = MODES[layout]
+ except KeyError:
+ pass
+
+ if rawmode == "":
+ raise ValueError("Unsupported SGI image mode")
+
+ self._size = xsize, ysize
+ self.mode = rawmode.split(";")[0]
+ if self.mode == "RGB":
+ self.custom_mimetype = "image/rgb"
+
+ # orientation -1 : scanlines begins at the bottom-left corner
+ orientation = -1
+
+ # decoder info
+ if compression == 0:
+ pagesize = xsize * ysize * bpc
+ if bpc == 2:
+ self.tile = [
+ ("SGI16", (0, 0) + self.size, headlen, (self.mode, 0, orientation))
+ ]
+ else:
+ self.tile = []
+ offset = headlen
+ for layer in self.mode:
+ self.tile.append(
+ ("raw", (0, 0) + self.size, offset, (layer, 0, orientation))
+ )
+ offset += pagesize
+ elif compression == 1:
+ self.tile = [
+ ("sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc))
+ ]
+
+
+def _save(im, fp, filename):
+ if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "L":
+ raise ValueError("Unsupported SGI image mode")
+
+ # Get the keyword arguments
+ info = im.encoderinfo
+
+ # Byte-per-pixel precision, 1 = 8bits per pixel
+ bpc = info.get("bpc", 1)
+
+ if bpc not in (1, 2):
+ raise ValueError("Unsupported number of bytes per pixel")
+
+ # Flip the image, since the origin of SGI file is the bottom-left corner
+ orientation = -1
+ # Define the file as SGI File Format
+ magicNumber = 474
+ # Run-Length Encoding Compression - Unsupported at this time
+ rle = 0
+
+ # Number of dimensions (x,y,z)
+ dim = 3
+ # X Dimension = width / Y Dimension = height
+ x, y = im.size
+ if im.mode == "L" and y == 1:
+ dim = 1
+ elif im.mode == "L":
+ dim = 2
+ # Z Dimension: Number of channels
+ z = len(im.mode)
+
+ if dim == 1 or dim == 2:
+ z = 1
+
+ # assert we've got the right number of bands.
+ if len(im.getbands()) != z:
+ raise ValueError(
+ "incorrect number of bands in SGI write: {} vs {}".format(
+ z, len(im.getbands())
+ )
+ )
+
+ # Minimum Byte value
+ pinmin = 0
+ # Maximum Byte value (255 = 8bits per pixel)
+ pinmax = 255
+ # Image name (79 characters max, truncated below in write)
+ imgName = os.path.splitext(os.path.basename(filename))[0]
+ imgName = imgName.encode("ascii", "ignore")
+ # Standard representation of pixel in the file
+ colormap = 0
+ fp.write(struct.pack(">h", magicNumber))
+ fp.write(o8(rle))
+ fp.write(o8(bpc))
+ fp.write(struct.pack(">H", dim))
+ fp.write(struct.pack(">H", x))
+ fp.write(struct.pack(">H", y))
+ fp.write(struct.pack(">H", z))
+ fp.write(struct.pack(">l", pinmin))
+ fp.write(struct.pack(">l", pinmax))
+ fp.write(struct.pack("4s", b"")) # dummy
+ fp.write(struct.pack("79s", imgName)) # truncates to 79 chars
+ fp.write(struct.pack("s", b"")) # force null byte after imgname
+ fp.write(struct.pack(">l", colormap))
+ fp.write(struct.pack("404s", b"")) # dummy
+
+ rawmode = "L"
+ if bpc == 2:
+ rawmode = "L;16B"
+
+ for channel in im.split():
+ fp.write(channel.tobytes("raw", rawmode, 0, orientation))
+
+ fp.close()
+
+
+class SGI16Decoder(ImageFile.PyDecoder):
+ _pulls_fd = True
+
+ def decode(self, buffer):
+ rawmode, stride, orientation = self.args
+ pagesize = self.state.xsize * self.state.ysize
+ zsize = len(self.mode)
+ self.fd.seek(512)
+
+ for band in range(zsize):
+ channel = Image.new("L", (self.state.xsize, self.state.ysize))
+ channel.frombytes(
+ self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation
+ )
+ self.im.putband(channel.im, band)
+
+ return -1, 0
+
+
+#
+# registry
+
+
+Image.register_decoder("SGI16", SGI16Decoder)
+Image.register_open(SgiImageFile.format, SgiImageFile, _accept)
+Image.register_save(SgiImageFile.format, _save)
+Image.register_mime(SgiImageFile.format, "image/sgi")
+
+Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"])
+
+# End of file
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/SpiderImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/SpiderImagePlugin.py
new file mode 100644
index 0000000..cbd31cf
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/SpiderImagePlugin.py
@@ -0,0 +1,324 @@
+#
+# The Python Imaging Library.
+#
+# SPIDER image file handling
+#
+# History:
+# 2004-08-02 Created BB
+# 2006-03-02 added save method
+# 2006-03-13 added support for stack images
+#
+# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144.
+# Copyright (c) 2004 by William Baxter.
+# Copyright (c) 2004 by Secret Labs AB.
+# Copyright (c) 2004 by Fredrik Lundh.
+#
+
+##
+# Image plugin for the Spider image format. This format is is used
+# by the SPIDER software, in processing image data from electron
+# microscopy and tomography.
+##
+
+#
+# SpiderImagePlugin.py
+#
+# The Spider image format is used by SPIDER software, in processing
+# image data from electron microscopy and tomography.
+#
+# Spider home page:
+# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html
+#
+# Details about the Spider image format:
+# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html
+#
+import os
+import struct
+import sys
+
+from PIL import Image, ImageFile
+
+
+def isInt(f):
+ try:
+ i = int(f)
+ if f - i == 0:
+ return 1
+ else:
+ return 0
+ except (ValueError, OverflowError):
+ return 0
+
+
+iforms = [1, 3, -11, -12, -21, -22]
+
+
+# There is no magic number to identify Spider files, so just check a
+# series of header locations to see if they have reasonable values.
+# Returns no. of bytes in the header, if it is a valid Spider header,
+# otherwise returns 0
+
+
+def isSpiderHeader(t):
+ h = (99,) + t # add 1 value so can use spider header index start=1
+ # header values 1,2,5,12,13,22,23 should be integers
+ for i in [1, 2, 5, 12, 13, 22, 23]:
+ if not isInt(h[i]):
+ return 0
+ # check iform
+ iform = int(h[5])
+ if iform not in iforms:
+ return 0
+ # check other header values
+ labrec = int(h[13]) # no. records in file header
+ labbyt = int(h[22]) # total no. of bytes in header
+ lenbyt = int(h[23]) # record length in bytes
+ if labbyt != (labrec * lenbyt):
+ return 0
+ # looks like a valid header
+ return labbyt
+
+
+def isSpiderImage(filename):
+ with open(filename, "rb") as fp:
+ f = fp.read(92) # read 23 * 4 bytes
+ t = struct.unpack(">23f", f) # try big-endian first
+ hdrlen = isSpiderHeader(t)
+ if hdrlen == 0:
+ t = struct.unpack("<23f", f) # little-endian
+ hdrlen = isSpiderHeader(t)
+ return hdrlen
+
+
+class SpiderImageFile(ImageFile.ImageFile):
+
+ format = "SPIDER"
+ format_description = "Spider 2D image"
+ _close_exclusive_fp_after_loading = False
+
+ def _open(self):
+ # check header
+ n = 27 * 4 # read 27 float values
+ f = self.fp.read(n)
+
+ try:
+ self.bigendian = 1
+ t = struct.unpack(">27f", f) # try big-endian first
+ hdrlen = isSpiderHeader(t)
+ if hdrlen == 0:
+ self.bigendian = 0
+ t = struct.unpack("<27f", f) # little-endian
+ hdrlen = isSpiderHeader(t)
+ if hdrlen == 0:
+ raise SyntaxError("not a valid Spider file")
+ except struct.error:
+ raise SyntaxError("not a valid Spider file")
+
+ h = (99,) + t # add 1 value : spider header index starts at 1
+ iform = int(h[5])
+ if iform != 1:
+ raise SyntaxError("not a Spider 2D image")
+
+ self._size = int(h[12]), int(h[2]) # size in pixels (width, height)
+ self.istack = int(h[24])
+ self.imgnumber = int(h[27])
+
+ if self.istack == 0 and self.imgnumber == 0:
+ # stk=0, img=0: a regular 2D image
+ offset = hdrlen
+ self._nimages = 1
+ elif self.istack > 0 and self.imgnumber == 0:
+ # stk>0, img=0: Opening the stack for the first time
+ self.imgbytes = int(h[12]) * int(h[2]) * 4
+ self.hdrlen = hdrlen
+ self._nimages = int(h[26])
+ # Point to the first image in the stack
+ offset = hdrlen * 2
+ self.imgnumber = 1
+ elif self.istack == 0 and self.imgnumber > 0:
+ # stk=0, img>0: an image within the stack
+ offset = hdrlen + self.stkoffset
+ self.istack = 2 # So Image knows it's still a stack
+ else:
+ raise SyntaxError("inconsistent stack header values")
+
+ if self.bigendian:
+ self.rawmode = "F;32BF"
+ else:
+ self.rawmode = "F;32F"
+ self.mode = "F"
+
+ self.tile = [("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))]
+ self.__fp = self.fp # FIXME: hack
+
+ @property
+ def n_frames(self):
+ return self._nimages
+
+ @property
+ def is_animated(self):
+ return self._nimages > 1
+
+ # 1st image index is zero (although SPIDER imgnumber starts at 1)
+ def tell(self):
+ if self.imgnumber < 1:
+ return 0
+ else:
+ return self.imgnumber - 1
+
+ def seek(self, frame):
+ if self.istack == 0:
+ raise EOFError("attempt to seek in a non-stack file")
+ if not self._seek_check(frame):
+ return
+ self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes)
+ self.fp = self.__fp
+ self.fp.seek(self.stkoffset)
+ self._open()
+
+ # returns a byte image after rescaling to 0..255
+ def convert2byte(self, depth=255):
+ (minimum, maximum) = self.getextrema()
+ m = 1
+ if maximum != minimum:
+ m = depth / (maximum - minimum)
+ b = -m * minimum
+ return self.point(lambda i, m=m, b=b: i * m + b).convert("L")
+
+ # returns a ImageTk.PhotoImage object, after rescaling to 0..255
+ def tkPhotoImage(self):
+ from PIL import ImageTk
+
+ return ImageTk.PhotoImage(self.convert2byte(), palette=256)
+
+ def _close__fp(self):
+ try:
+ if self.__fp != self.fp:
+ self.__fp.close()
+ except AttributeError:
+ pass
+ finally:
+ self.__fp = None
+
+
+# --------------------------------------------------------------------
+# Image series
+
+# given a list of filenames, return a list of images
+def loadImageSeries(filelist=None):
+ """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage"""
+ if filelist is None or len(filelist) < 1:
+ return
+
+ imglist = []
+ for img in filelist:
+ if not os.path.exists(img):
+ print("unable to find %s" % img)
+ continue
+ try:
+ with Image.open(img) as im:
+ im = im.convert2byte()
+ except Exception:
+ if not isSpiderImage(img):
+ print(img + " is not a Spider image file")
+ continue
+ im.info["filename"] = img
+ imglist.append(im)
+ return imglist
+
+
+# --------------------------------------------------------------------
+# For saving images in Spider format
+
+
+def makeSpiderHeader(im):
+ nsam, nrow = im.size
+ lenbyt = nsam * 4 # There are labrec records in the header
+ labrec = int(1024 / lenbyt)
+ if 1024 % lenbyt != 0:
+ labrec += 1
+ labbyt = labrec * lenbyt
+ hdr = []
+ nvalues = int(labbyt / 4)
+ for i in range(nvalues):
+ hdr.append(0.0)
+
+ if len(hdr) < 23:
+ return []
+
+ # NB these are Fortran indices
+ hdr[1] = 1.0 # nslice (=1 for an image)
+ hdr[2] = float(nrow) # number of rows per slice
+ hdr[5] = 1.0 # iform for 2D image
+ hdr[12] = float(nsam) # number of pixels per line
+ hdr[13] = float(labrec) # number of records in file header
+ hdr[22] = float(labbyt) # total number of bytes in header
+ hdr[23] = float(lenbyt) # record length in bytes
+
+ # adjust for Fortran indexing
+ hdr = hdr[1:]
+ hdr.append(0.0)
+ # pack binary data into a string
+ hdrstr = []
+ for v in hdr:
+ hdrstr.append(struct.pack("f", v))
+ return hdrstr
+
+
+def _save(im, fp, filename):
+ if im.mode[0] != "F":
+ im = im.convert("F")
+
+ hdr = makeSpiderHeader(im)
+ if len(hdr) < 256:
+ raise OSError("Error creating Spider header")
+
+ # write the SPIDER header
+ fp.writelines(hdr)
+
+ rawmode = "F;32NF" # 32-bit native floating point
+ ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))])
+
+
+def _save_spider(im, fp, filename):
+ # get the filename extension and register it with Image
+ ext = os.path.splitext(filename)[1]
+ Image.register_extension(SpiderImageFile.format, ext)
+ _save(im, fp, filename)
+
+
+# --------------------------------------------------------------------
+
+
+Image.register_open(SpiderImageFile.format, SpiderImageFile)
+Image.register_save(SpiderImageFile.format, _save_spider)
+
+if __name__ == "__main__":
+
+ if len(sys.argv) < 2:
+ print("Syntax: python SpiderImagePlugin.py [infile] [outfile]")
+ sys.exit()
+
+ filename = sys.argv[1]
+ if not isSpiderImage(filename):
+ print("input image must be in Spider format")
+ sys.exit()
+
+ with Image.open(filename) as im:
+ print("image: " + str(im))
+ print("format: " + str(im.format))
+ print("size: " + str(im.size))
+ print("mode: " + str(im.mode))
+ print("max, min: ", end=" ")
+ print(im.getextrema())
+
+ if len(sys.argv) > 2:
+ outfile = sys.argv[2]
+
+ # perform some image operation
+ im = im.transpose(Image.FLIP_LEFT_RIGHT)
+ print(
+ "saving a flipped version of %s as %s "
+ % (os.path.basename(filename), outfile)
+ )
+ im.save(outfile, SpiderImageFile.format)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/SunImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/SunImagePlugin.py
new file mode 100644
index 0000000..fd7ca8a
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/SunImagePlugin.py
@@ -0,0 +1,136 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# Sun image file handling
+#
+# History:
+# 1995-09-10 fl Created
+# 1996-05-28 fl Fixed 32-bit alignment
+# 1998-12-29 fl Import ImagePalette module
+# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault)
+#
+# Copyright (c) 1997-2001 by Secret Labs AB
+# Copyright (c) 1995-1996 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+from . import Image, ImageFile, ImagePalette
+from ._binary import i32be as i32
+
+
+def _accept(prefix):
+ return len(prefix) >= 4 and i32(prefix) == 0x59A66A95
+
+
+##
+# Image plugin for Sun raster files.
+
+
+class SunImageFile(ImageFile.ImageFile):
+
+ format = "SUN"
+ format_description = "Sun Raster File"
+
+ def _open(self):
+
+ # The Sun Raster file header is 32 bytes in length
+ # and has the following format:
+
+ # typedef struct _SunRaster
+ # {
+ # DWORD MagicNumber; /* Magic (identification) number */
+ # DWORD Width; /* Width of image in pixels */
+ # DWORD Height; /* Height of image in pixels */
+ # DWORD Depth; /* Number of bits per pixel */
+ # DWORD Length; /* Size of image data in bytes */
+ # DWORD Type; /* Type of raster file */
+ # DWORD ColorMapType; /* Type of color map */
+ # DWORD ColorMapLength; /* Size of the color map in bytes */
+ # } SUNRASTER;
+
+ # HEAD
+ s = self.fp.read(32)
+ if i32(s) != 0x59A66A95:
+ raise SyntaxError("not an SUN raster file")
+
+ offset = 32
+
+ self._size = i32(s[4:8]), i32(s[8:12])
+
+ depth = i32(s[12:16])
+ # data_length = i32(s[16:20]) # unreliable, ignore.
+ file_type = i32(s[20:24])
+ palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary
+ palette_length = i32(s[28:32])
+
+ if depth == 1:
+ self.mode, rawmode = "1", "1;I"
+ elif depth == 4:
+ self.mode, rawmode = "L", "L;4"
+ elif depth == 8:
+ self.mode = rawmode = "L"
+ elif depth == 24:
+ if file_type == 3:
+ self.mode, rawmode = "RGB", "RGB"
+ else:
+ self.mode, rawmode = "RGB", "BGR"
+ elif depth == 32:
+ if file_type == 3:
+ self.mode, rawmode = "RGB", "RGBX"
+ else:
+ self.mode, rawmode = "RGB", "BGRX"
+ else:
+ raise SyntaxError("Unsupported Mode/Bit Depth")
+
+ if palette_length:
+ if palette_length > 1024:
+ raise SyntaxError("Unsupported Color Palette Length")
+
+ if palette_type != 1:
+ raise SyntaxError("Unsupported Palette Type")
+
+ offset = offset + palette_length
+ self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length))
+ if self.mode == "L":
+ self.mode = "P"
+ rawmode = rawmode.replace("L", "P")
+
+ # 16 bit boundaries on stride
+ stride = ((self.size[0] * depth + 15) // 16) * 2
+
+ # file type: Type is the version (or flavor) of the bitmap
+ # file. The following values are typically found in the Type
+ # field:
+ # 0000h Old
+ # 0001h Standard
+ # 0002h Byte-encoded
+ # 0003h RGB format
+ # 0004h TIFF format
+ # 0005h IFF format
+ # FFFFh Experimental
+
+ # Old and standard are the same, except for the length tag.
+ # byte-encoded is run-length-encoded
+ # RGB looks similar to standard, but RGB byte order
+ # TIFF and IFF mean that they were converted from T/IFF
+ # Experimental means that it's something else.
+ # (https://www.fileformat.info/format/sunraster/egff.htm)
+
+ if file_type in (0, 1, 3, 4, 5):
+ self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride))]
+ elif file_type == 2:
+ self.tile = [("sun_rle", (0, 0) + self.size, offset, rawmode)]
+ else:
+ raise SyntaxError("Unsupported Sun Raster file type")
+
+
+#
+# registry
+
+
+Image.register_open(SunImageFile.format, SunImageFile, _accept)
+
+Image.register_extension(SunImageFile.format, ".ras")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/TarIO.py b/geekshop/django_2.0/Lib/site-packages/PIL/TarIO.py
new file mode 100644
index 0000000..ede6464
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/TarIO.py
@@ -0,0 +1,67 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# read files from within a tar file
+#
+# History:
+# 95-06-18 fl Created
+# 96-05-28 fl Open files in binary mode
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1995-96.
+#
+# See the README file for information on usage and redistribution.
+#
+
+import io
+
+from . import ContainerIO
+
+##
+# A file object that provides read access to a given member of a TAR
+# file.
+
+
+class TarIO(ContainerIO.ContainerIO):
+ def __init__(self, tarfile, file):
+ """
+ Create file object.
+
+ :param tarfile: Name of TAR file.
+ :param file: Name of member file.
+ """
+ self.fh = open(tarfile, "rb")
+
+ while True:
+
+ s = self.fh.read(512)
+ if len(s) != 512:
+ raise OSError("unexpected end of tar file")
+
+ name = s[:100].decode("utf-8")
+ i = name.find("\0")
+ if i == 0:
+ raise OSError("cannot find subfile")
+ if i > 0:
+ name = name[:i]
+
+ size = int(s[124:135], 8)
+
+ if file == name:
+ break
+
+ self.fh.seek((size + 511) & (~511), io.SEEK_CUR)
+
+ # Open region
+ super().__init__(self.fh, self.fh.tell(), size)
+
+ # Context manager support
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.close()
+
+ def close(self):
+ self.fh.close()
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/TgaImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/TgaImagePlugin.py
new file mode 100644
index 0000000..fd71e54
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/TgaImagePlugin.py
@@ -0,0 +1,246 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# TGA file handling
+#
+# History:
+# 95-09-01 fl created (reads 24-bit files only)
+# 97-01-04 fl support more TGA versions, including compressed images
+# 98-07-04 fl fixed orientation and alpha layer bugs
+# 98-09-11 fl fixed orientation for runlength decoder
+#
+# Copyright (c) Secret Labs AB 1997-98.
+# Copyright (c) Fredrik Lundh 1995-97.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+import warnings
+
+from . import Image, ImageFile, ImagePalette
+from ._binary import i8, i16le as i16, o8, o16le as o16
+
+#
+# --------------------------------------------------------------------
+# Read RGA file
+
+
+MODES = {
+ # map imagetype/depth to rawmode
+ (1, 8): "P",
+ (3, 1): "1",
+ (3, 8): "L",
+ (3, 16): "LA",
+ (2, 16): "BGR;5",
+ (2, 24): "BGR",
+ (2, 32): "BGRA",
+}
+
+
+##
+# Image plugin for Targa files.
+
+
+class TgaImageFile(ImageFile.ImageFile):
+
+ format = "TGA"
+ format_description = "Targa"
+
+ def _open(self):
+
+ # process header
+ s = self.fp.read(18)
+
+ id_len = i8(s[0])
+
+ colormaptype = i8(s[1])
+ imagetype = i8(s[2])
+
+ depth = i8(s[16])
+
+ flags = i8(s[17])
+
+ self._size = i16(s[12:]), i16(s[14:])
+
+ # validate header fields
+ if (
+ colormaptype not in (0, 1)
+ or self.size[0] <= 0
+ or self.size[1] <= 0
+ or depth not in (1, 8, 16, 24, 32)
+ ):
+ raise SyntaxError("not a TGA file")
+
+ # image mode
+ if imagetype in (3, 11):
+ self.mode = "L"
+ if depth == 1:
+ self.mode = "1" # ???
+ elif depth == 16:
+ self.mode = "LA"
+ elif imagetype in (1, 9):
+ self.mode = "P"
+ elif imagetype in (2, 10):
+ self.mode = "RGB"
+ if depth == 32:
+ self.mode = "RGBA"
+ else:
+ raise SyntaxError("unknown TGA mode")
+
+ # orientation
+ orientation = flags & 0x30
+ if orientation == 0x20:
+ orientation = 1
+ elif not orientation:
+ orientation = -1
+ else:
+ raise SyntaxError("unknown TGA orientation")
+
+ self.info["orientation"] = orientation
+
+ if imagetype & 8:
+ self.info["compression"] = "tga_rle"
+
+ if id_len:
+ self.info["id_section"] = self.fp.read(id_len)
+
+ if colormaptype:
+ # read palette
+ start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:])
+ if mapdepth == 16:
+ self.palette = ImagePalette.raw(
+ "BGR;16", b"\0" * 2 * start + self.fp.read(2 * size)
+ )
+ elif mapdepth == 24:
+ self.palette = ImagePalette.raw(
+ "BGR", b"\0" * 3 * start + self.fp.read(3 * size)
+ )
+ elif mapdepth == 32:
+ self.palette = ImagePalette.raw(
+ "BGRA", b"\0" * 4 * start + self.fp.read(4 * size)
+ )
+
+ # setup tile descriptor
+ try:
+ rawmode = MODES[(imagetype & 7, depth)]
+ if imagetype & 8:
+ # compressed
+ self.tile = [
+ (
+ "tga_rle",
+ (0, 0) + self.size,
+ self.fp.tell(),
+ (rawmode, orientation, depth),
+ )
+ ]
+ else:
+ self.tile = [
+ (
+ "raw",
+ (0, 0) + self.size,
+ self.fp.tell(),
+ (rawmode, 0, orientation),
+ )
+ ]
+ except KeyError:
+ pass # cannot decode
+
+
+#
+# --------------------------------------------------------------------
+# Write TGA file
+
+
+SAVE = {
+ "1": ("1", 1, 0, 3),
+ "L": ("L", 8, 0, 3),
+ "LA": ("LA", 16, 0, 3),
+ "P": ("P", 8, 1, 1),
+ "RGB": ("BGR", 24, 0, 2),
+ "RGBA": ("BGRA", 32, 0, 2),
+}
+
+
+def _save(im, fp, filename):
+
+ try:
+ rawmode, bits, colormaptype, imagetype = SAVE[im.mode]
+ except KeyError:
+ raise OSError("cannot write mode %s as TGA" % im.mode)
+
+ if "rle" in im.encoderinfo:
+ rle = im.encoderinfo["rle"]
+ else:
+ compression = im.encoderinfo.get("compression", im.info.get("compression"))
+ rle = compression == "tga_rle"
+ if rle:
+ imagetype += 8
+
+ id_section = im.encoderinfo.get("id_section", im.info.get("id_section", ""))
+ id_len = len(id_section)
+ if id_len > 255:
+ id_len = 255
+ id_section = id_section[:255]
+ warnings.warn("id_section has been trimmed to 255 characters")
+
+ if colormaptype:
+ colormapfirst, colormaplength, colormapentry = 0, 256, 24
+ else:
+ colormapfirst, colormaplength, colormapentry = 0, 0, 0
+
+ if im.mode in ("LA", "RGBA"):
+ flags = 8
+ else:
+ flags = 0
+
+ orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1))
+ if orientation > 0:
+ flags = flags | 0x20
+
+ fp.write(
+ o8(id_len)
+ + o8(colormaptype)
+ + o8(imagetype)
+ + o16(colormapfirst)
+ + o16(colormaplength)
+ + o8(colormapentry)
+ + o16(0)
+ + o16(0)
+ + o16(im.size[0])
+ + o16(im.size[1])
+ + o8(bits)
+ + o8(flags)
+ )
+
+ if id_section:
+ fp.write(id_section)
+
+ if colormaptype:
+ fp.write(im.im.getpalette("RGB", "BGR"))
+
+ if rle:
+ ImageFile._save(
+ im, fp, [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))]
+ )
+ else:
+ ImageFile._save(
+ im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))]
+ )
+
+ # write targa version 2 footer
+ fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000")
+
+
+#
+# --------------------------------------------------------------------
+# Registry
+
+
+Image.register_open(TgaImageFile.format, TgaImageFile)
+Image.register_save(TgaImageFile.format, _save)
+
+Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"])
+
+Image.register_mime(TgaImageFile.format, "image/x-tga")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/TiffImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/TiffImagePlugin.py
new file mode 100644
index 0000000..74fb695
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/TiffImagePlugin.py
@@ -0,0 +1,1916 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# TIFF file handling
+#
+# TIFF is a flexible, if somewhat aged, image file format originally
+# defined by Aldus. Although TIFF supports a wide variety of pixel
+# layouts and compression methods, the name doesn't really stand for
+# "thousands of incompatible file formats," it just feels that way.
+#
+# To read TIFF data from a stream, the stream must be seekable. For
+# progressive decoding, make sure to use TIFF files where the tag
+# directory is placed first in the file.
+#
+# History:
+# 1995-09-01 fl Created
+# 1996-05-04 fl Handle JPEGTABLES tag
+# 1996-05-18 fl Fixed COLORMAP support
+# 1997-01-05 fl Fixed PREDICTOR support
+# 1997-08-27 fl Added support for rational tags (from Perry Stoll)
+# 1998-01-10 fl Fixed seek/tell (from Jan Blom)
+# 1998-07-15 fl Use private names for internal variables
+# 1999-06-13 fl Rewritten for PIL 1.0 (1.0)
+# 2000-10-11 fl Additional fixes for Python 2.0 (1.1)
+# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2)
+# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3)
+# 2001-12-18 fl Added workaround for broken Matrox library
+# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart)
+# 2003-05-19 fl Check FILLORDER tag
+# 2003-09-26 fl Added RGBa support
+# 2004-02-24 fl Added DPI support; fixed rational write support
+# 2005-02-07 fl Added workaround for broken Corel Draw 10 files
+# 2006-01-09 fl Added support for float/double tags (from Russell Nelson)
+#
+# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved.
+# Copyright (c) 1995-1997 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+import io
+import itertools
+import os
+import struct
+import warnings
+from collections.abc import MutableMapping
+from fractions import Fraction
+from numbers import Number, Rational
+
+from . import Image, ImageFile, ImagePalette, TiffTags
+from ._binary import i8, o8
+from .TiffTags import TYPES
+
+DEBUG = False # Needs to be merged with the new logging approach.
+
+# Set these to true to force use of libtiff for reading or writing.
+READ_LIBTIFF = False
+WRITE_LIBTIFF = False
+IFD_LEGACY_API = True
+
+II = b"II" # little-endian (Intel style)
+MM = b"MM" # big-endian (Motorola style)
+
+#
+# --------------------------------------------------------------------
+# Read TIFF files
+
+# a few tag names, just to make the code below a bit more readable
+IMAGEWIDTH = 256
+IMAGELENGTH = 257
+BITSPERSAMPLE = 258
+COMPRESSION = 259
+PHOTOMETRIC_INTERPRETATION = 262
+FILLORDER = 266
+IMAGEDESCRIPTION = 270
+STRIPOFFSETS = 273
+SAMPLESPERPIXEL = 277
+ROWSPERSTRIP = 278
+STRIPBYTECOUNTS = 279
+X_RESOLUTION = 282
+Y_RESOLUTION = 283
+PLANAR_CONFIGURATION = 284
+RESOLUTION_UNIT = 296
+TRANSFERFUNCTION = 301
+SOFTWARE = 305
+DATE_TIME = 306
+ARTIST = 315
+PREDICTOR = 317
+COLORMAP = 320
+TILEOFFSETS = 324
+EXTRASAMPLES = 338
+SAMPLEFORMAT = 339
+JPEGTABLES = 347
+REFERENCEBLACKWHITE = 532
+COPYRIGHT = 33432
+IPTC_NAA_CHUNK = 33723 # newsphoto properties
+PHOTOSHOP_CHUNK = 34377 # photoshop properties
+ICCPROFILE = 34675
+EXIFIFD = 34665
+XMP = 700
+JPEGQUALITY = 65537 # pseudo-tag by libtiff
+
+# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java
+IMAGEJ_META_DATA_BYTE_COUNTS = 50838
+IMAGEJ_META_DATA = 50839
+
+COMPRESSION_INFO = {
+ # Compression => pil compression name
+ 1: "raw",
+ 2: "tiff_ccitt",
+ 3: "group3",
+ 4: "group4",
+ 5: "tiff_lzw",
+ 6: "tiff_jpeg", # obsolete
+ 7: "jpeg",
+ 8: "tiff_adobe_deflate",
+ 32771: "tiff_raw_16", # 16-bit padding
+ 32773: "packbits",
+ 32809: "tiff_thunderscan",
+ 32946: "tiff_deflate",
+ 34676: "tiff_sgilog",
+ 34677: "tiff_sgilog24",
+ 34925: "lzma",
+ 50000: "zstd",
+ 50001: "webp",
+}
+
+COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()}
+
+OPEN_INFO = {
+ # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample,
+ # ExtraSamples) => mode, rawmode
+ (II, 0, (1,), 1, (1,), ()): ("1", "1;I"),
+ (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"),
+ (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"),
+ (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"),
+ (II, 1, (1,), 1, (1,), ()): ("1", "1"),
+ (MM, 1, (1,), 1, (1,), ()): ("1", "1"),
+ (II, 1, (1,), 2, (1,), ()): ("1", "1;R"),
+ (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"),
+ (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"),
+ (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"),
+ (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"),
+ (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"),
+ (II, 1, (1,), 1, (2,), ()): ("L", "L;2"),
+ (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"),
+ (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"),
+ (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"),
+ (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"),
+ (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"),
+ (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"),
+ (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"),
+ (II, 1, (1,), 1, (4,), ()): ("L", "L;4"),
+ (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"),
+ (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"),
+ (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"),
+ (II, 0, (1,), 1, (8,), ()): ("L", "L;I"),
+ (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"),
+ (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"),
+ (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"),
+ (II, 1, (1,), 1, (8,), ()): ("L", "L"),
+ (MM, 1, (1,), 1, (8,), ()): ("L", "L"),
+ (II, 1, (1,), 2, (8,), ()): ("L", "L;R"),
+ (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"),
+ (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"),
+ (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"),
+ (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"),
+ (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"),
+ (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"),
+ (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"),
+ (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"),
+ (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"),
+ (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"),
+ (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"),
+ (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"),
+ (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"),
+ (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"),
+ (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"),
+ (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"),
+ (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"),
+ (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"),
+ (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"),
+ (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples
+ (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples
+ (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"),
+ (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"),
+ (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"),
+ (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"),
+ (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"),
+ (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"),
+ (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"),
+ (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"),
+ (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"),
+ (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"),
+ (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10
+ (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10
+ (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"),
+ (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"),
+ (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"),
+ (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"),
+ (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16L"),
+ (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16B"),
+ (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"),
+ (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"),
+ (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"),
+ (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"),
+ (II, 3, (1,), 1, (1,), ()): ("P", "P;1"),
+ (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"),
+ (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"),
+ (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"),
+ (II, 3, (1,), 1, (2,), ()): ("P", "P;2"),
+ (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"),
+ (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"),
+ (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"),
+ (II, 3, (1,), 1, (4,), ()): ("P", "P;4"),
+ (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"),
+ (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"),
+ (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"),
+ (II, 3, (1,), 1, (8,), ()): ("P", "P"),
+ (MM, 3, (1,), 1, (8,), ()): ("P", "P"),
+ (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"),
+ (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"),
+ (II, 3, (1,), 2, (8,), ()): ("P", "P;R"),
+ (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"),
+ (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"),
+ (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"),
+ (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"),
+ (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"),
+ (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"),
+ (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"),
+ (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"),
+ # JPEG compressed images handled by LibTiff and auto-converted to RGBX
+ # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel
+ (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"),
+ (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"),
+ (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"),
+ (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"),
+}
+
+PREFIXES = [
+ b"MM\x00\x2A", # Valid TIFF header with big-endian byte order
+ b"II\x2A\x00", # Valid TIFF header with little-endian byte order
+ b"MM\x2A\x00", # Invalid TIFF header, assume big-endian
+ b"II\x00\x2A", # Invalid TIFF header, assume little-endian
+]
+
+
+def _accept(prefix):
+ return prefix[:4] in PREFIXES
+
+
+def _limit_rational(val, max_val):
+ inv = abs(val) > 1
+ n_d = IFDRational(1 / val if inv else val).limit_rational(max_val)
+ return n_d[::-1] if inv else n_d
+
+
+def _limit_signed_rational(val, max_val, min_val):
+ frac = Fraction(val)
+ n_d = frac.numerator, frac.denominator
+
+ if min(n_d) < min_val:
+ n_d = _limit_rational(val, abs(min_val))
+
+ if max(n_d) > max_val:
+ val = Fraction(*n_d)
+ n_d = _limit_rational(val, max_val)
+
+ return n_d
+
+
+##
+# Wrapper for TIFF IFDs.
+
+_load_dispatch = {}
+_write_dispatch = {}
+
+
+class IFDRational(Rational):
+ """ Implements a rational class where 0/0 is a legal value to match
+ the in the wild use of exif rationals.
+
+ e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used
+ """
+
+ """ If the denominator is 0, store this as a float('nan'), otherwise store
+ as a fractions.Fraction(). Delegate as appropriate
+
+ """
+
+ __slots__ = ("_numerator", "_denominator", "_val")
+
+ def __init__(self, value, denominator=1):
+ """
+ :param value: either an integer numerator, a
+ float/rational/other number, or an IFDRational
+ :param denominator: Optional integer denominator
+ """
+ if isinstance(value, IFDRational):
+ self._numerator = value.numerator
+ self._denominator = value.denominator
+ self._val = value._val
+ return
+
+ if isinstance(value, Fraction):
+ self._numerator = value.numerator
+ self._denominator = value.denominator
+ else:
+ self._numerator = value
+ self._denominator = denominator
+
+ if denominator == 0:
+ self._val = float("nan")
+ elif denominator == 1:
+ self._val = Fraction(value)
+ else:
+ self._val = Fraction(value, denominator)
+
+ @property
+ def numerator(a):
+ return a._numerator
+
+ @property
+ def denominator(a):
+ return a._denominator
+
+ def limit_rational(self, max_denominator):
+ """
+
+ :param max_denominator: Integer, the maximum denominator value
+ :returns: Tuple of (numerator, denominator)
+ """
+
+ if self.denominator == 0:
+ return (self.numerator, self.denominator)
+
+ f = self._val.limit_denominator(max_denominator)
+ return (f.numerator, f.denominator)
+
+ def __repr__(self):
+ return str(float(self._val))
+
+ def __hash__(self):
+ return self._val.__hash__()
+
+ def __eq__(self, other):
+ return self._val == other
+
+ def _delegate(op):
+ def delegate(self, *args):
+ return getattr(self._val, op)(*args)
+
+ return delegate
+
+ """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul',
+ 'truediv', 'rtruediv', 'floordiv', 'rfloordiv',
+ 'mod','rmod', 'pow','rpow', 'pos', 'neg',
+ 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool',
+ 'ceil', 'floor', 'round']
+ print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a))
+ """
+
+ __add__ = _delegate("__add__")
+ __radd__ = _delegate("__radd__")
+ __sub__ = _delegate("__sub__")
+ __rsub__ = _delegate("__rsub__")
+ __mul__ = _delegate("__mul__")
+ __rmul__ = _delegate("__rmul__")
+ __truediv__ = _delegate("__truediv__")
+ __rtruediv__ = _delegate("__rtruediv__")
+ __floordiv__ = _delegate("__floordiv__")
+ __rfloordiv__ = _delegate("__rfloordiv__")
+ __mod__ = _delegate("__mod__")
+ __rmod__ = _delegate("__rmod__")
+ __pow__ = _delegate("__pow__")
+ __rpow__ = _delegate("__rpow__")
+ __pos__ = _delegate("__pos__")
+ __neg__ = _delegate("__neg__")
+ __abs__ = _delegate("__abs__")
+ __trunc__ = _delegate("__trunc__")
+ __lt__ = _delegate("__lt__")
+ __gt__ = _delegate("__gt__")
+ __le__ = _delegate("__le__")
+ __ge__ = _delegate("__ge__")
+ __bool__ = _delegate("__bool__")
+ __ceil__ = _delegate("__ceil__")
+ __floor__ = _delegate("__floor__")
+ __round__ = _delegate("__round__")
+
+
+class ImageFileDirectory_v2(MutableMapping):
+ """This class represents a TIFF tag directory. To speed things up, we
+ don't decode tags unless they're asked for.
+
+ Exposes a dictionary interface of the tags in the directory::
+
+ ifd = ImageFileDirectory_v2()
+ ifd[key] = 'Some Data'
+ ifd.tagtype[key] = TiffTags.ASCII
+ print(ifd[key])
+ 'Some Data'
+
+ Individual values are returned as the strings or numbers, sequences are
+ returned as tuples of the values.
+
+ The tiff metadata type of each item is stored in a dictionary of
+ tag types in
+ `~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
+ are read from a tiff file, guessed from the type added, or added
+ manually.
+
+ Data Structures:
+
+ * self.tagtype = {}
+
+ * Key: numerical tiff tag number
+ * Value: integer corresponding to the data type from
+ ~PIL.TiffTags.TYPES`
+
+ .. versionadded:: 3.0.0
+ """
+
+ """
+ Documentation:
+
+ 'internal' data structures:
+ * self._tags_v2 = {} Key: numerical tiff tag number
+ Value: decoded data, as tuple for multiple values
+ * self._tagdata = {} Key: numerical tiff tag number
+ Value: undecoded byte string from file
+ * self._tags_v1 = {} Key: numerical tiff tag number
+ Value: decoded data in the v1 format
+
+ Tags will be found in the private attributes self._tagdata, and in
+ self._tags_v2 once decoded.
+
+ Self.legacy_api is a value for internal use, and shouldn't be
+ changed from outside code. In cooperation with the
+ ImageFileDirectory_v1 class, if legacy_api is true, then decoded
+ tags will be populated into both _tags_v1 and _tags_v2. _Tags_v2
+ will be used if this IFD is used in the TIFF save routine. Tags
+ should be read from tags_v1 if legacy_api == true.
+
+ """
+
+ def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None):
+ """Initialize an ImageFileDirectory.
+
+ To construct an ImageFileDirectory from a real file, pass the 8-byte
+ magic header to the constructor. To only set the endianness, pass it
+ as the 'prefix' keyword argument.
+
+ :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
+ endianness.
+ :param prefix: Override the endianness of the file.
+ """
+ if ifh[:4] not in PREFIXES:
+ raise SyntaxError("not a TIFF file (header %r not valid)" % ifh)
+ self._prefix = prefix if prefix is not None else ifh[:2]
+ if self._prefix == MM:
+ self._endian = ">"
+ elif self._prefix == II:
+ self._endian = "<"
+ else:
+ raise SyntaxError("not a TIFF IFD")
+ self.reset()
+ (self.next,) = self._unpack("L", ifh[4:])
+ self._legacy_api = False
+
+ prefix = property(lambda self: self._prefix)
+ offset = property(lambda self: self._offset)
+ legacy_api = property(lambda self: self._legacy_api)
+
+ @legacy_api.setter
+ def legacy_api(self, value):
+ raise Exception("Not allowing setting of legacy api")
+
+ def reset(self):
+ self._tags_v1 = {} # will remain empty if legacy_api is false
+ self._tags_v2 = {} # main tag storage
+ self._tagdata = {}
+ self.tagtype = {} # added 2008-06-05 by Florian Hoech
+ self._next = None
+ self._offset = None
+
+ def __str__(self):
+ return str(dict(self))
+
+ def named(self):
+ """
+ :returns: dict of name|key: value
+
+ Returns the complete tag dictionary, with named tags where possible.
+ """
+ return {TiffTags.lookup(code).name: value for code, value in self.items()}
+
+ def __len__(self):
+ return len(set(self._tagdata) | set(self._tags_v2))
+
+ def __getitem__(self, tag):
+ if tag not in self._tags_v2: # unpack on the fly
+ data = self._tagdata[tag]
+ typ = self.tagtype[tag]
+ size, handler = self._load_dispatch[typ]
+ self[tag] = handler(self, data, self.legacy_api) # check type
+ val = self._tags_v2[tag]
+ if self.legacy_api and not isinstance(val, (tuple, bytes)):
+ val = (val,)
+ return val
+
+ def __contains__(self, tag):
+ return tag in self._tags_v2 or tag in self._tagdata
+
+ def __setitem__(self, tag, value):
+ self._setitem(tag, value, self.legacy_api)
+
+ def _setitem(self, tag, value, legacy_api):
+ basetypes = (Number, bytes, str)
+
+ info = TiffTags.lookup(tag)
+ values = [value] if isinstance(value, basetypes) else value
+
+ if tag not in self.tagtype:
+ if info.type:
+ self.tagtype[tag] = info.type
+ else:
+ self.tagtype[tag] = TiffTags.UNDEFINED
+ if all(isinstance(v, IFDRational) for v in values):
+ self.tagtype[tag] = (
+ TiffTags.RATIONAL
+ if all(v >= 0 for v in values)
+ else TiffTags.SIGNED_RATIONAL
+ )
+ elif all(isinstance(v, int) for v in values):
+ if all(0 <= v < 2 ** 16 for v in values):
+ self.tagtype[tag] = TiffTags.SHORT
+ elif all(-(2 ** 15) < v < 2 ** 15 for v in values):
+ self.tagtype[tag] = TiffTags.SIGNED_SHORT
+ else:
+ self.tagtype[tag] = (
+ TiffTags.LONG
+ if all(v >= 0 for v in values)
+ else TiffTags.SIGNED_LONG
+ )
+ elif all(isinstance(v, float) for v in values):
+ self.tagtype[tag] = TiffTags.DOUBLE
+ else:
+ if all(isinstance(v, str) for v in values):
+ self.tagtype[tag] = TiffTags.ASCII
+
+ if self.tagtype[tag] == TiffTags.UNDEFINED:
+ values = [
+ value.encode("ascii", "replace") if isinstance(value, str) else value
+ ]
+ elif self.tagtype[tag] == TiffTags.RATIONAL:
+ values = [float(v) if isinstance(v, int) else v for v in values]
+
+ values = tuple(info.cvt_enum(value) for value in values)
+
+ dest = self._tags_v1 if legacy_api else self._tags_v2
+
+ # Three branches:
+ # Spec'd length == 1, Actual length 1, store as element
+ # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed.
+ # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple.
+ # Don't mess with the legacy api, since it's frozen.
+ if (info.length == 1) or (
+ info.length is None and len(values) == 1 and not legacy_api
+ ):
+ # Don't mess with the legacy api, since it's frozen.
+ if legacy_api and self.tagtype[tag] in [
+ TiffTags.RATIONAL,
+ TiffTags.SIGNED_RATIONAL,
+ ]: # rationals
+ values = (values,)
+ try:
+ (dest[tag],) = values
+ except ValueError:
+ # We've got a builtin tag with 1 expected entry
+ warnings.warn(
+ "Metadata Warning, tag %s had too many entries: %s, expected 1"
+ % (tag, len(values))
+ )
+ dest[tag] = values[0]
+
+ else:
+ # Spec'd length > 1 or undefined
+ # Unspec'd, and length > 1
+ dest[tag] = values
+
+ def __delitem__(self, tag):
+ self._tags_v2.pop(tag, None)
+ self._tags_v1.pop(tag, None)
+ self._tagdata.pop(tag, None)
+
+ def __iter__(self):
+ return iter(set(self._tagdata) | set(self._tags_v2))
+
+ def _unpack(self, fmt, data):
+ return struct.unpack(self._endian + fmt, data)
+
+ def _pack(self, fmt, *values):
+ return struct.pack(self._endian + fmt, *values)
+
+ def _register_loader(idx, size):
+ def decorator(func):
+ from .TiffTags import TYPES
+
+ if func.__name__.startswith("load_"):
+ TYPES[idx] = func.__name__[5:].replace("_", " ")
+ _load_dispatch[idx] = size, func # noqa: F821
+ return func
+
+ return decorator
+
+ def _register_writer(idx):
+ def decorator(func):
+ _write_dispatch[idx] = func # noqa: F821
+ return func
+
+ return decorator
+
+ def _register_basic(idx_fmt_name):
+ from .TiffTags import TYPES
+
+ idx, fmt, name = idx_fmt_name
+ TYPES[idx] = name
+ size = struct.calcsize("=" + fmt)
+ _load_dispatch[idx] = ( # noqa: F821
+ size,
+ lambda self, data, legacy_api=True: (
+ self._unpack("{}{}".format(len(data) // size, fmt), data)
+ ),
+ )
+ _write_dispatch[idx] = lambda self, *values: ( # noqa: F821
+ b"".join(self._pack(fmt, value) for value in values)
+ )
+
+ list(
+ map(
+ _register_basic,
+ [
+ (TiffTags.SHORT, "H", "short"),
+ (TiffTags.LONG, "L", "long"),
+ (TiffTags.SIGNED_BYTE, "b", "signed byte"),
+ (TiffTags.SIGNED_SHORT, "h", "signed short"),
+ (TiffTags.SIGNED_LONG, "l", "signed long"),
+ (TiffTags.FLOAT, "f", "float"),
+ (TiffTags.DOUBLE, "d", "double"),
+ ],
+ )
+ )
+
+ @_register_loader(1, 1) # Basic type, except for the legacy API.
+ def load_byte(self, data, legacy_api=True):
+ return data
+
+ @_register_writer(1) # Basic type, except for the legacy API.
+ def write_byte(self, data):
+ return data
+
+ @_register_loader(2, 1)
+ def load_string(self, data, legacy_api=True):
+ if data.endswith(b"\0"):
+ data = data[:-1]
+ return data.decode("latin-1", "replace")
+
+ @_register_writer(2)
+ def write_string(self, value):
+ # remerge of https://github.com/python-pillow/Pillow/pull/1416
+ return b"" + value.encode("ascii", "replace") + b"\0"
+
+ @_register_loader(5, 8)
+ def load_rational(self, data, legacy_api=True):
+ vals = self._unpack("{}L".format(len(data) // 4), data)
+
+ def combine(a, b):
+ return (a, b) if legacy_api else IFDRational(a, b)
+
+ return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2]))
+
+ @_register_writer(5)
+ def write_rational(self, *values):
+ return b"".join(
+ self._pack("2L", *_limit_rational(frac, 2 ** 32 - 1)) for frac in values
+ )
+
+ @_register_loader(7, 1)
+ def load_undefined(self, data, legacy_api=True):
+ return data
+
+ @_register_writer(7)
+ def write_undefined(self, value):
+ return value
+
+ @_register_loader(10, 8)
+ def load_signed_rational(self, data, legacy_api=True):
+ vals = self._unpack("{}l".format(len(data) // 4), data)
+
+ def combine(a, b):
+ return (a, b) if legacy_api else IFDRational(a, b)
+
+ return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2]))
+
+ @_register_writer(10)
+ def write_signed_rational(self, *values):
+ return b"".join(
+ self._pack("2l", *_limit_signed_rational(frac, 2 ** 31 - 1, -(2 ** 31)))
+ for frac in values
+ )
+
+ def _ensure_read(self, fp, size):
+ ret = fp.read(size)
+ if len(ret) != size:
+ raise OSError(
+ "Corrupt EXIF data. "
+ + "Expecting to read %d bytes but only got %d. " % (size, len(ret))
+ )
+ return ret
+
+ def load(self, fp):
+
+ self.reset()
+ self._offset = fp.tell()
+
+ try:
+ for i in range(self._unpack("H", self._ensure_read(fp, 2))[0]):
+ tag, typ, count, data = self._unpack("HHL4s", self._ensure_read(fp, 12))
+ if DEBUG:
+ tagname = TiffTags.lookup(tag).name
+ typname = TYPES.get(typ, "unknown")
+ print(
+ "tag: %s (%d) - type: %s (%d)" % (tagname, tag, typname, typ),
+ end=" ",
+ )
+
+ try:
+ unit_size, handler = self._load_dispatch[typ]
+ except KeyError:
+ if DEBUG:
+ print("- unsupported type", typ)
+ continue # ignore unsupported type
+ size = count * unit_size
+ if size > 4:
+ here = fp.tell()
+ (offset,) = self._unpack("L", data)
+ if DEBUG:
+ print(
+ "Tag Location: {} - Data Location: {}".format(here, offset),
+ end=" ",
+ )
+ fp.seek(offset)
+ data = ImageFile._safe_read(fp, size)
+ fp.seek(here)
+ else:
+ data = data[:size]
+
+ if len(data) != size:
+ warnings.warn(
+ "Possibly corrupt EXIF data. "
+ "Expecting to read %d bytes but only got %d."
+ " Skipping tag %s" % (size, len(data), tag)
+ )
+ continue
+
+ if not data:
+ continue
+
+ self._tagdata[tag] = data
+ self.tagtype[tag] = typ
+
+ if DEBUG:
+ if size > 32:
+ print("- value: " % size)
+ else:
+ print("- value:", self[tag])
+
+ (self.next,) = self._unpack("L", self._ensure_read(fp, 4))
+ except OSError as msg:
+ warnings.warn(str(msg))
+ return
+
+ def tobytes(self, offset=0):
+ # FIXME What about tagdata?
+ result = self._pack("H", len(self._tags_v2))
+
+ entries = []
+ offset = offset + len(result) + len(self._tags_v2) * 12 + 4
+ stripoffsets = None
+
+ # pass 1: convert tags to binary format
+ # always write tags in ascending order
+ for tag, value in sorted(self._tags_v2.items()):
+ if tag == STRIPOFFSETS:
+ stripoffsets = len(entries)
+ typ = self.tagtype.get(tag)
+ if DEBUG:
+ print("Tag {}, Type: {}, Value: {}".format(tag, typ, value))
+ values = value if isinstance(value, tuple) else (value,)
+ data = self._write_dispatch[typ](self, *values)
+ if DEBUG:
+ tagname = TiffTags.lookup(tag).name
+ typname = TYPES.get(typ, "unknown")
+ print(
+ "save: %s (%d) - type: %s (%d)" % (tagname, tag, typname, typ),
+ end=" ",
+ )
+ if len(data) >= 16:
+ print("- value: " % len(data))
+ else:
+ print("- value:", values)
+
+ # count is sum of lengths for string and arbitrary data
+ if typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]:
+ count = len(data)
+ else:
+ count = len(values)
+ # figure out if data fits into the entry
+ if len(data) <= 4:
+ entries.append((tag, typ, count, data.ljust(4, b"\0"), b""))
+ else:
+ entries.append((tag, typ, count, self._pack("L", offset), data))
+ offset += (len(data) + 1) // 2 * 2 # pad to word
+
+ # update strip offset data to point beyond auxiliary data
+ if stripoffsets is not None:
+ tag, typ, count, value, data = entries[stripoffsets]
+ if data:
+ raise NotImplementedError("multistrip support not yet implemented")
+ value = self._pack("L", self._unpack("L", value)[0] + offset)
+ entries[stripoffsets] = tag, typ, count, value, data
+
+ # pass 2: write entries to file
+ for tag, typ, count, value, data in entries:
+ if DEBUG:
+ print(tag, typ, count, repr(value), repr(data))
+ result += self._pack("HHL4s", tag, typ, count, value)
+
+ # -- overwrite here for multi-page --
+ result += b"\0\0\0\0" # end of entries
+
+ # pass 3: write auxiliary data to file
+ for tag, typ, count, value, data in entries:
+ result += data
+ if len(data) & 1:
+ result += b"\0"
+
+ return result
+
+ def save(self, fp):
+
+ if fp.tell() == 0: # skip TIFF header on subsequent pages
+ # tiff header -- PIL always starts the first IFD at offset 8
+ fp.write(self._prefix + self._pack("HL", 42, 8))
+
+ offset = fp.tell()
+ result = self.tobytes(offset)
+ fp.write(result)
+ return offset + len(result)
+
+
+ImageFileDirectory_v2._load_dispatch = _load_dispatch
+ImageFileDirectory_v2._write_dispatch = _write_dispatch
+for idx, name in TYPES.items():
+ name = name.replace(" ", "_")
+ setattr(ImageFileDirectory_v2, "load_" + name, _load_dispatch[idx][1])
+ setattr(ImageFileDirectory_v2, "write_" + name, _write_dispatch[idx])
+del _load_dispatch, _write_dispatch, idx, name
+
+
+# Legacy ImageFileDirectory support.
+class ImageFileDirectory_v1(ImageFileDirectory_v2):
+ """This class represents the **legacy** interface to a TIFF tag directory.
+
+ Exposes a dictionary interface of the tags in the directory::
+
+ ifd = ImageFileDirectory_v1()
+ ifd[key] = 'Some Data'
+ ifd.tagtype[key] = TiffTags.ASCII
+ print(ifd[key])
+ ('Some Data',)
+
+ Also contains a dictionary of tag types as read from the tiff image file,
+ `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.
+
+ Values are returned as a tuple.
+
+ .. deprecated:: 3.0.0
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self._legacy_api = True
+
+ tags = property(lambda self: self._tags_v1)
+ tagdata = property(lambda self: self._tagdata)
+
+ @classmethod
+ def from_v2(cls, original):
+ """ Returns an
+ :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
+ instance with the same data as is contained in the original
+ :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
+ instance.
+
+ :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
+
+ """
+
+ ifd = cls(prefix=original.prefix)
+ ifd._tagdata = original._tagdata
+ ifd.tagtype = original.tagtype
+ ifd.next = original.next # an indicator for multipage tiffs
+ return ifd
+
+ def to_v2(self):
+ """ Returns an
+ :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
+ instance with the same data as is contained in the original
+ :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
+ instance.
+
+ :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
+
+ """
+
+ ifd = ImageFileDirectory_v2(prefix=self.prefix)
+ ifd._tagdata = dict(self._tagdata)
+ ifd.tagtype = dict(self.tagtype)
+ ifd._tags_v2 = dict(self._tags_v2)
+ return ifd
+
+ def __contains__(self, tag):
+ return tag in self._tags_v1 or tag in self._tagdata
+
+ def __len__(self):
+ return len(set(self._tagdata) | set(self._tags_v1))
+
+ def __iter__(self):
+ return iter(set(self._tagdata) | set(self._tags_v1))
+
+ def __setitem__(self, tag, value):
+ for legacy_api in (False, True):
+ self._setitem(tag, value, legacy_api)
+
+ def __getitem__(self, tag):
+ if tag not in self._tags_v1: # unpack on the fly
+ data = self._tagdata[tag]
+ typ = self.tagtype[tag]
+ size, handler = self._load_dispatch[typ]
+ for legacy in (False, True):
+ self._setitem(tag, handler(self, data, legacy), legacy)
+ val = self._tags_v1[tag]
+ if not isinstance(val, (tuple, bytes)):
+ val = (val,)
+ return val
+
+
+# undone -- switch this pointer when IFD_LEGACY_API == False
+ImageFileDirectory = ImageFileDirectory_v1
+
+
+##
+# Image plugin for TIFF files.
+
+
+class TiffImageFile(ImageFile.ImageFile):
+
+ format = "TIFF"
+ format_description = "Adobe TIFF"
+ _close_exclusive_fp_after_loading = False
+
+ def _open(self):
+ """Open the first image in a TIFF file"""
+
+ # Header
+ ifh = self.fp.read(8)
+
+ # image file directory (tag dictionary)
+ self.tag_v2 = ImageFileDirectory_v2(ifh)
+
+ # legacy tag/ifd entries will be filled in later
+ self.tag = self.ifd = None
+
+ # setup frame pointers
+ self.__first = self.__next = self.tag_v2.next
+ self.__frame = -1
+ self.__fp = self.fp
+ self._frame_pos = []
+ self._n_frames = None
+
+ if DEBUG:
+ print("*** TiffImageFile._open ***")
+ print("- __first:", self.__first)
+ print("- ifh: ", ifh)
+
+ # and load the first frame
+ self._seek(0)
+
+ @property
+ def n_frames(self):
+ if self._n_frames is None:
+ current = self.tell()
+ self._seek(len(self._frame_pos))
+ while self._n_frames is None:
+ self._seek(self.tell() + 1)
+ self.seek(current)
+ return self._n_frames
+
+ @property
+ def is_animated(self):
+ return self._is_animated
+
+ def seek(self, frame):
+ """Select a given frame as current image"""
+ if not self._seek_check(frame):
+ return
+ self._seek(frame)
+ # Create a new core image object on second and
+ # subsequent frames in the image. Image may be
+ # different size/mode.
+ Image._decompression_bomb_check(self.size)
+ self.im = Image.core.new(self.mode, self.size)
+
+ def _seek(self, frame):
+ self.fp = self.__fp
+ while len(self._frame_pos) <= frame:
+ if not self.__next:
+ raise EOFError("no more images in TIFF file")
+ if DEBUG:
+ print(
+ "Seeking to frame %s, on frame %s, __next %s, location: %s"
+ % (frame, self.__frame, self.__next, self.fp.tell())
+ )
+ # reset buffered io handle in case fp
+ # was passed to libtiff, invalidating the buffer
+ self.fp.tell()
+ self.fp.seek(self.__next)
+ self._frame_pos.append(self.__next)
+ if DEBUG:
+ print("Loading tags, location: %s" % self.fp.tell())
+ self.tag_v2.load(self.fp)
+ self.__next = self.tag_v2.next
+ if self.__next == 0:
+ self._n_frames = frame + 1
+ if len(self._frame_pos) == 1:
+ self._is_animated = self.__next != 0
+ self.__frame += 1
+ self.fp.seek(self._frame_pos[frame])
+ self.tag_v2.load(self.fp)
+ # fill the legacy tag/ifd entries
+ self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2)
+ self.__frame = frame
+ self._setup()
+
+ def tell(self):
+ """Return the current frame number"""
+ return self.__frame
+
+ def load(self):
+ if self.use_load_libtiff:
+ return self._load_libtiff()
+ return super().load()
+
+ def load_end(self):
+ if self._tile_orientation:
+ method = {
+ 2: Image.FLIP_LEFT_RIGHT,
+ 3: Image.ROTATE_180,
+ 4: Image.FLIP_TOP_BOTTOM,
+ 5: Image.TRANSPOSE,
+ 6: Image.ROTATE_270,
+ 7: Image.TRANSVERSE,
+ 8: Image.ROTATE_90,
+ }.get(self._tile_orientation)
+ if method is not None:
+ self.im = self.im.transpose(method)
+ self._size = self.im.size
+
+ # allow closing if we're on the first frame, there's no next
+ # This is the ImageFile.load path only, libtiff specific below.
+ if not self._is_animated:
+ self._close_exclusive_fp_after_loading = True
+
+ def _load_libtiff(self):
+ """ Overload method triggered when we detect a compressed tiff
+ Calls out to libtiff """
+
+ pixel = Image.Image.load(self)
+
+ if self.tile is None:
+ raise OSError("cannot load this image")
+ if not self.tile:
+ return pixel
+
+ self.load_prepare()
+
+ if not len(self.tile) == 1:
+ raise OSError("Not exactly one tile")
+
+ # (self._compression, (extents tuple),
+ # 0, (rawmode, self._compression, fp))
+ extents = self.tile[0][1]
+ args = list(self.tile[0][3])
+
+ # To be nice on memory footprint, if there's a
+ # file descriptor, use that instead of reading
+ # into a string in python.
+ # libtiff closes the file descriptor, so pass in a dup.
+ try:
+ fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno())
+ # flush the file descriptor, prevents error on pypy 2.4+
+ # should also eliminate the need for fp.tell
+ # in _seek
+ if hasattr(self.fp, "flush"):
+ self.fp.flush()
+ except OSError:
+ # io.BytesIO have a fileno, but returns an IOError if
+ # it doesn't use a file descriptor.
+ fp = False
+
+ if fp:
+ args[2] = fp
+
+ decoder = Image._getdecoder(
+ self.mode, "libtiff", tuple(args), self.decoderconfig
+ )
+ try:
+ decoder.setimage(self.im, extents)
+ except ValueError:
+ raise OSError("Couldn't set the image")
+
+ close_self_fp = self._exclusive_fp and not self._is_animated
+ if hasattr(self.fp, "getvalue"):
+ # We've got a stringio like thing passed in. Yay for all in memory.
+ # The decoder needs the entire file in one shot, so there's not
+ # a lot we can do here other than give it the entire file.
+ # unless we could do something like get the address of the
+ # underlying string for stringio.
+ #
+ # Rearranging for supporting byteio items, since they have a fileno
+ # that returns an IOError if there's no underlying fp. Easier to
+ # deal with here by reordering.
+ if DEBUG:
+ print("have getvalue. just sending in a string from getvalue")
+ n, err = decoder.decode(self.fp.getvalue())
+ elif fp:
+ # we've got a actual file on disk, pass in the fp.
+ if DEBUG:
+ print("have fileno, calling fileno version of the decoder.")
+ if not close_self_fp:
+ self.fp.seek(0)
+ # 4 bytes, otherwise the trace might error out
+ n, err = decoder.decode(b"fpfp")
+ else:
+ # we have something else.
+ if DEBUG:
+ print("don't have fileno or getvalue. just reading")
+ self.fp.seek(0)
+ # UNDONE -- so much for that buffer size thing.
+ n, err = decoder.decode(self.fp.read())
+
+ self.tile = []
+ self.readonly = 0
+
+ self.load_end()
+
+ # libtiff closed the fp in a, we need to close self.fp, if possible
+ if close_self_fp:
+ self.fp.close()
+ self.fp = None # might be shared
+
+ if err < 0:
+ raise OSError(err)
+
+ return Image.Image.load(self)
+
+ def _setup(self):
+ """Setup this image object based on current tags"""
+
+ if 0xBC01 in self.tag_v2:
+ raise OSError("Windows Media Photo files not yet supported")
+
+ # extract relevant tags
+ self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)]
+ self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1)
+
+ # photometric is a required tag, but not everyone is reading
+ # the specification
+ photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0)
+
+ # old style jpeg compression images most certainly are YCbCr
+ if self._compression == "tiff_jpeg":
+ photo = 6
+
+ fillorder = self.tag_v2.get(FILLORDER, 1)
+
+ if DEBUG:
+ print("*** Summary ***")
+ print("- compression:", self._compression)
+ print("- photometric_interpretation:", photo)
+ print("- planar_configuration:", self._planar_configuration)
+ print("- fill_order:", fillorder)
+ print("- YCbCr subsampling:", self.tag.get(530))
+
+ # size
+ xsize = int(self.tag_v2.get(IMAGEWIDTH))
+ ysize = int(self.tag_v2.get(IMAGELENGTH))
+ self._size = xsize, ysize
+
+ if DEBUG:
+ print("- size:", self.size)
+
+ sampleFormat = self.tag_v2.get(SAMPLEFORMAT, (1,))
+ if len(sampleFormat) > 1 and max(sampleFormat) == min(sampleFormat) == 1:
+ # SAMPLEFORMAT is properly per band, so an RGB image will
+ # be (1,1,1). But, we don't support per band pixel types,
+ # and anything more than one band is a uint8. So, just
+ # take the first element. Revisit this if adding support
+ # for more exotic images.
+ sampleFormat = (1,)
+
+ bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,))
+ extra_tuple = self.tag_v2.get(EXTRASAMPLES, ())
+ if photo in (2, 6, 8): # RGB, YCbCr, LAB
+ bps_count = 3
+ elif photo == 5: # CMYK
+ bps_count = 4
+ else:
+ bps_count = 1
+ bps_count += len(extra_tuple)
+ # Some files have only one value in bps_tuple,
+ # while should have more. Fix it
+ if bps_count > len(bps_tuple) and len(bps_tuple) == 1:
+ bps_tuple = bps_tuple * bps_count
+
+ # mode: check photometric interpretation and bits per pixel
+ key = (
+ self.tag_v2.prefix,
+ photo,
+ sampleFormat,
+ fillorder,
+ bps_tuple,
+ extra_tuple,
+ )
+ if DEBUG:
+ print("format key:", key)
+ try:
+ self.mode, rawmode = OPEN_INFO[key]
+ except KeyError:
+ if DEBUG:
+ print("- unsupported format")
+ raise SyntaxError("unknown pixel mode")
+
+ if DEBUG:
+ print("- raw mode:", rawmode)
+ print("- pil mode:", self.mode)
+
+ self.info["compression"] = self._compression
+
+ xres = self.tag_v2.get(X_RESOLUTION, 1)
+ yres = self.tag_v2.get(Y_RESOLUTION, 1)
+
+ if xres and yres:
+ resunit = self.tag_v2.get(RESOLUTION_UNIT)
+ if resunit == 2: # dots per inch
+ self.info["dpi"] = int(xres + 0.5), int(yres + 0.5)
+ elif resunit == 3: # dots per centimeter. convert to dpi
+ self.info["dpi"] = int(xres * 2.54 + 0.5), int(yres * 2.54 + 0.5)
+ elif resunit is None: # used to default to 1, but now 2)
+ self.info["dpi"] = int(xres + 0.5), int(yres + 0.5)
+ # For backward compatibility,
+ # we also preserve the old behavior
+ self.info["resolution"] = xres, yres
+ else: # No absolute unit of measurement
+ self.info["resolution"] = xres, yres
+
+ # build tile descriptors
+ x = y = layer = 0
+ self.tile = []
+ self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw"
+ if self.use_load_libtiff:
+ # Decoder expects entire file as one tile.
+ # There's a buffer size limit in load (64k)
+ # so large g4 images will fail if we use that
+ # function.
+ #
+ # Setup the one tile for the whole image, then
+ # use the _load_libtiff function.
+
+ # libtiff handles the fillmode for us, so 1;IR should
+ # actually be 1;I. Including the R double reverses the
+ # bits, so stripes of the image are reversed. See
+ # https://github.com/python-pillow/Pillow/issues/279
+ if fillorder == 2:
+ # Replace fillorder with fillorder=1
+ key = key[:3] + (1,) + key[4:]
+ if DEBUG:
+ print("format key:", key)
+ # this should always work, since all the
+ # fillorder==2 modes have a corresponding
+ # fillorder=1 mode
+ self.mode, rawmode = OPEN_INFO[key]
+ # libtiff always returns the bytes in native order.
+ # we're expecting image byte order. So, if the rawmode
+ # contains I;16, we need to convert from native to image
+ # byte order.
+ if rawmode == "I;16":
+ rawmode = "I;16N"
+ if ";16B" in rawmode:
+ rawmode = rawmode.replace(";16B", ";16N")
+ if ";16L" in rawmode:
+ rawmode = rawmode.replace(";16L", ";16N")
+
+ # Offset in the tile tuple is 0, we go from 0,0 to
+ # w,h, and we only do this once -- eds
+ a = (rawmode, self._compression, False, self.tag_v2.offset)
+ self.tile.append(("libtiff", (0, 0, xsize, ysize), 0, a))
+
+ elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2:
+ # striped image
+ if STRIPOFFSETS in self.tag_v2:
+ offsets = self.tag_v2[STRIPOFFSETS]
+ h = self.tag_v2.get(ROWSPERSTRIP, ysize)
+ w = self.size[0]
+ else:
+ # tiled image
+ offsets = self.tag_v2[TILEOFFSETS]
+ w = self.tag_v2.get(322)
+ h = self.tag_v2.get(323)
+
+ for offset in offsets:
+ if x + w > xsize:
+ stride = w * sum(bps_tuple) / 8 # bytes per line
+ else:
+ stride = 0
+
+ tile_rawmode = rawmode
+ if self._planar_configuration == 2:
+ # each band on it's own layer
+ tile_rawmode = rawmode[layer]
+ # adjust stride width accordingly
+ stride /= bps_count
+
+ a = (tile_rawmode, int(stride), 1)
+ self.tile.append(
+ (
+ self._compression,
+ (x, y, min(x + w, xsize), min(y + h, ysize)),
+ offset,
+ a,
+ )
+ )
+ x = x + w
+ if x >= self.size[0]:
+ x, y = 0, y + h
+ if y >= self.size[1]:
+ x = y = 0
+ layer += 1
+ else:
+ if DEBUG:
+ print("- unsupported data organization")
+ raise SyntaxError("unknown data organization")
+
+ # Fix up info.
+ if ICCPROFILE in self.tag_v2:
+ self.info["icc_profile"] = self.tag_v2[ICCPROFILE]
+
+ # fixup palette descriptor
+
+ if self.mode in ["P", "PA"]:
+ palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]]
+ self.palette = ImagePalette.raw("RGB;L", b"".join(palette))
+
+ self._tile_orientation = self.tag_v2.get(0x0112)
+
+ def _close__fp(self):
+ try:
+ if self.__fp != self.fp:
+ self.__fp.close()
+ except AttributeError:
+ pass
+ finally:
+ self.__fp = None
+
+
+#
+# --------------------------------------------------------------------
+# Write TIFF files
+
+# little endian is default except for image modes with
+# explicit big endian byte-order
+
+SAVE_INFO = {
+ # mode => rawmode, byteorder, photometrics,
+ # sampleformat, bitspersample, extra
+ "1": ("1", II, 1, 1, (1,), None),
+ "L": ("L", II, 1, 1, (8,), None),
+ "LA": ("LA", II, 1, 1, (8, 8), 2),
+ "P": ("P", II, 3, 1, (8,), None),
+ "PA": ("PA", II, 3, 1, (8, 8), 2),
+ "I": ("I;32S", II, 1, 2, (32,), None),
+ "I;16": ("I;16", II, 1, 1, (16,), None),
+ "I;16S": ("I;16S", II, 1, 2, (16,), None),
+ "F": ("F;32F", II, 1, 3, (32,), None),
+ "RGB": ("RGB", II, 2, 1, (8, 8, 8), None),
+ "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0),
+ "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2),
+ "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None),
+ "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None),
+ "LAB": ("LAB", II, 8, 1, (8, 8, 8), None),
+ "I;32BS": ("I;32BS", MM, 1, 2, (32,), None),
+ "I;16B": ("I;16B", MM, 1, 1, (16,), None),
+ "I;16BS": ("I;16BS", MM, 1, 2, (16,), None),
+ "F;32BF": ("F;32BF", MM, 1, 3, (32,), None),
+}
+
+
+def _save(im, fp, filename):
+
+ try:
+ rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode]
+ except KeyError:
+ raise OSError("cannot write mode %s as TIFF" % im.mode)
+
+ ifd = ImageFileDirectory_v2(prefix=prefix)
+
+ compression = im.encoderinfo.get("compression", im.info.get("compression"))
+ if compression is None:
+ compression = "raw"
+
+ libtiff = WRITE_LIBTIFF or compression != "raw"
+
+ # required for color libtiff images
+ ifd[PLANAR_CONFIGURATION] = getattr(im, "_planar_configuration", 1)
+
+ ifd[IMAGEWIDTH] = im.size[0]
+ ifd[IMAGELENGTH] = im.size[1]
+
+ # write any arbitrary tags passed in as an ImageFileDirectory
+ info = im.encoderinfo.get("tiffinfo", {})
+ if DEBUG:
+ print("Tiffinfo Keys: %s" % list(info))
+ if isinstance(info, ImageFileDirectory_v1):
+ info = info.to_v2()
+ for key in info:
+ ifd[key] = info.get(key)
+ try:
+ ifd.tagtype[key] = info.tagtype[key]
+ except Exception:
+ pass # might not be an IFD. Might not have populated type
+
+ # additions written by Greg Couch, gregc@cgl.ucsf.edu
+ # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com
+ if hasattr(im, "tag_v2"):
+ # preserve tags from original TIFF image file
+ for key in (
+ RESOLUTION_UNIT,
+ X_RESOLUTION,
+ Y_RESOLUTION,
+ IPTC_NAA_CHUNK,
+ PHOTOSHOP_CHUNK,
+ XMP,
+ ):
+ if key in im.tag_v2:
+ ifd[key] = im.tag_v2[key]
+ ifd.tagtype[key] = im.tag_v2.tagtype[key]
+
+ # preserve ICC profile (should also work when saving other formats
+ # which support profiles as TIFF) -- 2008-06-06 Florian Hoech
+ if "icc_profile" in im.info:
+ ifd[ICCPROFILE] = im.info["icc_profile"]
+
+ for key, name in [
+ (IMAGEDESCRIPTION, "description"),
+ (X_RESOLUTION, "resolution"),
+ (Y_RESOLUTION, "resolution"),
+ (X_RESOLUTION, "x_resolution"),
+ (Y_RESOLUTION, "y_resolution"),
+ (RESOLUTION_UNIT, "resolution_unit"),
+ (SOFTWARE, "software"),
+ (DATE_TIME, "date_time"),
+ (ARTIST, "artist"),
+ (COPYRIGHT, "copyright"),
+ ]:
+ if name in im.encoderinfo:
+ ifd[key] = im.encoderinfo[name]
+
+ dpi = im.encoderinfo.get("dpi")
+ if dpi:
+ ifd[RESOLUTION_UNIT] = 2
+ ifd[X_RESOLUTION] = int(dpi[0] + 0.5)
+ ifd[Y_RESOLUTION] = int(dpi[1] + 0.5)
+
+ if bits != (1,):
+ ifd[BITSPERSAMPLE] = bits
+ if len(bits) != 1:
+ ifd[SAMPLESPERPIXEL] = len(bits)
+ if extra is not None:
+ ifd[EXTRASAMPLES] = extra
+ if format != 1:
+ ifd[SAMPLEFORMAT] = format
+
+ ifd[PHOTOMETRIC_INTERPRETATION] = photo
+
+ if im.mode in ["P", "PA"]:
+ lut = im.im.getpalette("RGB", "RGB;L")
+ ifd[COLORMAP] = tuple(i8(v) * 256 for v in lut)
+ # data orientation
+ stride = len(bits) * ((im.size[0] * bits[0] + 7) // 8)
+ ifd[ROWSPERSTRIP] = im.size[1]
+ ifd[STRIPBYTECOUNTS] = stride * im.size[1]
+ ifd[STRIPOFFSETS] = 0 # this is adjusted by IFD writer
+ # no compression by default:
+ ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1)
+
+ if libtiff:
+ if "quality" in im.encoderinfo:
+ quality = im.encoderinfo["quality"]
+ if not isinstance(quality, int) or quality < 0 or quality > 100:
+ raise ValueError("Invalid quality setting")
+ if compression != "jpeg":
+ raise ValueError(
+ "quality setting only supported for 'jpeg' compression"
+ )
+ ifd[JPEGQUALITY] = quality
+
+ if DEBUG:
+ print("Saving using libtiff encoder")
+ print("Items: %s" % sorted(ifd.items()))
+ _fp = 0
+ if hasattr(fp, "fileno"):
+ try:
+ fp.seek(0)
+ _fp = os.dup(fp.fileno())
+ except io.UnsupportedOperation:
+ pass
+
+ # optional types for non core tags
+ types = {}
+ # SAMPLEFORMAT is determined by the image format and should not be copied
+ # from legacy_ifd.
+ # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library
+ # based on the data in the strip.
+ # The other tags expect arrays with a certain length (fixed or depending on
+ # BITSPERSAMPLE, etc), passing arrays with a different length will result in
+ # segfaults. Block these tags until we add extra validation.
+ blocklist = [
+ COLORMAP,
+ REFERENCEBLACKWHITE,
+ SAMPLEFORMAT,
+ STRIPBYTECOUNTS,
+ STRIPOFFSETS,
+ TRANSFERFUNCTION,
+ ]
+
+ atts = {}
+ # bits per sample is a single short in the tiff directory, not a list.
+ atts[BITSPERSAMPLE] = bits[0]
+ # Merge the ones that we have with (optional) more bits from
+ # the original file, e.g x,y resolution so that we can
+ # save(load('')) == original file.
+ legacy_ifd = {}
+ if hasattr(im, "tag"):
+ legacy_ifd = im.tag.to_v2()
+ for tag, value in itertools.chain(
+ ifd.items(), getattr(im, "tag_v2", {}).items(), legacy_ifd.items()
+ ):
+ # Libtiff can only process certain core items without adding
+ # them to the custom dictionary.
+ # Custom items are supported for int, float, unicode, string and byte
+ # values. Other types and tuples require a tagtype.
+ if tag not in TiffTags.LIBTIFF_CORE:
+ if (
+ TiffTags.lookup(tag).type == TiffTags.UNDEFINED
+ or not Image.core.libtiff_support_custom_tags
+ ):
+ continue
+
+ if tag in ifd.tagtype:
+ types[tag] = ifd.tagtype[tag]
+ elif not (isinstance(value, (int, float, str, bytes))):
+ continue
+ if tag not in atts and tag not in blocklist:
+ if isinstance(value, str):
+ atts[tag] = value.encode("ascii", "replace") + b"\0"
+ elif isinstance(value, IFDRational):
+ atts[tag] = float(value)
+ else:
+ atts[tag] = value
+
+ if DEBUG:
+ print("Converted items: %s" % sorted(atts.items()))
+
+ # libtiff always expects the bytes in native order.
+ # we're storing image byte order. So, if the rawmode
+ # contains I;16, we need to convert from native to image
+ # byte order.
+ if im.mode in ("I;16B", "I;16"):
+ rawmode = "I;16N"
+
+ # Pass tags as sorted list so that the tags are set in a fixed order.
+ # This is required by libtiff for some tags. For example, the JPEGQUALITY
+ # pseudo tag requires that the COMPRESS tag was already set.
+ tags = list(atts.items())
+ tags.sort()
+ a = (rawmode, compression, _fp, filename, tags, types)
+ e = Image._getencoder(im.mode, "libtiff", a, im.encoderconfig)
+ e.setimage(im.im, (0, 0) + im.size)
+ while True:
+ # undone, change to self.decodermaxblock:
+ l, s, d = e.encode(16 * 1024)
+ if not _fp:
+ fp.write(d)
+ if s:
+ break
+ if s < 0:
+ raise OSError("encoder error %d when writing image file" % s)
+
+ else:
+ offset = ifd.save(fp)
+
+ ImageFile._save(
+ im, fp, [("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))]
+ )
+
+ # -- helper for multi-page save --
+ if "_debug_multipage" in im.encoderinfo:
+ # just to access o32 and o16 (using correct byte order)
+ im._debug_multipage = ifd
+
+
+class AppendingTiffWriter:
+ fieldSizes = [
+ 0, # None
+ 1, # byte
+ 1, # ascii
+ 2, # short
+ 4, # long
+ 8, # rational
+ 1, # sbyte
+ 1, # undefined
+ 2, # sshort
+ 4, # slong
+ 8, # srational
+ 4, # float
+ 8, # double
+ ]
+
+ # StripOffsets = 273
+ # FreeOffsets = 288
+ # TileOffsets = 324
+ # JPEGQTables = 519
+ # JPEGDCTables = 520
+ # JPEGACTables = 521
+ Tags = {273, 288, 324, 519, 520, 521}
+
+ def __init__(self, fn, new=False):
+ if hasattr(fn, "read"):
+ self.f = fn
+ self.close_fp = False
+ else:
+ self.name = fn
+ self.close_fp = True
+ try:
+ self.f = open(fn, "w+b" if new else "r+b")
+ except OSError:
+ self.f = open(fn, "w+b")
+ self.beginning = self.f.tell()
+ self.setup()
+
+ def setup(self):
+ # Reset everything.
+ self.f.seek(self.beginning, os.SEEK_SET)
+
+ self.whereToWriteNewIFDOffset = None
+ self.offsetOfNewPage = 0
+
+ self.IIMM = IIMM = self.f.read(4)
+ if not IIMM:
+ # empty file - first page
+ self.isFirst = True
+ return
+
+ self.isFirst = False
+ if IIMM == b"II\x2a\x00":
+ self.setEndian("<")
+ elif IIMM == b"MM\x00\x2a":
+ self.setEndian(">")
+ else:
+ raise RuntimeError("Invalid TIFF file header")
+
+ self.skipIFDs()
+ self.goToEnd()
+
+ def finalize(self):
+ if self.isFirst:
+ return
+
+ # fix offsets
+ self.f.seek(self.offsetOfNewPage)
+
+ IIMM = self.f.read(4)
+ if not IIMM:
+ # raise RuntimeError("nothing written into new page")
+ # Make it easy to finish a frame without committing to a new one.
+ return
+
+ if IIMM != self.IIMM:
+ raise RuntimeError("IIMM of new page doesn't match IIMM of first page")
+
+ IFDoffset = self.readLong()
+ IFDoffset += self.offsetOfNewPage
+ self.f.seek(self.whereToWriteNewIFDOffset)
+ self.writeLong(IFDoffset)
+ self.f.seek(IFDoffset)
+ self.fixIFD()
+
+ def newFrame(self):
+ # Call this to finish a frame.
+ self.finalize()
+ self.setup()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ if self.close_fp:
+ self.close()
+ return False
+
+ def tell(self):
+ return self.f.tell() - self.offsetOfNewPage
+
+ def seek(self, offset, whence=io.SEEK_SET):
+ if whence == os.SEEK_SET:
+ offset += self.offsetOfNewPage
+
+ self.f.seek(offset, whence)
+ return self.tell()
+
+ def goToEnd(self):
+ self.f.seek(0, os.SEEK_END)
+ pos = self.f.tell()
+
+ # pad to 16 byte boundary
+ padBytes = 16 - pos % 16
+ if 0 < padBytes < 16:
+ self.f.write(bytes(padBytes))
+ self.offsetOfNewPage = self.f.tell()
+
+ def setEndian(self, endian):
+ self.endian = endian
+ self.longFmt = self.endian + "L"
+ self.shortFmt = self.endian + "H"
+ self.tagFormat = self.endian + "HHL"
+
+ def skipIFDs(self):
+ while True:
+ IFDoffset = self.readLong()
+ if IFDoffset == 0:
+ self.whereToWriteNewIFDOffset = self.f.tell() - 4
+ break
+
+ self.f.seek(IFDoffset)
+ numTags = self.readShort()
+ self.f.seek(numTags * 12, os.SEEK_CUR)
+
+ def write(self, data):
+ return self.f.write(data)
+
+ def readShort(self):
+ (value,) = struct.unpack(self.shortFmt, self.f.read(2))
+ return value
+
+ def readLong(self):
+ (value,) = struct.unpack(self.longFmt, self.f.read(4))
+ return value
+
+ def rewriteLastShortToLong(self, value):
+ self.f.seek(-2, os.SEEK_CUR)
+ bytesWritten = self.f.write(struct.pack(self.longFmt, value))
+ if bytesWritten is not None and bytesWritten != 4:
+ raise RuntimeError("wrote only %u bytes but wanted 4" % bytesWritten)
+
+ def rewriteLastShort(self, value):
+ self.f.seek(-2, os.SEEK_CUR)
+ bytesWritten = self.f.write(struct.pack(self.shortFmt, value))
+ if bytesWritten is not None and bytesWritten != 2:
+ raise RuntimeError("wrote only %u bytes but wanted 2" % bytesWritten)
+
+ def rewriteLastLong(self, value):
+ self.f.seek(-4, os.SEEK_CUR)
+ bytesWritten = self.f.write(struct.pack(self.longFmt, value))
+ if bytesWritten is not None and bytesWritten != 4:
+ raise RuntimeError("wrote only %u bytes but wanted 4" % bytesWritten)
+
+ def writeShort(self, value):
+ bytesWritten = self.f.write(struct.pack(self.shortFmt, value))
+ if bytesWritten is not None and bytesWritten != 2:
+ raise RuntimeError("wrote only %u bytes but wanted 2" % bytesWritten)
+
+ def writeLong(self, value):
+ bytesWritten = self.f.write(struct.pack(self.longFmt, value))
+ if bytesWritten is not None and bytesWritten != 4:
+ raise RuntimeError("wrote only %u bytes but wanted 4" % bytesWritten)
+
+ def close(self):
+ self.finalize()
+ self.f.close()
+
+ def fixIFD(self):
+ numTags = self.readShort()
+
+ for i in range(numTags):
+ tag, fieldType, count = struct.unpack(self.tagFormat, self.f.read(8))
+
+ fieldSize = self.fieldSizes[fieldType]
+ totalSize = fieldSize * count
+ isLocal = totalSize <= 4
+ if not isLocal:
+ offset = self.readLong()
+ offset += self.offsetOfNewPage
+ self.rewriteLastLong(offset)
+
+ if tag in self.Tags:
+ curPos = self.f.tell()
+
+ if isLocal:
+ self.fixOffsets(
+ count, isShort=(fieldSize == 2), isLong=(fieldSize == 4)
+ )
+ self.f.seek(curPos + 4)
+ else:
+ self.f.seek(offset)
+ self.fixOffsets(
+ count, isShort=(fieldSize == 2), isLong=(fieldSize == 4)
+ )
+ self.f.seek(curPos)
+
+ offset = curPos = None
+
+ elif isLocal:
+ # skip the locally stored value that is not an offset
+ self.f.seek(4, os.SEEK_CUR)
+
+ def fixOffsets(self, count, isShort=False, isLong=False):
+ if not isShort and not isLong:
+ raise RuntimeError("offset is neither short nor long")
+
+ for i in range(count):
+ offset = self.readShort() if isShort else self.readLong()
+ offset += self.offsetOfNewPage
+ if isShort and offset >= 65536:
+ # offset is now too large - we must convert shorts to longs
+ if count != 1:
+ raise RuntimeError("not implemented") # XXX TODO
+
+ # simple case - the offset is just one and therefore it is
+ # local (not referenced with another offset)
+ self.rewriteLastShortToLong(offset)
+ self.f.seek(-10, os.SEEK_CUR)
+ self.writeShort(TiffTags.LONG) # rewrite the type to LONG
+ self.f.seek(8, os.SEEK_CUR)
+ elif isShort:
+ self.rewriteLastShort(offset)
+ else:
+ self.rewriteLastLong(offset)
+
+
+def _save_all(im, fp, filename):
+ encoderinfo = im.encoderinfo.copy()
+ encoderconfig = im.encoderconfig
+ append_images = list(encoderinfo.get("append_images", []))
+ if not hasattr(im, "n_frames") and not append_images:
+ return _save(im, fp, filename)
+
+ cur_idx = im.tell()
+ try:
+ with AppendingTiffWriter(fp) as tf:
+ for ims in [im] + append_images:
+ ims.encoderinfo = encoderinfo
+ ims.encoderconfig = encoderconfig
+ if not hasattr(ims, "n_frames"):
+ nfr = 1
+ else:
+ nfr = ims.n_frames
+
+ for idx in range(nfr):
+ ims.seek(idx)
+ ims.load()
+ _save(ims, tf, filename)
+ tf.newFrame()
+ finally:
+ im.seek(cur_idx)
+
+
+#
+# --------------------------------------------------------------------
+# Register
+
+Image.register_open(TiffImageFile.format, TiffImageFile, _accept)
+Image.register_save(TiffImageFile.format, _save)
+Image.register_save_all(TiffImageFile.format, _save_all)
+
+Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"])
+
+Image.register_mime(TiffImageFile.format, "image/tiff")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/TiffTags.py b/geekshop/django_2.0/Lib/site-packages/PIL/TiffTags.py
new file mode 100644
index 0000000..6cc9ff7
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/TiffTags.py
@@ -0,0 +1,499 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# TIFF tags
+#
+# This module provides clear-text names for various well-known
+# TIFF tags. the TIFF codec works just fine without it.
+#
+# Copyright (c) Secret Labs AB 1999.
+#
+# See the README file for information on usage and redistribution.
+#
+
+##
+# This module provides constants and clear-text names for various
+# well-known TIFF tags.
+##
+
+from collections import namedtuple
+
+
+class TagInfo(namedtuple("_TagInfo", "value name type length enum")):
+ __slots__ = []
+
+ def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None):
+ return super().__new__(cls, value, name, type, length, enum or {})
+
+ def cvt_enum(self, value):
+ # Using get will call hash(value), which can be expensive
+ # for some types (e.g. Fraction). Since self.enum is rarely
+ # used, it's usually better to test it first.
+ return self.enum.get(value, value) if self.enum else value
+
+
+def lookup(tag):
+ """
+ :param tag: Integer tag number
+ :returns: Taginfo namedtuple, From the TAGS_V2 info if possible,
+ otherwise just populating the value and name from TAGS.
+ If the tag is not recognized, "unknown" is returned for the name
+
+ """
+
+ return TAGS_V2.get(tag, TagInfo(tag, TAGS.get(tag, "unknown")))
+
+
+##
+# Map tag numbers to tag info.
+#
+# id: (Name, Type, Length, enum_values)
+#
+# The length here differs from the length in the tiff spec. For
+# numbers, the tiff spec is for the number of fields returned. We
+# agree here. For string-like types, the tiff spec uses the length of
+# field in bytes. In Pillow, we are using the number of expected
+# fields, in general 1 for string-like types.
+
+
+BYTE = 1
+ASCII = 2
+SHORT = 3
+LONG = 4
+RATIONAL = 5
+SIGNED_BYTE = 6
+UNDEFINED = 7
+SIGNED_SHORT = 8
+SIGNED_LONG = 9
+SIGNED_RATIONAL = 10
+FLOAT = 11
+DOUBLE = 12
+
+TAGS_V2 = {
+ 254: ("NewSubfileType", LONG, 1),
+ 255: ("SubfileType", SHORT, 1),
+ 256: ("ImageWidth", LONG, 1),
+ 257: ("ImageLength", LONG, 1),
+ 258: ("BitsPerSample", SHORT, 0),
+ 259: (
+ "Compression",
+ SHORT,
+ 1,
+ {
+ "Uncompressed": 1,
+ "CCITT 1d": 2,
+ "Group 3 Fax": 3,
+ "Group 4 Fax": 4,
+ "LZW": 5,
+ "JPEG": 6,
+ "PackBits": 32773,
+ },
+ ),
+ 262: (
+ "PhotometricInterpretation",
+ SHORT,
+ 1,
+ {
+ "WhiteIsZero": 0,
+ "BlackIsZero": 1,
+ "RGB": 2,
+ "RGB Palette": 3,
+ "Transparency Mask": 4,
+ "CMYK": 5,
+ "YCbCr": 6,
+ "CieLAB": 8,
+ "CFA": 32803, # TIFF/EP, Adobe DNG
+ "LinearRaw": 32892, # Adobe DNG
+ },
+ ),
+ 263: ("Threshholding", SHORT, 1),
+ 264: ("CellWidth", SHORT, 1),
+ 265: ("CellLength", SHORT, 1),
+ 266: ("FillOrder", SHORT, 1),
+ 269: ("DocumentName", ASCII, 1),
+ 270: ("ImageDescription", ASCII, 1),
+ 271: ("Make", ASCII, 1),
+ 272: ("Model", ASCII, 1),
+ 273: ("StripOffsets", LONG, 0),
+ 274: ("Orientation", SHORT, 1),
+ 277: ("SamplesPerPixel", SHORT, 1),
+ 278: ("RowsPerStrip", LONG, 1),
+ 279: ("StripByteCounts", LONG, 0),
+ 280: ("MinSampleValue", SHORT, 0),
+ 281: ("MaxSampleValue", SHORT, 0),
+ 282: ("XResolution", RATIONAL, 1),
+ 283: ("YResolution", RATIONAL, 1),
+ 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}),
+ 285: ("PageName", ASCII, 1),
+ 286: ("XPosition", RATIONAL, 1),
+ 287: ("YPosition", RATIONAL, 1),
+ 288: ("FreeOffsets", LONG, 1),
+ 289: ("FreeByteCounts", LONG, 1),
+ 290: ("GrayResponseUnit", SHORT, 1),
+ 291: ("GrayResponseCurve", SHORT, 0),
+ 292: ("T4Options", LONG, 1),
+ 293: ("T6Options", LONG, 1),
+ 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}),
+ 297: ("PageNumber", SHORT, 2),
+ 301: ("TransferFunction", SHORT, 0),
+ 305: ("Software", ASCII, 1),
+ 306: ("DateTime", ASCII, 1),
+ 315: ("Artist", ASCII, 1),
+ 316: ("HostComputer", ASCII, 1),
+ 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}),
+ 318: ("WhitePoint", RATIONAL, 2),
+ 319: ("PrimaryChromaticities", RATIONAL, 6),
+ 320: ("ColorMap", SHORT, 0),
+ 321: ("HalftoneHints", SHORT, 2),
+ 322: ("TileWidth", LONG, 1),
+ 323: ("TileLength", LONG, 1),
+ 324: ("TileOffsets", LONG, 0),
+ 325: ("TileByteCounts", LONG, 0),
+ 332: ("InkSet", SHORT, 1),
+ 333: ("InkNames", ASCII, 1),
+ 334: ("NumberOfInks", SHORT, 1),
+ 336: ("DotRange", SHORT, 0),
+ 337: ("TargetPrinter", ASCII, 1),
+ 338: ("ExtraSamples", SHORT, 0),
+ 339: ("SampleFormat", SHORT, 0),
+ 340: ("SMinSampleValue", DOUBLE, 0),
+ 341: ("SMaxSampleValue", DOUBLE, 0),
+ 342: ("TransferRange", SHORT, 6),
+ 347: ("JPEGTables", UNDEFINED, 1),
+ # obsolete JPEG tags
+ 512: ("JPEGProc", SHORT, 1),
+ 513: ("JPEGInterchangeFormat", LONG, 1),
+ 514: ("JPEGInterchangeFormatLength", LONG, 1),
+ 515: ("JPEGRestartInterval", SHORT, 1),
+ 517: ("JPEGLosslessPredictors", SHORT, 0),
+ 518: ("JPEGPointTransforms", SHORT, 0),
+ 519: ("JPEGQTables", LONG, 0),
+ 520: ("JPEGDCTables", LONG, 0),
+ 521: ("JPEGACTables", LONG, 0),
+ 529: ("YCbCrCoefficients", RATIONAL, 3),
+ 530: ("YCbCrSubSampling", SHORT, 2),
+ 531: ("YCbCrPositioning", SHORT, 1),
+ 532: ("ReferenceBlackWhite", RATIONAL, 6),
+ 700: ("XMP", BYTE, 0),
+ 33432: ("Copyright", ASCII, 1),
+ 33723: ("IptcNaaInfo", UNDEFINED, 0),
+ 34377: ("PhotoshopInfo", BYTE, 0),
+ # FIXME add more tags here
+ 34665: ("ExifIFD", LONG, 1),
+ 34675: ("ICCProfile", UNDEFINED, 1),
+ 34853: ("GPSInfoIFD", LONG, 1),
+ # MPInfo
+ 45056: ("MPFVersion", UNDEFINED, 1),
+ 45057: ("NumberOfImages", LONG, 1),
+ 45058: ("MPEntry", UNDEFINED, 1),
+ 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check
+ 45060: ("TotalFrames", LONG, 1),
+ 45313: ("MPIndividualNum", LONG, 1),
+ 45569: ("PanOrientation", LONG, 1),
+ 45570: ("PanOverlap_H", RATIONAL, 1),
+ 45571: ("PanOverlap_V", RATIONAL, 1),
+ 45572: ("BaseViewpointNum", LONG, 1),
+ 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1),
+ 45574: ("BaselineLength", RATIONAL, 1),
+ 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1),
+ 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1),
+ 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1),
+ 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1),
+ 45579: ("YawAngle", SIGNED_RATIONAL, 1),
+ 45580: ("PitchAngle", SIGNED_RATIONAL, 1),
+ 45581: ("RollAngle", SIGNED_RATIONAL, 1),
+ 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}),
+ 50780: ("BestQualityScale", RATIONAL, 1),
+ 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one
+ 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006
+}
+
+# Legacy Tags structure
+# these tags aren't included above, but were in the previous versions
+TAGS = {
+ 347: "JPEGTables",
+ 700: "XMP",
+ # Additional Exif Info
+ 32932: "Wang Annotation",
+ 33434: "ExposureTime",
+ 33437: "FNumber",
+ 33445: "MD FileTag",
+ 33446: "MD ScalePixel",
+ 33447: "MD ColorTable",
+ 33448: "MD LabName",
+ 33449: "MD SampleInfo",
+ 33450: "MD PrepDate",
+ 33451: "MD PrepTime",
+ 33452: "MD FileUnits",
+ 33550: "ModelPixelScaleTag",
+ 33723: "IptcNaaInfo",
+ 33918: "INGR Packet Data Tag",
+ 33919: "INGR Flag Registers",
+ 33920: "IrasB Transformation Matrix",
+ 33922: "ModelTiepointTag",
+ 34264: "ModelTransformationTag",
+ 34377: "PhotoshopInfo",
+ 34735: "GeoKeyDirectoryTag",
+ 34736: "GeoDoubleParamsTag",
+ 34737: "GeoAsciiParamsTag",
+ 34850: "ExposureProgram",
+ 34852: "SpectralSensitivity",
+ 34855: "ISOSpeedRatings",
+ 34856: "OECF",
+ 34864: "SensitivityType",
+ 34865: "StandardOutputSensitivity",
+ 34866: "RecommendedExposureIndex",
+ 34867: "ISOSpeed",
+ 34868: "ISOSpeedLatitudeyyy",
+ 34869: "ISOSpeedLatitudezzz",
+ 34908: "HylaFAX FaxRecvParams",
+ 34909: "HylaFAX FaxSubAddress",
+ 34910: "HylaFAX FaxRecvTime",
+ 36864: "ExifVersion",
+ 36867: "DateTimeOriginal",
+ 36868: "DateTImeDigitized",
+ 37121: "ComponentsConfiguration",
+ 37122: "CompressedBitsPerPixel",
+ 37724: "ImageSourceData",
+ 37377: "ShutterSpeedValue",
+ 37378: "ApertureValue",
+ 37379: "BrightnessValue",
+ 37380: "ExposureBiasValue",
+ 37381: "MaxApertureValue",
+ 37382: "SubjectDistance",
+ 37383: "MeteringMode",
+ 37384: "LightSource",
+ 37385: "Flash",
+ 37386: "FocalLength",
+ 37396: "SubjectArea",
+ 37500: "MakerNote",
+ 37510: "UserComment",
+ 37520: "SubSec",
+ 37521: "SubSecTimeOriginal",
+ 37522: "SubsecTimeDigitized",
+ 40960: "FlashPixVersion",
+ 40961: "ColorSpace",
+ 40962: "PixelXDimension",
+ 40963: "PixelYDimension",
+ 40964: "RelatedSoundFile",
+ 40965: "InteroperabilityIFD",
+ 41483: "FlashEnergy",
+ 41484: "SpatialFrequencyResponse",
+ 41486: "FocalPlaneXResolution",
+ 41487: "FocalPlaneYResolution",
+ 41488: "FocalPlaneResolutionUnit",
+ 41492: "SubjectLocation",
+ 41493: "ExposureIndex",
+ 41495: "SensingMethod",
+ 41728: "FileSource",
+ 41729: "SceneType",
+ 41730: "CFAPattern",
+ 41985: "CustomRendered",
+ 41986: "ExposureMode",
+ 41987: "WhiteBalance",
+ 41988: "DigitalZoomRatio",
+ 41989: "FocalLengthIn35mmFilm",
+ 41990: "SceneCaptureType",
+ 41991: "GainControl",
+ 41992: "Contrast",
+ 41993: "Saturation",
+ 41994: "Sharpness",
+ 41995: "DeviceSettingDescription",
+ 41996: "SubjectDistanceRange",
+ 42016: "ImageUniqueID",
+ 42032: "CameraOwnerName",
+ 42033: "BodySerialNumber",
+ 42034: "LensSpecification",
+ 42035: "LensMake",
+ 42036: "LensModel",
+ 42037: "LensSerialNumber",
+ 42112: "GDAL_METADATA",
+ 42113: "GDAL_NODATA",
+ 42240: "Gamma",
+ 50215: "Oce Scanjob Description",
+ 50216: "Oce Application Selector",
+ 50217: "Oce Identification Number",
+ 50218: "Oce ImageLogic Characteristics",
+ # Adobe DNG
+ 50706: "DNGVersion",
+ 50707: "DNGBackwardVersion",
+ 50708: "UniqueCameraModel",
+ 50709: "LocalizedCameraModel",
+ 50710: "CFAPlaneColor",
+ 50711: "CFALayout",
+ 50712: "LinearizationTable",
+ 50713: "BlackLevelRepeatDim",
+ 50714: "BlackLevel",
+ 50715: "BlackLevelDeltaH",
+ 50716: "BlackLevelDeltaV",
+ 50717: "WhiteLevel",
+ 50718: "DefaultScale",
+ 50719: "DefaultCropOrigin",
+ 50720: "DefaultCropSize",
+ 50721: "ColorMatrix1",
+ 50722: "ColorMatrix2",
+ 50723: "CameraCalibration1",
+ 50724: "CameraCalibration2",
+ 50725: "ReductionMatrix1",
+ 50726: "ReductionMatrix2",
+ 50727: "AnalogBalance",
+ 50728: "AsShotNeutral",
+ 50729: "AsShotWhiteXY",
+ 50730: "BaselineExposure",
+ 50731: "BaselineNoise",
+ 50732: "BaselineSharpness",
+ 50733: "BayerGreenSplit",
+ 50734: "LinearResponseLimit",
+ 50735: "CameraSerialNumber",
+ 50736: "LensInfo",
+ 50737: "ChromaBlurRadius",
+ 50738: "AntiAliasStrength",
+ 50740: "DNGPrivateData",
+ 50778: "CalibrationIlluminant1",
+ 50779: "CalibrationIlluminant2",
+ 50784: "Alias Layer Metadata",
+}
+
+
+def _populate():
+ for k, v in TAGS_V2.items():
+ # Populate legacy structure.
+ TAGS[k] = v[0]
+ if len(v) == 4:
+ for sk, sv in v[3].items():
+ TAGS[(k, sv)] = sk
+
+ TAGS_V2[k] = TagInfo(k, *v)
+
+
+_populate()
+##
+# Map type numbers to type names -- defined in ImageFileDirectory.
+
+TYPES = {}
+
+# was:
+# TYPES = {
+# 1: "byte",
+# 2: "ascii",
+# 3: "short",
+# 4: "long",
+# 5: "rational",
+# 6: "signed byte",
+# 7: "undefined",
+# 8: "signed short",
+# 9: "signed long",
+# 10: "signed rational",
+# 11: "float",
+# 12: "double",
+# }
+
+#
+# These tags are handled by default in libtiff, without
+# adding to the custom dictionary. From tif_dir.c, searching for
+# case TIFFTAG in the _TIFFVSetField function:
+# Line: item.
+# 148: case TIFFTAG_SUBFILETYPE:
+# 151: case TIFFTAG_IMAGEWIDTH:
+# 154: case TIFFTAG_IMAGELENGTH:
+# 157: case TIFFTAG_BITSPERSAMPLE:
+# 181: case TIFFTAG_COMPRESSION:
+# 202: case TIFFTAG_PHOTOMETRIC:
+# 205: case TIFFTAG_THRESHHOLDING:
+# 208: case TIFFTAG_FILLORDER:
+# 214: case TIFFTAG_ORIENTATION:
+# 221: case TIFFTAG_SAMPLESPERPIXEL:
+# 228: case TIFFTAG_ROWSPERSTRIP:
+# 238: case TIFFTAG_MINSAMPLEVALUE:
+# 241: case TIFFTAG_MAXSAMPLEVALUE:
+# 244: case TIFFTAG_SMINSAMPLEVALUE:
+# 247: case TIFFTAG_SMAXSAMPLEVALUE:
+# 250: case TIFFTAG_XRESOLUTION:
+# 256: case TIFFTAG_YRESOLUTION:
+# 262: case TIFFTAG_PLANARCONFIG:
+# 268: case TIFFTAG_XPOSITION:
+# 271: case TIFFTAG_YPOSITION:
+# 274: case TIFFTAG_RESOLUTIONUNIT:
+# 280: case TIFFTAG_PAGENUMBER:
+# 284: case TIFFTAG_HALFTONEHINTS:
+# 288: case TIFFTAG_COLORMAP:
+# 294: case TIFFTAG_EXTRASAMPLES:
+# 298: case TIFFTAG_MATTEING:
+# 305: case TIFFTAG_TILEWIDTH:
+# 316: case TIFFTAG_TILELENGTH:
+# 327: case TIFFTAG_TILEDEPTH:
+# 333: case TIFFTAG_DATATYPE:
+# 344: case TIFFTAG_SAMPLEFORMAT:
+# 361: case TIFFTAG_IMAGEDEPTH:
+# 364: case TIFFTAG_SUBIFD:
+# 376: case TIFFTAG_YCBCRPOSITIONING:
+# 379: case TIFFTAG_YCBCRSUBSAMPLING:
+# 383: case TIFFTAG_TRANSFERFUNCTION:
+# 389: case TIFFTAG_REFERENCEBLACKWHITE:
+# 393: case TIFFTAG_INKNAMES:
+
+# Following pseudo-tags are also handled by default in libtiff:
+# TIFFTAG_JPEGQUALITY 65537
+
+# some of these are not in our TAGS_V2 dict and were included from tiff.h
+
+# This list also exists in encode.c
+LIBTIFF_CORE = {
+ 255,
+ 256,
+ 257,
+ 258,
+ 259,
+ 262,
+ 263,
+ 266,
+ 274,
+ 277,
+ 278,
+ 280,
+ 281,
+ 340,
+ 341,
+ 282,
+ 283,
+ 284,
+ 286,
+ 287,
+ 296,
+ 297,
+ 321,
+ 320,
+ 338,
+ 32995,
+ 322,
+ 323,
+ 32998,
+ 32996,
+ 339,
+ 32997,
+ 330,
+ 531,
+ 530,
+ 301,
+ 532,
+ 333,
+ # as above
+ 269, # this has been in our tests forever, and works
+ 65537,
+}
+
+LIBTIFF_CORE.remove(320) # Array of short, crashes
+LIBTIFF_CORE.remove(301) # Array of short, crashes
+LIBTIFF_CORE.remove(532) # Array of long, crashes
+
+LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes
+LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff
+LIBTIFF_CORE.remove(323) # Tiled images
+LIBTIFF_CORE.remove(333) # Ink Names either
+
+# Note to advanced users: There may be combinations of these
+# parameters and values that when added properly, will work and
+# produce valid tiff images that may work in your application.
+# It is safe to add and remove tags from this set from Pillow's point
+# of view so long as you test against libtiff.
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/WalImageFile.py b/geekshop/django_2.0/Lib/site-packages/PIL/WalImageFile.py
new file mode 100644
index 0000000..d5a5c8e
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/WalImageFile.py
@@ -0,0 +1,123 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# WAL file handling
+#
+# History:
+# 2003-04-23 fl created
+#
+# Copyright (c) 2003 by Fredrik Lundh.
+#
+# See the README file for information on usage and redistribution.
+#
+
+# NOTE: This format cannot be automatically recognized, so the reader
+# is not registered for use with Image.open(). To open a WAL file, use
+# the WalImageFile.open() function instead.
+
+# This reader is based on the specification available from:
+# https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml
+# and has been tested with a few sample files found using google.
+
+import builtins
+
+from . import Image
+from ._binary import i32le as i32
+
+
+def open(filename):
+ """
+ Load texture from a Quake2 WAL texture file.
+
+ By default, a Quake2 standard palette is attached to the texture.
+ To override the palette, use the putpalette method.
+
+ :param filename: WAL file name, or an opened file handle.
+ :returns: An image instance.
+ """
+ # FIXME: modify to return a WalImageFile instance instead of
+ # plain Image object ?
+
+ def imopen(fp):
+ # read header fields
+ header = fp.read(32 + 24 + 32 + 12)
+ size = i32(header, 32), i32(header, 36)
+ offset = i32(header, 40)
+
+ # load pixel data
+ fp.seek(offset)
+
+ Image._decompression_bomb_check(size)
+ im = Image.frombytes("P", size, fp.read(size[0] * size[1]))
+ im.putpalette(quake2palette)
+
+ im.format = "WAL"
+ im.format_description = "Quake2 Texture"
+
+ # strings are null-terminated
+ im.info["name"] = header[:32].split(b"\0", 1)[0]
+ next_name = header[56 : 56 + 32].split(b"\0", 1)[0]
+ if next_name:
+ im.info["next_name"] = next_name
+
+ return im
+
+ if hasattr(filename, "read"):
+ return imopen(filename)
+ else:
+ with builtins.open(filename, "rb") as fp:
+ return imopen(fp)
+
+
+quake2palette = (
+ # default palette taken from piffo 0.93 by Hans Häggström
+ b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e"
+ b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f"
+ b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c"
+ b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b"
+ b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10"
+ b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07"
+ b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f"
+ b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16"
+ b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d"
+ b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31"
+ b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28"
+ b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07"
+ b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27"
+ b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b"
+ b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01"
+ b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21"
+ b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14"
+ b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07"
+ b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14"
+ b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f"
+ b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34"
+ b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d"
+ b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14"
+ b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01"
+ b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24"
+ b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10"
+ b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01"
+ b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27"
+ b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c"
+ b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a"
+ b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26"
+ b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d"
+ b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01"
+ b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20"
+ b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17"
+ b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07"
+ b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25"
+ b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c"
+ b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01"
+ b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23"
+ b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f"
+ b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b"
+ b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37"
+ b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b"
+ b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01"
+ b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10"
+ b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b"
+ b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20"
+)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/WebPImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/WebPImagePlugin.py
new file mode 100644
index 0000000..eda6855
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/WebPImagePlugin.py
@@ -0,0 +1,360 @@
+from io import BytesIO
+
+from . import Image, ImageFile
+
+try:
+ from . import _webp
+
+ SUPPORTED = True
+except ImportError:
+ SUPPORTED = False
+
+
+_VALID_WEBP_MODES = {"RGBX": True, "RGBA": True, "RGB": True}
+
+_VALID_WEBP_LEGACY_MODES = {"RGB": True, "RGBA": True}
+
+_VP8_MODES_BY_IDENTIFIER = {
+ b"VP8 ": "RGB",
+ b"VP8X": "RGBA",
+ b"VP8L": "RGBA", # lossless
+}
+
+
+def _accept(prefix):
+ is_riff_file_format = prefix[:4] == b"RIFF"
+ is_webp_file = prefix[8:12] == b"WEBP"
+ is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER
+
+ if is_riff_file_format and is_webp_file and is_valid_vp8_mode:
+ if not SUPPORTED:
+ return (
+ "image file could not be identified because WEBP support not installed"
+ )
+ return True
+
+
+class WebPImageFile(ImageFile.ImageFile):
+
+ format = "WEBP"
+ format_description = "WebP image"
+
+ def _open(self):
+ if not _webp.HAVE_WEBPANIM:
+ # Legacy mode
+ data, width, height, self.mode, icc_profile, exif = _webp.WebPDecode(
+ self.fp.read()
+ )
+ if icc_profile:
+ self.info["icc_profile"] = icc_profile
+ if exif:
+ self.info["exif"] = exif
+ self._size = width, height
+ self.fp = BytesIO(data)
+ self.tile = [("raw", (0, 0) + self.size, 0, self.mode)]
+ self._n_frames = 1
+ return
+
+ # Use the newer AnimDecoder API to parse the (possibly) animated file,
+ # and access muxed chunks like ICC/EXIF/XMP.
+ self._decoder = _webp.WebPAnimDecoder(self.fp.read())
+
+ # Get info from decoder
+ width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info()
+ self._size = width, height
+ self.info["loop"] = loop_count
+ bg_a, bg_r, bg_g, bg_b = (
+ (bgcolor >> 24) & 0xFF,
+ (bgcolor >> 16) & 0xFF,
+ (bgcolor >> 8) & 0xFF,
+ bgcolor & 0xFF,
+ )
+ self.info["background"] = (bg_r, bg_g, bg_b, bg_a)
+ self._n_frames = frame_count
+ self.mode = "RGB" if mode == "RGBX" else mode
+ self.rawmode = mode
+ self.tile = []
+
+ # Attempt to read ICC / EXIF / XMP chunks from file
+ icc_profile = self._decoder.get_chunk("ICCP")
+ exif = self._decoder.get_chunk("EXIF")
+ xmp = self._decoder.get_chunk("XMP ")
+ if icc_profile:
+ self.info["icc_profile"] = icc_profile
+ if exif:
+ self.info["exif"] = exif
+ if xmp:
+ self.info["xmp"] = xmp
+
+ # Initialize seek state
+ self._reset(reset=False)
+ self.seek(0)
+
+ def _getexif(self):
+ if "exif" not in self.info:
+ return None
+ return dict(self.getexif())
+
+ @property
+ def n_frames(self):
+ return self._n_frames
+
+ @property
+ def is_animated(self):
+ return self._n_frames > 1
+
+ def seek(self, frame):
+ if not _webp.HAVE_WEBPANIM:
+ return super().seek(frame)
+
+ # Perform some simple checks first
+ if frame >= self._n_frames:
+ raise EOFError("attempted to seek beyond end of sequence")
+ if frame < 0:
+ raise EOFError("negative frame index is not valid")
+
+ # Set logical frame to requested position
+ self.__logical_frame = frame
+
+ def _reset(self, reset=True):
+ if reset:
+ self._decoder.reset()
+ self.__physical_frame = 0
+ self.__loaded = -1
+ self.__timestamp = 0
+
+ def _get_next(self):
+ # Get next frame
+ ret = self._decoder.get_next()
+ self.__physical_frame += 1
+
+ # Check if an error occurred
+ if ret is None:
+ self._reset() # Reset just to be safe
+ self.seek(0)
+ raise EOFError("failed to decode next frame in WebP file")
+
+ # Compute duration
+ data, timestamp = ret
+ duration = timestamp - self.__timestamp
+ self.__timestamp = timestamp
+
+ # libwebp gives frame end, adjust to start of frame
+ timestamp -= duration
+ return data, timestamp, duration
+
+ def _seek(self, frame):
+ if self.__physical_frame == frame:
+ return # Nothing to do
+ if frame < self.__physical_frame:
+ self._reset() # Rewind to beginning
+ while self.__physical_frame < frame:
+ self._get_next() # Advance to the requested frame
+
+ def load(self):
+ if _webp.HAVE_WEBPANIM:
+ if self.__loaded != self.__logical_frame:
+ self._seek(self.__logical_frame)
+
+ # We need to load the image data for this frame
+ data, timestamp, duration = self._get_next()
+ self.info["timestamp"] = timestamp
+ self.info["duration"] = duration
+ self.__loaded = self.__logical_frame
+
+ # Set tile
+ if self.fp and self._exclusive_fp:
+ self.fp.close()
+ self.fp = BytesIO(data)
+ self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)]
+
+ return super().load()
+
+ def tell(self):
+ if not _webp.HAVE_WEBPANIM:
+ return super().tell()
+
+ return self.__logical_frame
+
+
+def _save_all(im, fp, filename):
+ encoderinfo = im.encoderinfo.copy()
+ append_images = list(encoderinfo.get("append_images", []))
+
+ # If total frame count is 1, then save using the legacy API, which
+ # will preserve non-alpha modes
+ total = 0
+ for ims in [im] + append_images:
+ total += getattr(ims, "n_frames", 1)
+ if total == 1:
+ _save(im, fp, filename)
+ return
+
+ background = (0, 0, 0, 0)
+ if "background" in encoderinfo:
+ background = encoderinfo["background"]
+ elif "background" in im.info:
+ background = im.info["background"]
+ if isinstance(background, int):
+ # GifImagePlugin stores a global color table index in
+ # info["background"]. So it must be converted to an RGBA value
+ palette = im.getpalette()
+ if palette:
+ r, g, b = palette[background * 3 : (background + 1) * 3]
+ background = (r, g, b, 0)
+
+ duration = im.encoderinfo.get("duration", 0)
+ loop = im.encoderinfo.get("loop", 0)
+ minimize_size = im.encoderinfo.get("minimize_size", False)
+ kmin = im.encoderinfo.get("kmin", None)
+ kmax = im.encoderinfo.get("kmax", None)
+ allow_mixed = im.encoderinfo.get("allow_mixed", False)
+ verbose = False
+ lossless = im.encoderinfo.get("lossless", False)
+ quality = im.encoderinfo.get("quality", 80)
+ method = im.encoderinfo.get("method", 0)
+ icc_profile = im.encoderinfo.get("icc_profile", "")
+ exif = im.encoderinfo.get("exif", "")
+ if isinstance(exif, Image.Exif):
+ exif = exif.tobytes()
+ xmp = im.encoderinfo.get("xmp", "")
+ if allow_mixed:
+ lossless = False
+
+ # Sensible keyframe defaults are from gif2webp.c script
+ if kmin is None:
+ kmin = 9 if lossless else 3
+ if kmax is None:
+ kmax = 17 if lossless else 5
+
+ # Validate background color
+ if (
+ not isinstance(background, (list, tuple))
+ or len(background) != 4
+ or not all(v >= 0 and v < 256 for v in background)
+ ):
+ raise OSError(
+ "Background color is not an RGBA tuple clamped to (0-255): %s"
+ % str(background)
+ )
+
+ # Convert to packed uint
+ bg_r, bg_g, bg_b, bg_a = background
+ background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0)
+
+ # Setup the WebP animation encoder
+ enc = _webp.WebPAnimEncoder(
+ im.size[0],
+ im.size[1],
+ background,
+ loop,
+ minimize_size,
+ kmin,
+ kmax,
+ allow_mixed,
+ verbose,
+ )
+
+ # Add each frame
+ frame_idx = 0
+ timestamp = 0
+ cur_idx = im.tell()
+ try:
+ for ims in [im] + append_images:
+ # Get # of frames in this image
+ nfr = getattr(ims, "n_frames", 1)
+
+ for idx in range(nfr):
+ ims.seek(idx)
+ ims.load()
+
+ # Make sure image mode is supported
+ frame = ims
+ rawmode = ims.mode
+ if ims.mode not in _VALID_WEBP_MODES:
+ alpha = (
+ "A" in ims.mode
+ or "a" in ims.mode
+ or (ims.mode == "P" and "A" in ims.im.getpalettemode())
+ )
+ rawmode = "RGBA" if alpha else "RGB"
+ frame = ims.convert(rawmode)
+
+ if rawmode == "RGB":
+ # For faster conversion, use RGBX
+ rawmode = "RGBX"
+
+ # Append the frame to the animation encoder
+ enc.add(
+ frame.tobytes("raw", rawmode),
+ timestamp,
+ frame.size[0],
+ frame.size[1],
+ rawmode,
+ lossless,
+ quality,
+ method,
+ )
+
+ # Update timestamp and frame index
+ if isinstance(duration, (list, tuple)):
+ timestamp += duration[frame_idx]
+ else:
+ timestamp += duration
+ frame_idx += 1
+
+ finally:
+ im.seek(cur_idx)
+
+ # Force encoder to flush frames
+ enc.add(None, timestamp, 0, 0, "", lossless, quality, 0)
+
+ # Get the final output from the encoder
+ data = enc.assemble(icc_profile, exif, xmp)
+ if data is None:
+ raise OSError("cannot write file as WebP (encoder returned None)")
+
+ fp.write(data)
+
+
+def _save(im, fp, filename):
+ lossless = im.encoderinfo.get("lossless", False)
+ quality = im.encoderinfo.get("quality", 80)
+ icc_profile = im.encoderinfo.get("icc_profile", "")
+ exif = im.encoderinfo.get("exif", "")
+ if isinstance(exif, Image.Exif):
+ exif = exif.tobytes()
+ xmp = im.encoderinfo.get("xmp", "")
+
+ if im.mode not in _VALID_WEBP_LEGACY_MODES:
+ alpha = (
+ "A" in im.mode
+ or "a" in im.mode
+ or (im.mode == "P" and "A" in im.im.getpalettemode())
+ )
+ im = im.convert("RGBA" if alpha else "RGB")
+
+ data = _webp.WebPEncode(
+ im.tobytes(),
+ im.size[0],
+ im.size[1],
+ lossless,
+ float(quality),
+ im.mode,
+ icc_profile,
+ exif,
+ xmp,
+ )
+ if data is None:
+ raise OSError("cannot write file as WebP (encoder returned None)")
+
+ fp.write(data)
+
+
+Image.register_open(WebPImageFile.format, WebPImageFile, _accept)
+if SUPPORTED:
+ Image.register_save(WebPImageFile.format, _save)
+ if _webp.HAVE_WEBPANIM:
+ Image.register_save_all(WebPImageFile.format, _save_all)
+ Image.register_extension(WebPImageFile.format, ".webp")
+ Image.register_mime(WebPImageFile.format, "image/webp")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/WmfImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/WmfImagePlugin.py
new file mode 100644
index 0000000..024222c
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/WmfImagePlugin.py
@@ -0,0 +1,175 @@
+#
+# The Python Imaging Library
+# $Id$
+#
+# WMF stub codec
+#
+# history:
+# 1996-12-14 fl Created
+# 2004-02-22 fl Turned into a stub driver
+# 2004-02-23 fl Added EMF support
+#
+# Copyright (c) Secret Labs AB 1997-2004. All rights reserved.
+# Copyright (c) Fredrik Lundh 1996.
+#
+# See the README file for information on usage and redistribution.
+#
+# WMF/EMF reference documentation:
+# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf
+# http://wvware.sourceforge.net/caolan/index.html
+# http://wvware.sourceforge.net/caolan/ora-wmf.html
+
+from . import Image, ImageFile
+from ._binary import i16le as word, i32le as dword, si16le as short, si32le as _long
+
+_handler = None
+
+
+def register_handler(handler):
+ """
+ Install application-specific WMF image handler.
+
+ :param handler: Handler object.
+ """
+ global _handler
+ _handler = handler
+
+
+if hasattr(Image.core, "drawwmf"):
+ # install default handler (windows only)
+
+ class WmfHandler:
+ def open(self, im):
+ im.mode = "RGB"
+ self.bbox = im.info["wmf_bbox"]
+
+ def load(self, im):
+ im.fp.seek(0) # rewind
+ return Image.frombytes(
+ "RGB",
+ im.size,
+ Image.core.drawwmf(im.fp.read(), im.size, self.bbox),
+ "raw",
+ "BGR",
+ (im.size[0] * 3 + 3) & -4,
+ -1,
+ )
+
+ register_handler(WmfHandler())
+
+#
+# --------------------------------------------------------------------
+# Read WMF file
+
+
+def _accept(prefix):
+ return (
+ prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00"
+ )
+
+
+##
+# Image plugin for Windows metafiles.
+
+
+class WmfStubImageFile(ImageFile.StubImageFile):
+
+ format = "WMF"
+ format_description = "Windows Metafile"
+
+ def _open(self):
+ self._inch = None
+
+ # check placable header
+ s = self.fp.read(80)
+
+ if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00":
+
+ # placeable windows metafile
+
+ # get units per inch
+ self._inch = word(s, 14)
+
+ # get bounding box
+ x0 = short(s, 6)
+ y0 = short(s, 8)
+ x1 = short(s, 10)
+ y1 = short(s, 12)
+
+ # normalize size to 72 dots per inch
+ self.info["dpi"] = 72
+ size = (
+ (x1 - x0) * self.info["dpi"] // self._inch,
+ (y1 - y0) * self.info["dpi"] // self._inch,
+ )
+
+ self.info["wmf_bbox"] = x0, y0, x1, y1
+
+ # sanity check (standard metafile header)
+ if s[22:26] != b"\x01\x00\t\x00":
+ raise SyntaxError("Unsupported WMF file format")
+
+ elif dword(s) == 1 and s[40:44] == b" EMF":
+ # enhanced metafile
+
+ # get bounding box
+ x0 = _long(s, 8)
+ y0 = _long(s, 12)
+ x1 = _long(s, 16)
+ y1 = _long(s, 20)
+
+ # get frame (in 0.01 millimeter units)
+ frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36)
+
+ size = x1 - x0, y1 - y0
+
+ # calculate dots per inch from bbox and frame
+ xdpi = int(2540.0 * (x1 - y0) / (frame[2] - frame[0]) + 0.5)
+ ydpi = int(2540.0 * (y1 - y0) / (frame[3] - frame[1]) + 0.5)
+
+ self.info["wmf_bbox"] = x0, y0, x1, y1
+
+ if xdpi == ydpi:
+ self.info["dpi"] = xdpi
+ else:
+ self.info["dpi"] = xdpi, ydpi
+
+ else:
+ raise SyntaxError("Unsupported file format")
+
+ self.mode = "RGB"
+ self._size = size
+
+ loader = self._load()
+ if loader:
+ loader.open(self)
+
+ def _load(self):
+ return _handler
+
+ def load(self, dpi=None):
+ if dpi is not None and self._inch is not None:
+ self.info["dpi"] = int(dpi + 0.5)
+ x0, y0, x1, y1 = self.info["wmf_bbox"]
+ self._size = (
+ (x1 - x0) * self.info["dpi"] // self._inch,
+ (y1 - y0) * self.info["dpi"] // self._inch,
+ )
+ super().load()
+
+
+def _save(im, fp, filename):
+ if _handler is None or not hasattr(_handler, "save"):
+ raise OSError("WMF save handler not installed")
+ _handler.save(im, fp, filename)
+
+
+#
+# --------------------------------------------------------------------
+# Registry stuff
+
+
+Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept)
+Image.register_save(WmfStubImageFile.format, _save)
+
+Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"])
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/XVThumbImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/XVThumbImagePlugin.py
new file mode 100644
index 0000000..c0d8db0
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/XVThumbImagePlugin.py
@@ -0,0 +1,78 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# XV Thumbnail file handler by Charles E. "Gene" Cash
+# (gcash@magicnet.net)
+#
+# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV,
+# available from ftp://ftp.cis.upenn.edu/pub/xv/
+#
+# history:
+# 98-08-15 cec created (b/w only)
+# 98-12-09 cec added color palette
+# 98-12-28 fl added to PIL (with only a few very minor modifications)
+#
+# To do:
+# FIXME: make save work (this requires quantization support)
+#
+
+from . import Image, ImageFile, ImagePalette
+from ._binary import i8, o8
+
+_MAGIC = b"P7 332"
+
+# standard color palette for thumbnails (RGB332)
+PALETTE = b""
+for r in range(8):
+ for g in range(8):
+ for b in range(4):
+ PALETTE = PALETTE + (
+ o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3)
+ )
+
+
+def _accept(prefix):
+ return prefix[:6] == _MAGIC
+
+
+##
+# Image plugin for XV thumbnail images.
+
+
+class XVThumbImageFile(ImageFile.ImageFile):
+
+ format = "XVThumb"
+ format_description = "XV thumbnail image"
+
+ def _open(self):
+
+ # check magic
+ if not _accept(self.fp.read(6)):
+ raise SyntaxError("not an XV thumbnail file")
+
+ # Skip to beginning of next line
+ self.fp.readline()
+
+ # skip info comments
+ while True:
+ s = self.fp.readline()
+ if not s:
+ raise SyntaxError("Unexpected EOF reading XV thumbnail file")
+ if i8(s[0]) != 35: # ie. when not a comment: '#'
+ break
+
+ # parse header line (already read)
+ s = s.strip().split()
+
+ self.mode = "P"
+ self._size = int(s[0]), int(s[1])
+
+ self.palette = ImagePalette.raw("RGB", PALETTE)
+
+ self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))]
+
+
+# --------------------------------------------------------------------
+
+Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/XbmImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/XbmImagePlugin.py
new file mode 100644
index 0000000..ead9722
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/XbmImagePlugin.py
@@ -0,0 +1,94 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# XBM File handling
+#
+# History:
+# 1995-09-08 fl Created
+# 1996-11-01 fl Added save support
+# 1997-07-07 fl Made header parser more tolerant
+# 1997-07-22 fl Fixed yet another parser bug
+# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4)
+# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog)
+# 2004-02-24 fl Allow some whitespace before first #define
+#
+# Copyright (c) 1997-2004 by Secret Labs AB
+# Copyright (c) 1996-1997 by Fredrik Lundh
+#
+# See the README file for information on usage and redistribution.
+#
+
+import re
+
+from . import Image, ImageFile
+
+# XBM header
+xbm_head = re.compile(
+ br"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+"
+ b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+"
+ b"(?P"
+ b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+"
+ b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+"
+ b")?"
+ b"[\\000-\\377]*_bits\\[\\]"
+)
+
+
+def _accept(prefix):
+ return prefix.lstrip()[:7] == b"#define"
+
+
+##
+# Image plugin for X11 bitmaps.
+
+
+class XbmImageFile(ImageFile.ImageFile):
+
+ format = "XBM"
+ format_description = "X11 Bitmap"
+
+ def _open(self):
+
+ m = xbm_head.match(self.fp.read(512))
+
+ if m:
+
+ xsize = int(m.group("width"))
+ ysize = int(m.group("height"))
+
+ if m.group("hotspot"):
+ self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot")))
+
+ self.mode = "1"
+ self._size = xsize, ysize
+
+ self.tile = [("xbm", (0, 0) + self.size, m.end(), None)]
+
+
+def _save(im, fp, filename):
+
+ if im.mode != "1":
+ raise OSError("cannot write mode %s as XBM" % im.mode)
+
+ fp.write(("#define im_width %d\n" % im.size[0]).encode("ascii"))
+ fp.write(("#define im_height %d\n" % im.size[1]).encode("ascii"))
+
+ hotspot = im.encoderinfo.get("hotspot")
+ if hotspot:
+ fp.write(("#define im_x_hot %d\n" % hotspot[0]).encode("ascii"))
+ fp.write(("#define im_y_hot %d\n" % hotspot[1]).encode("ascii"))
+
+ fp.write(b"static char im_bits[] = {\n")
+
+ ImageFile._save(im, fp, [("xbm", (0, 0) + im.size, 0, None)])
+
+ fp.write(b"};\n")
+
+
+Image.register_open(XbmImageFile.format, XbmImageFile, _accept)
+Image.register_save(XbmImageFile.format, _save)
+
+Image.register_extension(XbmImageFile.format, ".xbm")
+
+Image.register_mime(XbmImageFile.format, "image/xbm")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/XpmImagePlugin.py b/geekshop/django_2.0/Lib/site-packages/PIL/XpmImagePlugin.py
new file mode 100644
index 0000000..d8bd00a
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/XpmImagePlugin.py
@@ -0,0 +1,130 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# XPM File handling
+#
+# History:
+# 1996-12-29 fl Created
+# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7)
+#
+# Copyright (c) Secret Labs AB 1997-2001.
+# Copyright (c) Fredrik Lundh 1996-2001.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+import re
+
+from . import Image, ImageFile, ImagePalette
+from ._binary import i8, o8
+
+# XPM header
+xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)')
+
+
+def _accept(prefix):
+ return prefix[:9] == b"/* XPM */"
+
+
+##
+# Image plugin for X11 pixel maps.
+
+
+class XpmImageFile(ImageFile.ImageFile):
+
+ format = "XPM"
+ format_description = "X11 Pixel Map"
+
+ def _open(self):
+
+ if not _accept(self.fp.read(9)):
+ raise SyntaxError("not an XPM file")
+
+ # skip forward to next string
+ while True:
+ s = self.fp.readline()
+ if not s:
+ raise SyntaxError("broken XPM file")
+ m = xpm_head.match(s)
+ if m:
+ break
+
+ self._size = int(m.group(1)), int(m.group(2))
+
+ pal = int(m.group(3))
+ bpp = int(m.group(4))
+
+ if pal > 256 or bpp != 1:
+ raise ValueError("cannot read this XPM file")
+
+ #
+ # load palette description
+
+ palette = [b"\0\0\0"] * 256
+
+ for i in range(pal):
+
+ s = self.fp.readline()
+ if s[-2:] == b"\r\n":
+ s = s[:-2]
+ elif s[-1:] in b"\r\n":
+ s = s[:-1]
+
+ c = i8(s[1])
+ s = s[2:-2].split()
+
+ for i in range(0, len(s), 2):
+
+ if s[i] == b"c":
+
+ # process colour key
+ rgb = s[i + 1]
+ if rgb == b"None":
+ self.info["transparency"] = c
+ elif rgb[0:1] == b"#":
+ # FIXME: handle colour names (see ImagePalette.py)
+ rgb = int(rgb[1:], 16)
+ palette[c] = (
+ o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255)
+ )
+ else:
+ # unknown colour
+ raise ValueError("cannot read this XPM file")
+ break
+
+ else:
+
+ # missing colour key
+ raise ValueError("cannot read this XPM file")
+
+ self.mode = "P"
+ self.palette = ImagePalette.raw("RGB", b"".join(palette))
+
+ self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1))]
+
+ def load_read(self, bytes):
+
+ #
+ # load all image data in one chunk
+
+ xsize, ysize = self.size
+
+ s = [None] * ysize
+
+ for i in range(ysize):
+ s[i] = self.fp.readline()[1 : xsize + 1].ljust(xsize)
+
+ return b"".join(s)
+
+
+#
+# Registry
+
+
+Image.register_open(XpmImageFile.format, XpmImageFile, _accept)
+
+Image.register_extension(XpmImageFile.format, ".xpm")
+
+Image.register_mime(XpmImageFile.format, "image/xpm")
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__init__.py b/geekshop/django_2.0/Lib/site-packages/PIL/__init__.py
new file mode 100644
index 0000000..f9cb157
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/__init__.py
@@ -0,0 +1,135 @@
+"""Pillow (Fork of the Python Imaging Library)
+
+Pillow is the friendly PIL fork by Alex Clark and Contributors.
+ https://github.com/python-pillow/Pillow/
+
+Pillow is forked from PIL 1.1.7.
+
+PIL is the Python Imaging Library by Fredrik Lundh and Contributors.
+Copyright (c) 1999 by Secret Labs AB.
+
+Use PIL.__version__ for this Pillow version.
+
+;-)
+"""
+
+import sys
+import warnings
+
+from . import _version
+
+# VERSION was removed in Pillow 6.0.0.
+__version__ = _version.__version__
+
+
+# PILLOW_VERSION is deprecated and will be removed in a future release.
+# Use __version__ instead.
+def _raise_version_warning():
+ warnings.warn(
+ "PILLOW_VERSION is deprecated and will be removed in a future release. "
+ "Use __version__ instead.",
+ DeprecationWarning,
+ stacklevel=3,
+ )
+
+
+if sys.version_info >= (3, 7):
+
+ def __getattr__(name):
+ if name == "PILLOW_VERSION":
+ _raise_version_warning()
+ return __version__
+ raise AttributeError("module '{}' has no attribute '{}'".format(__name__, name))
+
+
+else:
+
+ class _Deprecated_Version(str):
+ def __str__(self):
+ _raise_version_warning()
+ return super().__str__()
+
+ def __getitem__(self, key):
+ _raise_version_warning()
+ return super().__getitem__(key)
+
+ def __eq__(self, other):
+ _raise_version_warning()
+ return super().__eq__(other)
+
+ def __ne__(self, other):
+ _raise_version_warning()
+ return super().__ne__(other)
+
+ def __gt__(self, other):
+ _raise_version_warning()
+ return super().__gt__(other)
+
+ def __lt__(self, other):
+ _raise_version_warning()
+ return super().__lt__(other)
+
+ def __ge__(self, other):
+ _raise_version_warning()
+ return super().__gt__(other)
+
+ def __le__(self, other):
+ _raise_version_warning()
+ return super().__lt__(other)
+
+ PILLOW_VERSION = _Deprecated_Version(__version__)
+
+del _version
+
+
+_plugins = [
+ "BlpImagePlugin",
+ "BmpImagePlugin",
+ "BufrStubImagePlugin",
+ "CurImagePlugin",
+ "DcxImagePlugin",
+ "DdsImagePlugin",
+ "EpsImagePlugin",
+ "FitsStubImagePlugin",
+ "FliImagePlugin",
+ "FpxImagePlugin",
+ "FtexImagePlugin",
+ "GbrImagePlugin",
+ "GifImagePlugin",
+ "GribStubImagePlugin",
+ "Hdf5StubImagePlugin",
+ "IcnsImagePlugin",
+ "IcoImagePlugin",
+ "ImImagePlugin",
+ "ImtImagePlugin",
+ "IptcImagePlugin",
+ "JpegImagePlugin",
+ "Jpeg2KImagePlugin",
+ "McIdasImagePlugin",
+ "MicImagePlugin",
+ "MpegImagePlugin",
+ "MpoImagePlugin",
+ "MspImagePlugin",
+ "PalmImagePlugin",
+ "PcdImagePlugin",
+ "PcxImagePlugin",
+ "PdfImagePlugin",
+ "PixarImagePlugin",
+ "PngImagePlugin",
+ "PpmImagePlugin",
+ "PsdImagePlugin",
+ "SgiImagePlugin",
+ "SpiderImagePlugin",
+ "SunImagePlugin",
+ "TgaImagePlugin",
+ "TiffImagePlugin",
+ "WebPImagePlugin",
+ "WmfImagePlugin",
+ "XbmImagePlugin",
+ "XpmImagePlugin",
+ "XVThumbImagePlugin",
+]
+
+
+class UnidentifiedImageError(IOError):
+ pass
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__main__.py b/geekshop/django_2.0/Lib/site-packages/PIL/__main__.py
new file mode 100644
index 0000000..a05323f
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/__main__.py
@@ -0,0 +1,3 @@
+from .features import pilinfo
+
+pilinfo()
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-37.pyc
new file mode 100644
index 0000000..e425144
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..577bd91
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..df077d3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..0e2e461
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-37.pyc
new file mode 100644
index 0000000..8280e38
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..c781c6b
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..4186626
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..e594366
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..671603f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-37.pyc
new file mode 100644
index 0000000..cbae495
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..ad1ac0a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..5c69be4
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FontFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FontFile.cpython-37.pyc
new file mode 100644
index 0000000..64d53e3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FontFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..571d1e5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..1bc6f4e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..468a766
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-37.pyc
new file mode 100644
index 0000000..a93c774
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..41c0b3d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-37.pyc
new file mode 100644
index 0000000..698048a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-37.pyc
new file mode 100644
index 0000000..9a5fd74
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..ec2ada7
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..5fea773
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..0a5bb03
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..38995ec
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..56fec1a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Image.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Image.cpython-37.pyc
new file mode 100644
index 0000000..5954f94
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Image.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-37.pyc
new file mode 100644
index 0000000..cb118da
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-37.pyc
new file mode 100644
index 0000000..3bc4325
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-37.pyc
new file mode 100644
index 0000000..9fe20b5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-37.pyc
new file mode 100644
index 0000000..b200a83
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-37.pyc
new file mode 100644
index 0000000..3b807fb
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-37.pyc
new file mode 100644
index 0000000..c36056d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-37.pyc
new file mode 100644
index 0000000..e05d192
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-37.pyc
new file mode 100644
index 0000000..03ffe33
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-37.pyc
new file mode 100644
index 0000000..27fae4b
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-37.pyc
new file mode 100644
index 0000000..b135182
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-37.pyc
new file mode 100644
index 0000000..3deae8b
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-37.pyc
new file mode 100644
index 0000000..2d81021
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-37.pyc
new file mode 100644
index 0000000..f5525c4
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-37.pyc
new file mode 100644
index 0000000..4c2f7b9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-37.pyc
new file mode 100644
index 0000000..e44e1a8
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-37.pyc
new file mode 100644
index 0000000..59f50c4
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-37.pyc
new file mode 100644
index 0000000..9f4ddaf
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-37.pyc
new file mode 100644
index 0000000..c61879f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-37.pyc
new file mode 100644
index 0000000..128ea64
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-37.pyc
new file mode 100644
index 0000000..df04951
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-37.pyc
new file mode 100644
index 0000000..fafb4a9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-37.pyc
new file mode 100644
index 0000000..643ce5a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-37.pyc
new file mode 100644
index 0000000..352d27d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..ea0b2d5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..a378e4a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..8b592ee
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..aa65b4c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-37.pyc
new file mode 100644
index 0000000..084127e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..be06519
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..c1c9ee1
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..487786c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..24c1d86
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..ba4d44d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-37.pyc
new file mode 100644
index 0000000..5b5faca
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-37.pyc
new file mode 100644
index 0000000..39204e8
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..c9b81ae
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..ecc18cd
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-37.pyc
new file mode 100644
index 0000000..e4294a9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..77585c7
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..2d365fd
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-37.pyc
new file mode 100644
index 0000000..160f40f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..ae33f44
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..1b0e176
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..9db82b7
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..58f0942
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-37.pyc
new file mode 100644
index 0000000..7dbe928
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..c0eb8fe
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..f7a2769
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..2190f90
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TarIO.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TarIO.cpython-37.pyc
new file mode 100644
index 0000000..673306d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TarIO.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..cfa7229
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..9c8f075
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-37.pyc
new file mode 100644
index 0000000..62b4f0a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-37.pyc
new file mode 100644
index 0000000..429e849
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..5795982
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..93313a9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..694b7d9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..c061cdd
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-37.pyc
new file mode 100644
index 0000000..4ffdb64
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..29f228c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/__main__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/__main__.cpython-37.pyc
new file mode 100644
index 0000000..a6794a7
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/__main__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_binary.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_binary.cpython-37.pyc
new file mode 100644
index 0000000..393417d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_binary.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-37.pyc
new file mode 100644
index 0000000..fa7ffc6
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_util.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_util.cpython-37.pyc
new file mode 100644
index 0000000..227bfc2
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_util.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_version.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_version.cpython-37.pyc
new file mode 100644
index 0000000..c470bcd
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/_version.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/features.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/features.cpython-37.pyc
new file mode 100644
index 0000000..868adc2
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/__pycache__/features.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_binary.py b/geekshop/django_2.0/Lib/site-packages/PIL/_binary.py
new file mode 100644
index 0000000..529b8c9
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/_binary.py
@@ -0,0 +1,88 @@
+#
+# The Python Imaging Library.
+# $Id$
+#
+# Binary input/output support routines.
+#
+# Copyright (c) 1997-2003 by Secret Labs AB
+# Copyright (c) 1995-2003 by Fredrik Lundh
+# Copyright (c) 2012 by Brian Crowell
+#
+# See the README file for information on usage and redistribution.
+#
+
+from struct import pack, unpack_from
+
+
+def i8(c):
+ return c if c.__class__ is int else c[0]
+
+
+def o8(i):
+ return bytes((i & 255,))
+
+
+# Input, le = little endian, be = big endian
+def i16le(c, o=0):
+ """
+ Converts a 2-bytes (16 bits) string to an unsigned integer.
+
+ :param c: string containing bytes to convert
+ :param o: offset of bytes to convert in string
+ """
+ return unpack_from("H", c, o)[0]
+
+
+def i32be(c, o=0):
+ return unpack_from(">I", c, o)[0]
+
+
+# Output, le = little endian, be = big endian
+def o16le(i):
+ return pack("H", i)
+
+
+def o32be(i):
+ return pack(">I", i)
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_imaging.cp37-win32.pyd b/geekshop/django_2.0/Lib/site-packages/PIL/_imaging.cp37-win32.pyd
new file mode 100644
index 0000000..43e65ad
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/_imaging.cp37-win32.pyd differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_imagingcms.cp37-win32.pyd b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingcms.cp37-win32.pyd
new file mode 100644
index 0000000..93c7abf
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingcms.cp37-win32.pyd differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_imagingft.cp37-win32.pyd b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingft.cp37-win32.pyd
new file mode 100644
index 0000000..e13bf87
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingft.cp37-win32.pyd differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_imagingmath.cp37-win32.pyd b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingmath.cp37-win32.pyd
new file mode 100644
index 0000000..f8e09d9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingmath.cp37-win32.pyd differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_imagingmorph.cp37-win32.pyd b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingmorph.cp37-win32.pyd
new file mode 100644
index 0000000..d9c0efa
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingmorph.cp37-win32.pyd differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_imagingtk.cp37-win32.pyd b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingtk.cp37-win32.pyd
new file mode 100644
index 0000000..83d5736
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/_imagingtk.cp37-win32.pyd differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_tkinter_finder.py b/geekshop/django_2.0/Lib/site-packages/PIL/_tkinter_finder.py
new file mode 100644
index 0000000..3049306
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/_tkinter_finder.py
@@ -0,0 +1,16 @@
+""" Find compiled module linking to Tcl / Tk libraries
+"""
+import sys
+from tkinter import _tkinter as tk
+
+if hasattr(sys, "pypy_find_executable"):
+ # Tested with packages at https://bitbucket.org/pypy/pypy/downloads.
+ # PyPies 1.6, 2.0 do not have tkinter built in. PyPy3-2.3.1 gives an
+ # OSError trying to import tkinter. Otherwise:
+ try: # PyPy 5.1, 4.0.0, 2.6.1, 2.6.0
+ TKINTER_LIB = tk.tklib_cffi.__file__
+ except AttributeError:
+ # PyPy3 2.4, 2.1-beta1; PyPy 2.5.1, 2.5.0, 2.4.0, 2.3, 2.2, 2.1
+ TKINTER_LIB = tk.tkffi.verifier.modulefilename
+else:
+ TKINTER_LIB = tk.__file__
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_util.py b/geekshop/django_2.0/Lib/site-packages/PIL/_util.py
new file mode 100644
index 0000000..755b4b2
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/_util.py
@@ -0,0 +1,30 @@
+import os
+import sys
+
+py36 = sys.version_info[0:2] >= (3, 6)
+
+
+if py36:
+ from pathlib import Path
+
+ def isPath(f):
+ return isinstance(f, (bytes, str, Path))
+
+
+else:
+
+ def isPath(f):
+ return isinstance(f, (bytes, str))
+
+
+# Checks if an object is a string, and that it points to a directory.
+def isDirectory(f):
+ return isPath(f) and os.path.isdir(f)
+
+
+class deferred_error:
+ def __init__(self, ex):
+ self.ex = ex
+
+ def __getattr__(self, elt):
+ raise self.ex
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_version.py b/geekshop/django_2.0/Lib/site-packages/PIL/_version.py
new file mode 100644
index 0000000..1af2909
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/_version.py
@@ -0,0 +1,2 @@
+# Master version for Pillow
+__version__ = "7.1.2"
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/_webp.cp37-win32.pyd b/geekshop/django_2.0/Lib/site-packages/PIL/_webp.cp37-win32.pyd
new file mode 100644
index 0000000..c91db4f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/PIL/_webp.cp37-win32.pyd differ
diff --git a/geekshop/django_2.0/Lib/site-packages/PIL/features.py b/geekshop/django_2.0/Lib/site-packages/PIL/features.py
new file mode 100644
index 0000000..ac06c0f
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/PIL/features.py
@@ -0,0 +1,173 @@
+import collections
+import os
+import sys
+import warnings
+
+import PIL
+
+from . import Image
+
+modules = {
+ "pil": "PIL._imaging",
+ "tkinter": "PIL._tkinter_finder",
+ "freetype2": "PIL._imagingft",
+ "littlecms2": "PIL._imagingcms",
+ "webp": "PIL._webp",
+}
+
+
+def check_module(feature):
+ if not (feature in modules):
+ raise ValueError("Unknown module %s" % feature)
+
+ module = modules[feature]
+
+ try:
+ __import__(module)
+ return True
+ except ImportError:
+ return False
+
+
+def get_supported_modules():
+ return [f for f in modules if check_module(f)]
+
+
+codecs = {"jpg": "jpeg", "jpg_2000": "jpeg2k", "zlib": "zip", "libtiff": "libtiff"}
+
+
+def check_codec(feature):
+ if feature not in codecs:
+ raise ValueError("Unknown codec %s" % feature)
+
+ codec = codecs[feature]
+
+ return codec + "_encoder" in dir(Image.core)
+
+
+def get_supported_codecs():
+ return [f for f in codecs if check_codec(f)]
+
+
+features = {
+ "webp_anim": ("PIL._webp", "HAVE_WEBPANIM"),
+ "webp_mux": ("PIL._webp", "HAVE_WEBPMUX"),
+ "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY"),
+ "raqm": ("PIL._imagingft", "HAVE_RAQM"),
+ "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO"),
+ "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT"),
+ "xcb": ("PIL._imaging", "HAVE_XCB"),
+}
+
+
+def check_feature(feature):
+ if feature not in features:
+ raise ValueError("Unknown feature %s" % feature)
+
+ module, flag = features[feature]
+
+ try:
+ imported_module = __import__(module, fromlist=["PIL"])
+ return getattr(imported_module, flag)
+ except ImportError:
+ return None
+
+
+def get_supported_features():
+ return [f for f in features if check_feature(f)]
+
+
+def check(feature):
+ if feature in modules:
+ return check_module(feature)
+ if feature in codecs:
+ return check_codec(feature)
+ if feature in features:
+ return check_feature(feature)
+ warnings.warn("Unknown feature '%s'." % feature, stacklevel=2)
+ return False
+
+
+def get_supported():
+ ret = get_supported_modules()
+ ret.extend(get_supported_features())
+ ret.extend(get_supported_codecs())
+ return ret
+
+
+def pilinfo(out=None, supported_formats=True):
+ if out is None:
+ out = sys.stdout
+
+ Image.init()
+
+ print("-" * 68, file=out)
+ print("Pillow {}".format(PIL.__version__), file=out)
+ py_version = sys.version.splitlines()
+ print("Python {}".format(py_version[0].strip()), file=out)
+ for py_version in py_version[1:]:
+ print(" {}".format(py_version.strip()), file=out)
+ print("-" * 68, file=out)
+ print(
+ "Python modules loaded from {}".format(os.path.dirname(Image.__file__)),
+ file=out,
+ )
+ print(
+ "Binary modules loaded from {}".format(os.path.dirname(Image.core.__file__)),
+ file=out,
+ )
+ print("-" * 68, file=out)
+
+ for name, feature in [
+ ("pil", "PIL CORE"),
+ ("tkinter", "TKINTER"),
+ ("freetype2", "FREETYPE2"),
+ ("littlecms2", "LITTLECMS2"),
+ ("webp", "WEBP"),
+ ("transp_webp", "WEBP Transparency"),
+ ("webp_mux", "WEBPMUX"),
+ ("webp_anim", "WEBP Animation"),
+ ("jpg", "JPEG"),
+ ("jpg_2000", "OPENJPEG (JPEG2000)"),
+ ("zlib", "ZLIB (PNG/ZIP)"),
+ ("libtiff", "LIBTIFF"),
+ ("raqm", "RAQM (Bidirectional Text)"),
+ ("libimagequant", "LIBIMAGEQUANT (Quantization method)"),
+ ("xcb", "XCB (X protocol)"),
+ ]:
+ if check(name):
+ print("---", feature, "support ok", file=out)
+ else:
+ print("***", feature, "support not installed", file=out)
+ print("-" * 68, file=out)
+
+ if supported_formats:
+ extensions = collections.defaultdict(list)
+ for ext, i in Image.EXTENSION.items():
+ extensions[i].append(ext)
+
+ for i in sorted(Image.ID):
+ line = "{}".format(i)
+ if i in Image.MIME:
+ line = "{} {}".format(line, Image.MIME[i])
+ print(line, file=out)
+
+ if i in extensions:
+ print(
+ "Extensions: {}".format(", ".join(sorted(extensions[i]))), file=out
+ )
+
+ features = []
+ if i in Image.OPEN:
+ features.append("open")
+ if i in Image.SAVE:
+ features.append("save")
+ if i in Image.SAVE_ALL:
+ features.append("save_all")
+ if i in Image.DECODERS:
+ features.append("decode")
+ if i in Image.ENCODERS:
+ features.append("encode")
+
+ print("Features: {}".format(", ".join(features)), file=out)
+ print("-" * 68, file=out)
diff --git a/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/INSTALLER b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/INSTALLER
new file mode 100644
index 0000000..a1b589e
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/LICENSE b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/LICENSE
new file mode 100644
index 0000000..4aac532
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/LICENSE
@@ -0,0 +1,30 @@
+The Python Imaging Library (PIL) is
+
+ Copyright © 1997-2011 by Secret Labs AB
+ Copyright © 1995-2011 by Fredrik Lundh
+
+Pillow is the friendly PIL fork. It is
+
+ Copyright © 2010-2020 by Alex Clark and contributors
+
+Like PIL, Pillow is licensed under the open source PIL Software License:
+
+By obtaining, using, and/or copying this software and/or its associated
+documentation, you agree that you have read, understood, and will comply
+with the following terms and conditions:
+
+Permission to use, copy, modify, and distribute this software and its
+associated documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appears in all copies, and that
+both that copyright notice and this permission notice appear in supporting
+documentation, and that the name of Secret Labs AB or the author not be
+used in advertising or publicity pertaining to distribution of the software
+without specific, written prior permission.
+
+SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL,
+INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/METADATA b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/METADATA
new file mode 100644
index 0000000..099c415
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/METADATA
@@ -0,0 +1,135 @@
+Metadata-Version: 2.1
+Name: Pillow
+Version: 7.1.2
+Summary: Python Imaging Library (Fork)
+Home-page: https://python-pillow.org
+Author: Alex Clark (PIL Fork Author)
+Author-email: aclark@python-pillow.org
+License: HPND
+Project-URL: Documentation, https://pillow.readthedocs.io
+Project-URL: Source, https://github.com/python-pillow/Pillow
+Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=pypi
+Keywords: Imaging
+Platform: UNKNOWN
+Classifier: Development Status :: 6 - Mature
+Classifier: License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Multimedia :: Graphics
+Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera
+Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture
+Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
+Classifier: Topic :: Multimedia :: Graphics :: Viewers
+Requires-Python: >=3.5
+
+Pillow
+======
+
+Python Imaging Library (Fork)
+-----------------------------
+
+Pillow is the friendly PIL fork by `Alex Clark and Contributors `_. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. As of 2019, Pillow development is `supported by Tidelift `_.
+
+.. start-badges
+
+.. list-table::
+ :stub-columns: 1
+
+ * - docs
+ - |docs|
+ * - tests
+ - |linux| |macos| |windows| |gha_lint| |gha| |gha_windows| |gha_docker| |coverage|
+ * - package
+ - |zenodo| |tidelift| |version| |downloads|
+ * - social
+ - |gitter| |twitter|
+
+.. end-badges
+
+More Information
+----------------
+
+- `Documentation `_
+
+ - `Installation `_
+ - `Handbook `_
+
+- `Contribute `_
+
+ - `Issues `_
+ - `Pull requests `_
+
+- `Changelog `_
+
+ - `Pre-fork `_
+
+Report a Vulnerability
+----------------------
+
+To report a security vulnerability, please follow the procedure described in the `Tidelift security policy `_.
+
+.. |docs| image:: https://readthedocs.org/projects/pillow/badge/?version=latest
+ :target: https://pillow.readthedocs.io/?badge=latest
+ :alt: Documentation Status
+
+.. |linux| image:: https://img.shields.io/travis/python-pillow/Pillow/master.svg?label=Linux%20build
+ :target: https://travis-ci.org/python-pillow/Pillow
+ :alt: Travis CI build status (Linux)
+
+.. |macos| image:: https://img.shields.io/travis/python-pillow/pillow-wheels/master.svg?label=macOS%20build
+ :target: https://travis-ci.org/python-pillow/pillow-wheels
+ :alt: Travis CI build status (macOS)
+
+.. |windows| image:: https://img.shields.io/appveyor/build/python-pillow/Pillow/master.svg?label=Windows%20build
+ :target: https://ci.appveyor.com/project/python-pillow/Pillow
+ :alt: AppVeyor CI build status (Windows)
+
+.. |gha_lint| image:: https://github.com/python-pillow/Pillow/workflows/Lint/badge.svg
+ :target: https://github.com/python-pillow/Pillow/actions?query=workflow%3ALint
+ :alt: GitHub Actions build status (Lint)
+
+.. |gha_docker| image:: https://github.com/python-pillow/Pillow/workflows/Test%20Docker/badge.svg
+ :target: https://github.com/python-pillow/Pillow/actions?query=workflow%3A%22Test+Docker%22
+ :alt: GitHub Actions build status (Test Docker)
+
+.. |gha| image:: https://github.com/python-pillow/Pillow/workflows/Test/badge.svg
+ :target: https://github.com/python-pillow/Pillow/actions?query=workflow%3ATest
+ :alt: GitHub Actions build status (Test Linux and macOS)
+
+.. |gha_windows| image:: https://github.com/python-pillow/Pillow/workflows/Test%20Windows/badge.svg
+ :target: https://github.com/python-pillow/Pillow/actions?query=workflow%3A%22Test+Windows%22
+ :alt: GitHub Actions build status (Test Windows)
+
+.. |coverage| image:: https://codecov.io/gh/python-pillow/Pillow/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/python-pillow/Pillow
+ :alt: Code coverage
+
+.. |zenodo| image:: https://zenodo.org/badge/17549/python-pillow/Pillow.svg
+ :target: https://zenodo.org/badge/latestdoi/17549/python-pillow/Pillow
+
+.. |tidelift| image:: https://tidelift.com/badges/package/pypi/Pillow?style=flat
+ :target: https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=badge
+
+.. |version| image:: https://img.shields.io/pypi/v/pillow.svg
+ :target: https://pypi.org/project/Pillow/
+ :alt: Latest PyPI version
+
+.. |downloads| image:: https://img.shields.io/pypi/dm/pillow.svg
+ :target: https://pypi.org/project/Pillow/
+ :alt: Number of PyPI downloads
+
+.. |gitter| image:: https://badges.gitter.im/python-pillow/Pillow.svg
+ :target: https://gitter.im/python-pillow/Pillow?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
+ :alt: Join the chat at https://gitter.im/python-pillow/Pillow
+
+.. |twitter| image:: https://img.shields.io/badge/tweet-on%20Twitter-00aced.svg
+ :target: https://twitter.com/PythonPillow
+ :alt: Follow on https://twitter.com/PythonPillow
+
+
diff --git a/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/RECORD b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/RECORD
new file mode 100644
index 0000000..5b421e9
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/RECORD
@@ -0,0 +1,198 @@
+PIL/BdfFontFile.py,sha256=epsaoWXIrA2drdxGcKpZHmmSjiFCz_Iqj8WR8z96ot0,2949
+PIL/BlpImagePlugin.py,sha256=Nj29dU_KVv-AOYSTtaYXAcLsysxT7xa3hyBY0wZkTxY,14284
+PIL/BmpImagePlugin.py,sha256=2_RkJOQ9WwEw9H-NaqKQ9ycYr0618VdEpI6zmJppYg0,14363
+PIL/BufrStubImagePlugin.py,sha256=Zq60GwcqQJTmZJrA9EQq94QvYpNqwYvQzHojh4U7SDw,1520
+PIL/ContainerIO.py,sha256=8AtUg8NcJ9Majx4nXyCZ0aQngziGm6xXFWK_LugIUZs,2865
+PIL/CurImagePlugin.py,sha256=zhFOIWO0Id1kDqO3bL-6P27Y142mseLx9eOzsWs2hyQ,1681
+PIL/DcxImagePlugin.py,sha256=WReuwzYzESJxQeH_zgprW07TM3VoMU-4GM9WX1TIOwU,2210
+PIL/DdsImagePlugin.py,sha256=llS29X6w-oFTyflc7ta7jiFHE4PWqnHgpXlrVO-Zmgo,5466
+PIL/EpsImagePlugin.py,sha256=XOB-1_CADyab4766c4EpyXLNpf2a4MI5LSKvapoAntA,12111
+PIL/ExifTags.py,sha256=gQUj5WEwjSHBTL4gv9LBv6cJkflS_SUoY4XRrmeO05Y,9009
+PIL/FitsStubImagePlugin.py,sha256=8Zq2D9ReJE-stBppxB_ELX3wxcS0_BDGg6Xce7sWpaU,1624
+PIL/FliImagePlugin.py,sha256=zPxBa3Rywa-e80yBuL2Dp7kbNe4P2kXZeG6jNIwJIwc,4397
+PIL/FontFile.py,sha256=UltxrH04n6VLwsdW8DH169sF_M7WALAJEDthe652z6w,2762
+PIL/FpxImagePlugin.py,sha256=Q2fM2YoTbC7ICvfSTvm3helXAVC8GdnPe4KN_Lb0HQE,6658
+PIL/FtexImagePlugin.py,sha256=-iysUmqEEOORhWBQCou0gqrgSwsMBqcr6qyWbrNptSE,3307
+PIL/GbrImagePlugin.py,sha256=zpJPwd1wWQ3KeD7NSLAiZH8IFMT84Edv6RTeVcIJRHw,2732
+PIL/GdImageFile.py,sha256=zPj4NgjtyiMHlvpqXcusUtMXqaDyCEtk0mJ7Rrm-7eo,2361
+PIL/GifImagePlugin.py,sha256=jlXrfBHL-4W0dI9mQxiYUb7lHC5Z28DPfbP0F27cFQc,28881
+PIL/GimpGradientFile.py,sha256=p4stFsE6KN7ccutuD-Dgw683W1ZkkiDRMPEx_hVfBIg,3335
+PIL/GimpPaletteFile.py,sha256=nojoDi1oTefsfgl-rdQgrIkHcu7TReiE0rj14XYI__A,1270
+PIL/GribStubImagePlugin.py,sha256=gtLF7drAx66O9OOE_lJ1GgtLzjULoQDzFWT0sms7l98,1543
+PIL/Hdf5StubImagePlugin.py,sha256=zjtFPZIcVkWXvYRPnHow6XA9kElEi772w7PFSuEqmq4,1517
+PIL/IcnsImagePlugin.py,sha256=Hk_LbNsSiN1_77QvMebbczLPtQfY5NHUHScNRxQJ8dU,11487
+PIL/IcoImagePlugin.py,sha256=BrFX4_d-HBe0Sn6htQNX5V3LI-HxZnW9QGYG9t3yr7A,10134
+PIL/ImImagePlugin.py,sha256=WIdxuZQpSmszdhrQKmHR8n2cyytAffWWGNcHDNrOQQM,10801
+PIL/Image.py,sha256=uPhn-HOLPfm7lQ-GIakN7iYBtLwzP1hvebuJQCwJHU4,113584
+PIL/ImageChops.py,sha256=hAmXF1T4bo6VWsRbklRiDwZkroZWOT_QrA8KfTfyrsE,7583
+PIL/ImageCms.py,sha256=2RM6XUdM-2fkxpRWfrlpYgLIZhRwFMTOKH_yuXld5wA,35925
+PIL/ImageColor.py,sha256=g0yVp1VyRBieKf2n18gh5w9BaveRtp5LK-4WNYmZTE8,8634
+PIL/ImageDraw.py,sha256=_G5IRYYsPyn30-0P62iiCSnAdP0bkAV7il_HI2_iUDs,19184
+PIL/ImageDraw2.py,sha256=lzpfTcL9P89ie6B8fHw8Oa7kVynEDkBoIZU9CqehJWg,3094
+PIL/ImageEnhance.py,sha256=CJnCouiBmxN2fE0xW7m_uMdBqcm-Fp0S3ruHhkygal4,3190
+PIL/ImageFile.py,sha256=jo49NsAbA-U_k-lAJ5odsixeNgZTxRA1s9SUYl9n8wI,20733
+PIL/ImageFilter.py,sha256=1lE8Kh3bYW9iLEh-1w-n_uuRU9dM1xuzQ6PYR9hlc0Q,15875
+PIL/ImageFont.py,sha256=dsejfyIrM67w4MRu3PP5lmUVaC2F68XibWHeprmrfO8,35803
+PIL/ImageGrab.py,sha256=OKtTqG99-h_0b5zl7hGOeCOFgT7VF9R2dIXQcurj-mg,3119
+PIL/ImageMath.py,sha256=pOqkQrzYtVlMJau-9gc0k05Co8mFgAf72bcF8B9ZDMk,7030
+PIL/ImageMode.py,sha256=gI88wDgAc4y-m46vTA4zPmipG12wpYLNXPRHyPZBZaY,1638
+PIL/ImageMorph.py,sha256=S_ZN_u6QwmqphSnv6iqobbqv1-CKxNGNJqSQ7i8MyrM,7896
+PIL/ImageOps.py,sha256=Mm8dmGeaUJx2V3LViRO_yUNJA7I_tLtxf99kJitU-0M,18022
+PIL/ImagePalette.py,sha256=P2bk85ZRp7yz37t9K4i4pqlaTIP9-LqcSDdqK8f_kLc,6340
+PIL/ImagePath.py,sha256=lVmH1-lCd0SyrFoqyhlstAFW2iJuC14fPcW8iewvxCQ,336
+PIL/ImageQt.py,sha256=gmEmlYQ5p3NcN80TK0Q5BRLf2w0LQBJbh8PdPfUwZsU,5975
+PIL/ImageSequence.py,sha256=9x8Kt9xfYcgdGEOhpNHQyse6mZ4U5mr5i6B4we6ugiw,1826
+PIL/ImageShow.py,sha256=Uhn3uYFv3MwsbVUvHcUIf7ltJmgzV_cY9sa-jhJ4z4Q,5586
+PIL/ImageStat.py,sha256=PieQi44mRHE6jod7NqujwGr6WCntuZuNGmC2z9PaoDY,3901
+PIL/ImageTk.py,sha256=LqiRd0wkODL-7GI4gZm2fAlmtUDw7keLZj_dtRmqug8,9328
+PIL/ImageTransform.py,sha256=V2l6tsjmymMIF7HQBMI21UPn4mlicarrm4NF3Kazvio,2843
+PIL/ImageWin.py,sha256=Lkow26xrO2ISACwKus5OEUIbrKQqytbd4uKrvX61E_c,7178
+PIL/ImtImagePlugin.py,sha256=cn60lqUVnK2oh_sPqPBORr_rZ4zuF_6FU0V96IAh8Ww,2203
+PIL/IptcImagePlugin.py,sha256=I0Cy1DyEhkAt_IGyKBLpJoedtm0to-kAltt5YYfyHkg,5658
+PIL/Jpeg2KImagePlugin.py,sha256=3NAbqBmvSU_fHUIGspXFsVQV7uYMydN2Rj8jP2bGdiA,8722
+PIL/JpegImagePlugin.py,sha256=47WI_AvgBeIWJjrd9wxw8o2lWrhUA9-h08yj6S1GThw,27724
+PIL/JpegPresets.py,sha256=iDIC9Z0jIcOBc_O1aSdmTTYQ0pssEFVntO1VLatmgm8,12543
+PIL/McIdasImagePlugin.py,sha256=LrP5nA7l8IQG3WhlMI0Xs8fGXY_uf6IDmzNCERl3tGw,1754
+PIL/MicImagePlugin.py,sha256=8oeVGkqKKBlo2Glx2Qtm9-jJEgfxkSsS-Tq2vsjKyLM,2643
+PIL/MpegImagePlugin.py,sha256=n16Zgdy8Hcfke16lQwZWs53PZq4BA_OxPCMPDkW62nw,1803
+PIL/MpoImagePlugin.py,sha256=UNYjKN-S7-u5fO5tPipsdpmZfFPbwjgNzzT5a8k_m-8,4358
+PIL/MspImagePlugin.py,sha256=BS2f5KqE5dl5qzrPYkC9lYgvNUbqnV9cyQynJA2yQhE,5523
+PIL/PSDraw.py,sha256=zySuABiEoP2TW_7DypJaS9ByWpxqPjmP43gCjXOghRA,6735
+PIL/PaletteFile.py,sha256=jyyTO4Wr23CW8itzKdmfBZl80yFUIXXIJXTJcSauV0Q,1102
+PIL/PalmImagePlugin.py,sha256=mOjyMQUJcehgMwKraonk_7vTMBYwWZdgWHHvcZLxBcc,9106
+PIL/PcdImagePlugin.py,sha256=iBuIYSh2ff69V_DqG3yiMtvn9-wQkKkpdrmXbXYBluM,1504
+PIL/PcfFontFile.py,sha256=dVuWLe_cHzyNxTdVhZnXqkdJLCNZK8_fK8icdVXF4FM,6265
+PIL/PcxImagePlugin.py,sha256=94IR_l69YPGLzzUtPgMNYN4ruvKh1set8GKA3IB2W9Y,5471
+PIL/PdfImagePlugin.py,sha256=sS6VL5uZvipBn3gkPEA8qEpb3gaKtNxhH6sHia11x4o,7574
+PIL/PdfParser.py,sha256=2DiLup-bwfwXl_nmZiGiZjMa3-4KKBtGMwyA79flb3Y,34398
+PIL/PixarImagePlugin.py,sha256=uUSiki2xPNnMPk6sGkVcVaTTwP_EYRYBPxnc_KLWDZY,1657
+PIL/PngImagePlugin.py,sha256=3gKAZCqm4JKA4pfXaU9_m1a5vXbmzqxpn6VsDbkZ0sM,42058
+PIL/PpmImagePlugin.py,sha256=YrtSj-K7XQjb1dW7Y8G6I21-xXAVJ4YqPuNwOJosVTE,4451
+PIL/PsdImagePlugin.py,sha256=PgkO6zl6QBbCH8QOMKxAWhBAy75-sLx97YFoNJFjaFs,7681
+PIL/PyAccess.py,sha256=uULz68pX-v43ITkYpOinYpNPGzFZ6T93__Q8lZnv1nw,9348
+PIL/SgiImagePlugin.py,sha256=ptxDphmBw6nwyPDP1vDyAEblj0AkMMrzWjHqTwl-FGo,6128
+PIL/SpiderImagePlugin.py,sha256=6bBwA1r_abdk8rN3SLKTHRfNPHOnEoqeAuC-yf6Bv_s,9526
+PIL/SunImagePlugin.py,sha256=juCAdHToHi2ezdmPGQkOCEYNm5zErbQ8i7WN87TOg4o,4308
+PIL/TarIO.py,sha256=SQMuHt_V72TkX3oV4OlJbu3Srbu7X9Cubso4dneolzo,1437
+PIL/TgaImagePlugin.py,sha256=0WOYqMMCPYHl12oiqL8FoNxEKvEepwS30vQIxOUAf0c,6256
+PIL/TiffImagePlugin.py,sha256=wMguVtt80bIZjB7ruw1V7JZrpbzN0aj1VZYKnesCFYw,67694
+PIL/TiffTags.py,sha256=fd1Bq5-qElYAmQn5X9JaDHbyvWI3JL6roDiDx__mYqk,14603
+PIL/WalImageFile.py,sha256=peDulGQqG7MMJsSL-G5naTNRPhPzip3xKywk4HFAACA,5471
+PIL/WebPImagePlugin.py,sha256=Kgft6nmP5UQuz90bLPnyEdTlEFLDfNA-YiNrFJAgg-0,11032
+PIL/WmfImagePlugin.py,sha256=D7kFCuEPLZcdOoGg5Ab3jGBRJiAPy6nYd0WbDfsYPp8,4612
+PIL/XVThumbImagePlugin.py,sha256=sYdEiHkRT5U8JG-VMzjTlErNUGLnMqFJxHVPheyqXgo,1948
+PIL/XbmImagePlugin.py,sha256=rCNKI-dem3N-NIvRvepuQ9MzAWkSWS7C5FNpNInYfOg,2448
+PIL/XpmImagePlugin.py,sha256=BTgbV-ij_1Lw5u5yCWVOI_ZWUoif1-3AoQ0uszigrfE,3070
+PIL/__init__.py,sha256=LV6JUlQtx_XQRjet0UCjcbbFJTJ7fJALl3-E0Ug9Wko,3163
+PIL/__main__.py,sha256=axR7PO-HtXp-o0rBhKIxs0wark0rBfaDIhAIWqtWUo4,41
+PIL/__pycache__/BdfFontFile.cpython-37.pyc,,
+PIL/__pycache__/BlpImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/BmpImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/BufrStubImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/ContainerIO.cpython-37.pyc,,
+PIL/__pycache__/CurImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/DcxImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/DdsImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/EpsImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/ExifTags.cpython-37.pyc,,
+PIL/__pycache__/FitsStubImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/FliImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/FontFile.cpython-37.pyc,,
+PIL/__pycache__/FpxImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/FtexImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/GbrImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/GdImageFile.cpython-37.pyc,,
+PIL/__pycache__/GifImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/GimpGradientFile.cpython-37.pyc,,
+PIL/__pycache__/GimpPaletteFile.cpython-37.pyc,,
+PIL/__pycache__/GribStubImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/Hdf5StubImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/IcnsImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/IcoImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/ImImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/Image.cpython-37.pyc,,
+PIL/__pycache__/ImageChops.cpython-37.pyc,,
+PIL/__pycache__/ImageCms.cpython-37.pyc,,
+PIL/__pycache__/ImageColor.cpython-37.pyc,,
+PIL/__pycache__/ImageDraw.cpython-37.pyc,,
+PIL/__pycache__/ImageDraw2.cpython-37.pyc,,
+PIL/__pycache__/ImageEnhance.cpython-37.pyc,,
+PIL/__pycache__/ImageFile.cpython-37.pyc,,
+PIL/__pycache__/ImageFilter.cpython-37.pyc,,
+PIL/__pycache__/ImageFont.cpython-37.pyc,,
+PIL/__pycache__/ImageGrab.cpython-37.pyc,,
+PIL/__pycache__/ImageMath.cpython-37.pyc,,
+PIL/__pycache__/ImageMode.cpython-37.pyc,,
+PIL/__pycache__/ImageMorph.cpython-37.pyc,,
+PIL/__pycache__/ImageOps.cpython-37.pyc,,
+PIL/__pycache__/ImagePalette.cpython-37.pyc,,
+PIL/__pycache__/ImagePath.cpython-37.pyc,,
+PIL/__pycache__/ImageQt.cpython-37.pyc,,
+PIL/__pycache__/ImageSequence.cpython-37.pyc,,
+PIL/__pycache__/ImageShow.cpython-37.pyc,,
+PIL/__pycache__/ImageStat.cpython-37.pyc,,
+PIL/__pycache__/ImageTk.cpython-37.pyc,,
+PIL/__pycache__/ImageTransform.cpython-37.pyc,,
+PIL/__pycache__/ImageWin.cpython-37.pyc,,
+PIL/__pycache__/ImtImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/IptcImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/Jpeg2KImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/JpegImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/JpegPresets.cpython-37.pyc,,
+PIL/__pycache__/McIdasImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/MicImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/MpegImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/MpoImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/MspImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PSDraw.cpython-37.pyc,,
+PIL/__pycache__/PaletteFile.cpython-37.pyc,,
+PIL/__pycache__/PalmImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PcdImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PcfFontFile.cpython-37.pyc,,
+PIL/__pycache__/PcxImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PdfImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PdfParser.cpython-37.pyc,,
+PIL/__pycache__/PixarImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PngImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PpmImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PsdImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/PyAccess.cpython-37.pyc,,
+PIL/__pycache__/SgiImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/SpiderImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/SunImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/TarIO.cpython-37.pyc,,
+PIL/__pycache__/TgaImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/TiffImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/TiffTags.cpython-37.pyc,,
+PIL/__pycache__/WalImageFile.cpython-37.pyc,,
+PIL/__pycache__/WebPImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/WmfImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/XVThumbImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/XbmImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/XpmImagePlugin.cpython-37.pyc,,
+PIL/__pycache__/__init__.cpython-37.pyc,,
+PIL/__pycache__/__main__.cpython-37.pyc,,
+PIL/__pycache__/_binary.cpython-37.pyc,,
+PIL/__pycache__/_tkinter_finder.cpython-37.pyc,,
+PIL/__pycache__/_util.cpython-37.pyc,,
+PIL/__pycache__/_version.cpython-37.pyc,,
+PIL/__pycache__/features.cpython-37.pyc,,
+PIL/_binary.py,sha256=aH26Khw74n_pP3NTMp9jXBw8cpYo_V8ea2yXdbKYWjQ,1746
+PIL/_imaging.cp37-win32.pyd,sha256=lYm7MSiPCEwxFzndk0qup_jQPvM22qAvQg1JzUL2KRo,2208768
+PIL/_imagingcms.cp37-win32.pyd,sha256=Cd1WF515HLzHCxnl18yvv2S8Bfl_wM7TBFbzAK8ykuc,190976
+PIL/_imagingft.cp37-win32.pyd,sha256=nRzWIo4EJDmW89gv9fZSEHgi-4l_R8odja0evsQ65sQ,503808
+PIL/_imagingmath.cp37-win32.pyd,sha256=ZOw2e9hMYN--rrROSfGP_-QHI7MVAM98CT1B6TgwXME,17408
+PIL/_imagingmorph.cp37-win32.pyd,sha256=qy50ak6T4oucuqTb7jeAbWcAnsf5DT5HNSGMqOKjA3o,10240
+PIL/_imagingtk.cp37-win32.pyd,sha256=_2j86RQ4E4wrQqtH2RpQNcl1jUAdziyJtIZvbBMwtzs,12288
+PIL/_tkinter_finder.py,sha256=H8lIY9JyNwACYSmxnPRyGwqSoolSxBoE_zMbQEmbe-o,622
+PIL/_util.py,sha256=VCm5WKSTI2hGMBDZdAY_XxBAbBYRwkKM_EbTLo0qJlc,503
+PIL/_version.py,sha256=FiTy8isn68XllxnFnIUit1eyb-huFdZO-5YuXAjmQHM,50
+PIL/_webp.cp37-win32.pyd,sha256=QKyJ4Uy8RJ_QtDzGBk-1WmMCQk1X5-1vBnvrQFIfcfk,440320
+PIL/features.py,sha256=1TQrFZGawUjX3UoX2t83RuNFoGnPq1kms3SVeZ5Ytts,4727
+Pillow-7.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Pillow-7.1.2.dist-info/LICENSE,sha256=N95Cq-M6JH6PA9IxNleg8XSiOaGY9Sat1lRP8-JkO4E,1452
+Pillow-7.1.2.dist-info/METADATA,sha256=cpTJQ-f4TUuhOiwfDxb65maygwf6fIQbIO64uTwQZ0M,5966
+Pillow-7.1.2.dist-info/RECORD,,
+Pillow-7.1.2.dist-info/WHEEL,sha256=W7gQNdCXaaCQL4_mS6kf-ClnoFRCfSnJ5Gcl1436agg,102
+Pillow-7.1.2.dist-info/top_level.txt,sha256=riZqrk-hyZqh5f1Z0Zwii3dKfxEsByhu9cU9IODF-NY,4
+Pillow-7.1.2.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
diff --git a/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/WHEEL b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/WHEEL
new file mode 100644
index 0000000..982dbc8
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.34.2)
+Root-Is-Purelib: false
+Tag: cp37-cp37m-win32
+
diff --git a/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/top_level.txt b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/top_level.txt
new file mode 100644
index 0000000..b338169
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/top_level.txt
@@ -0,0 +1 @@
+PIL
diff --git a/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/zip-safe b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/Pillow-7.1.2.dist-info/zip-safe
@@ -0,0 +1 @@
+
diff --git a/geekshop/django_2.0/Lib/site-packages/__pycache__/_virtualenv.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/__pycache__/_virtualenv.cpython-37.pyc
new file mode 100644
index 0000000..c31a0c9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/__pycache__/_virtualenv.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/_virtualenv.pth b/geekshop/django_2.0/Lib/site-packages/_virtualenv.pth
new file mode 100644
index 0000000..1c3ff99
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/_virtualenv.pth
@@ -0,0 +1 @@
+import _virtualenv
\ No newline at end of file
diff --git a/geekshop/django_2.0/Lib/site-packages/_virtualenv.py b/geekshop/django_2.0/Lib/site-packages/_virtualenv.py
new file mode 100644
index 0000000..b399da4
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/_virtualenv.py
@@ -0,0 +1,115 @@
+"""Patches that are applied at runtime to the virtual environment"""
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+
+VIRTUALENV_PATCH_FILE = os.path.join(__file__)
+
+
+def patch_dist(dist):
+ """
+ Distutils allows user to configure some arguments via a configuration file:
+ https://docs.python.org/3/install/index.html#distutils-configuration-files
+
+ Some of this arguments though don't make sense in context of the virtual environment files, let's fix them up.
+ """
+ # we cannot allow some install config as that would get packages installed outside of the virtual environment
+ old_parse_config_files = dist.Distribution.parse_config_files
+
+ def parse_config_files(self, *args, **kwargs):
+ result = old_parse_config_files(self, *args, **kwargs)
+ install = self.get_option_dict("install")
+
+ if "prefix" in install: # the prefix governs where to install the libraries
+ install["prefix"] = VIRTUALENV_PATCH_FILE, os.path.abspath(sys.prefix)
+ for base in ("purelib", "platlib", "headers", "scripts", "data"):
+ key = "install_{}".format(base)
+ if key in install: # do not allow global configs to hijack venv paths
+ install.pop(key, None)
+ return result
+
+ dist.Distribution.parse_config_files = parse_config_files
+
+
+# Import hook that patches some modules to ignore configuration values that break package installation in case
+# of virtual environments.
+_DISTUTILS_PATCH = "distutils.dist", "setuptools.dist"
+if sys.version_info > (3, 4):
+ # https://docs.python.org/3/library/importlib.html#setting-up-an-importer
+ from importlib.abc import MetaPathFinder
+ from importlib.util import find_spec
+ from threading import Lock
+ from functools import partial
+
+ class _Finder(MetaPathFinder):
+ """A meta path finder that allows patching the imported distutils modules"""
+
+ fullname = None
+ lock = Lock()
+
+ def find_spec(self, fullname, path, target=None):
+ if fullname in _DISTUTILS_PATCH and self.fullname is None:
+ with self.lock:
+ self.fullname = fullname
+ try:
+ spec = find_spec(fullname, path)
+ if spec is not None:
+ # https://www.python.org/dev/peps/pep-0451/#how-loading-will-work
+ is_new_api = hasattr(spec.loader, "exec_module")
+ func_name = "exec_module" if is_new_api else "load_module"
+ old = getattr(spec.loader, func_name)
+ func = self.exec_module if is_new_api else self.load_module
+ if old is not func:
+ try:
+ setattr(spec.loader, func_name, partial(func, old))
+ except AttributeError:
+ pass # C-Extension loaders are r/o such as zipimporter with .
+ self.module = app_module
+
+ # Reference to the Apps registry that holds this AppConfig. Set by the
+ # registry when it registers the AppConfig instance.
+ self.apps = None
+
+ # The following attributes could be defined at the class level in a
+ # subclass, hence the test-and-set pattern.
+
+ # Last component of the Python path to the application e.g. 'admin'.
+ # This value must be unique across a Django project.
+ if not hasattr(self, 'label'):
+ self.label = app_name.rpartition(".")[2]
+
+ # Human-readable name for the application e.g. "Admin".
+ if not hasattr(self, 'verbose_name'):
+ self.verbose_name = self.label.title()
+
+ # Filesystem path to the application directory e.g.
+ # '/path/to/django/contrib/admin'.
+ if not hasattr(self, 'path'):
+ self.path = self._path_from_module(app_module)
+
+ # Module containing models e.g. . Set by import_models().
+ # None if the application doesn't have a models module.
+ self.models_module = None
+
+ # Mapping of lower case model names to model classes. Initially set to
+ # None to prevent accidental access before import_models() runs.
+ self.models = None
+
+ def __repr__(self):
+ return '<%s: %s>' % (self.__class__.__name__, self.label)
+
+ def _path_from_module(self, module):
+ """Attempt to determine app's filesystem path from its module."""
+ # See #21874 for extended discussion of the behavior of this method in
+ # various cases.
+ # Convert paths to list because Python's _NamespacePath doesn't support
+ # indexing.
+ paths = list(getattr(module, '__path__', []))
+ if len(paths) != 1:
+ filename = getattr(module, '__file__', None)
+ if filename is not None:
+ paths = [os.path.dirname(filename)]
+ else:
+ # For unknown reasons, sometimes the list returned by __path__
+ # contains duplicates that must be removed (#25246).
+ paths = list(set(paths))
+ if len(paths) > 1:
+ raise ImproperlyConfigured(
+ "The app module %r has multiple filesystem locations (%r); "
+ "you must configure this app with an AppConfig subclass "
+ "with a 'path' class attribute." % (module, paths))
+ elif not paths:
+ raise ImproperlyConfigured(
+ "The app module %r has no filesystem location, "
+ "you must configure this app with an AppConfig subclass "
+ "with a 'path' class attribute." % (module,))
+ return paths[0]
+
+ @classmethod
+ def create(cls, entry):
+ """
+ Factory that creates an app config from an entry in INSTALLED_APPS.
+ """
+ try:
+ # If import_module succeeds, entry is a path to an app module,
+ # which may specify an app config class with default_app_config.
+ # Otherwise, entry is a path to an app config class or an error.
+ module = import_module(entry)
+
+ except ImportError:
+ # Track that importing as an app module failed. If importing as an
+ # app config class fails too, we'll trigger the ImportError again.
+ module = None
+
+ mod_path, _, cls_name = entry.rpartition('.')
+
+ # Raise the original exception when entry cannot be a path to an
+ # app config class.
+ if not mod_path:
+ raise
+
+ else:
+ try:
+ # If this works, the app module specifies an app config class.
+ entry = module.default_app_config
+ except AttributeError:
+ # Otherwise, it simply uses the default app config class.
+ return cls(entry, module)
+ else:
+ mod_path, _, cls_name = entry.rpartition('.')
+
+ # If we're reaching this point, we must attempt to load the app config
+ # class located at .
+ mod = import_module(mod_path)
+ try:
+ cls = getattr(mod, cls_name)
+ except AttributeError:
+ if module is None:
+ # If importing as an app module failed, that error probably
+ # contains the most informative traceback. Trigger it again.
+ import_module(entry)
+ else:
+ raise
+
+ # Check for obvious errors. (This check prevents duck typing, but
+ # it could be removed if it became a problem in practice.)
+ if not issubclass(cls, AppConfig):
+ raise ImproperlyConfigured(
+ "'%s' isn't a subclass of AppConfig." % entry)
+
+ # Obtain app name here rather than in AppClass.__init__ to keep
+ # all error checking for entries in INSTALLED_APPS in one place.
+ try:
+ app_name = cls.name
+ except AttributeError:
+ raise ImproperlyConfigured(
+ "'%s' must supply a name attribute." % entry)
+
+ # Ensure app_name points to a valid module.
+ try:
+ app_module = import_module(app_name)
+ except ImportError:
+ raise ImproperlyConfigured(
+ "Cannot import '%s'. Check that '%s.%s.name' is correct." % (
+ app_name, mod_path, cls_name,
+ )
+ )
+
+ # Entry is a path to an app config class.
+ return cls(app_name, app_module)
+
+ def get_model(self, model_name, require_ready=True):
+ """
+ Return the model with the given case-insensitive model_name.
+
+ Raise LookupError if no model exists with this name.
+ """
+ if require_ready:
+ self.apps.check_models_ready()
+ else:
+ self.apps.check_apps_ready()
+ try:
+ return self.models[model_name.lower()]
+ except KeyError:
+ raise LookupError(
+ "App '%s' doesn't have a '%s' model." % (self.label, model_name))
+
+ def get_models(self, include_auto_created=False, include_swapped=False):
+ """
+ Return an iterable of models.
+
+ By default, the following models aren't included:
+
+ - auto-created models for many-to-many relations without
+ an explicit intermediate table,
+ - models that have been swapped out.
+
+ Set the corresponding keyword argument to True to include such models.
+ Keyword arguments aren't documented; they're a private API.
+ """
+ self.apps.check_models_ready()
+ for model in self.models.values():
+ if model._meta.auto_created and not include_auto_created:
+ continue
+ if model._meta.swapped and not include_swapped:
+ continue
+ yield model
+
+ def import_models(self):
+ # Dictionary of models for this app, primarily maintained in the
+ # 'all_models' attribute of the Apps this AppConfig is attached to.
+ self.models = self.apps.all_models[self.label]
+
+ if module_has_submodule(self.module, MODELS_MODULE_NAME):
+ models_module_name = '%s.%s' % (self.name, MODELS_MODULE_NAME)
+ self.models_module = import_module(models_module_name)
+
+ def ready(self):
+ """
+ Override this method in subclasses to run code when Django starts.
+ """
diff --git a/geekshop/django_2.0/Lib/site-packages/django/apps/registry.py b/geekshop/django_2.0/Lib/site-packages/django/apps/registry.py
new file mode 100644
index 0000000..f522550
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/apps/registry.py
@@ -0,0 +1,418 @@
+import functools
+import sys
+import threading
+import warnings
+from collections import Counter, OrderedDict, defaultdict
+from functools import partial
+
+from django.core.exceptions import AppRegistryNotReady, ImproperlyConfigured
+
+from .config import AppConfig
+
+
+class Apps:
+ """
+ A registry that stores the configuration of installed applications.
+
+ It also keeps track of models, e.g. to provide reverse relations.
+ """
+
+ def __init__(self, installed_apps=()):
+ # installed_apps is set to None when creating the master registry
+ # because it cannot be populated at that point. Other registries must
+ # provide a list of installed apps and are populated immediately.
+ if installed_apps is None and hasattr(sys.modules[__name__], 'apps'):
+ raise RuntimeError("You must supply an installed_apps argument.")
+
+ # Mapping of app labels => model names => model classes. Every time a
+ # model is imported, ModelBase.__new__ calls apps.register_model which
+ # creates an entry in all_models. All imported models are registered,
+ # regardless of whether they're defined in an installed application
+ # and whether the registry has been populated. Since it isn't possible
+ # to reimport a module safely (it could reexecute initialization code)
+ # all_models is never overridden or reset.
+ self.all_models = defaultdict(OrderedDict)
+
+ # Mapping of labels to AppConfig instances for installed apps.
+ self.app_configs = OrderedDict()
+
+ # Stack of app_configs. Used to store the current state in
+ # set_available_apps and set_installed_apps.
+ self.stored_app_configs = []
+
+ # Whether the registry is populated.
+ self.apps_ready = self.models_ready = self.ready = False
+
+ # Lock for thread-safe population.
+ self._lock = threading.RLock()
+ self.loading = False
+
+ # Maps ("app_label", "modelname") tuples to lists of functions to be
+ # called when the corresponding model is ready. Used by this class's
+ # `lazy_model_operation()` and `do_pending_operations()` methods.
+ self._pending_operations = defaultdict(list)
+
+ # Populate apps and models, unless it's the master registry.
+ if installed_apps is not None:
+ self.populate(installed_apps)
+
+ def populate(self, installed_apps=None):
+ """
+ Load application configurations and models.
+
+ Import each application module and then each model module.
+
+ It is thread-safe and idempotent, but not reentrant.
+ """
+ if self.ready:
+ return
+
+ # populate() might be called by two threads in parallel on servers
+ # that create threads before initializing the WSGI callable.
+ with self._lock:
+ if self.ready:
+ return
+
+ # An RLock prevents other threads from entering this section. The
+ # compare and set operation below is atomic.
+ if self.loading:
+ # Prevent reentrant calls to avoid running AppConfig.ready()
+ # methods twice.
+ raise RuntimeError("populate() isn't reentrant")
+ self.loading = True
+
+ # Phase 1: initialize app configs and import app modules.
+ for entry in installed_apps:
+ if isinstance(entry, AppConfig):
+ app_config = entry
+ else:
+ app_config = AppConfig.create(entry)
+ if app_config.label in self.app_configs:
+ raise ImproperlyConfigured(
+ "Application labels aren't unique, "
+ "duplicates: %s" % app_config.label)
+
+ self.app_configs[app_config.label] = app_config
+ app_config.apps = self
+
+ # Check for duplicate app names.
+ counts = Counter(
+ app_config.name for app_config in self.app_configs.values())
+ duplicates = [
+ name for name, count in counts.most_common() if count > 1]
+ if duplicates:
+ raise ImproperlyConfigured(
+ "Application names aren't unique, "
+ "duplicates: %s" % ", ".join(duplicates))
+
+ self.apps_ready = True
+
+ # Phase 2: import models modules.
+ for app_config in self.app_configs.values():
+ app_config.import_models()
+
+ self.clear_cache()
+
+ self.models_ready = True
+
+ # Phase 3: run ready() methods of app configs.
+ for app_config in self.get_app_configs():
+ app_config.ready()
+
+ self.ready = True
+
+ def check_apps_ready(self):
+ """Raise an exception if all apps haven't been imported yet."""
+ if not self.apps_ready:
+ raise AppRegistryNotReady("Apps aren't loaded yet.")
+
+ def check_models_ready(self):
+ """Raise an exception if all models haven't been imported yet."""
+ if not self.models_ready:
+ raise AppRegistryNotReady("Models aren't loaded yet.")
+
+ def get_app_configs(self):
+ """Import applications and return an iterable of app configs."""
+ self.check_apps_ready()
+ return self.app_configs.values()
+
+ def get_app_config(self, app_label):
+ """
+ Import applications and returns an app config for the given label.
+
+ Raise LookupError if no application exists with this label.
+ """
+ self.check_apps_ready()
+ try:
+ return self.app_configs[app_label]
+ except KeyError:
+ message = "No installed app with label '%s'." % app_label
+ for app_config in self.get_app_configs():
+ if app_config.name == app_label:
+ message += " Did you mean '%s'?" % app_config.label
+ break
+ raise LookupError(message)
+
+ # This method is performance-critical at least for Django's test suite.
+ @functools.lru_cache(maxsize=None)
+ def get_models(self, include_auto_created=False, include_swapped=False):
+ """
+ Return a list of all installed models.
+
+ By default, the following models aren't included:
+
+ - auto-created models for many-to-many relations without
+ an explicit intermediate table,
+ - models that have been swapped out.
+
+ Set the corresponding keyword argument to True to include such models.
+ """
+ self.check_models_ready()
+
+ result = []
+ for app_config in self.app_configs.values():
+ result.extend(list(app_config.get_models(include_auto_created, include_swapped)))
+ return result
+
+ def get_model(self, app_label, model_name=None, require_ready=True):
+ """
+ Return the model matching the given app_label and model_name.
+
+ As a shortcut, app_label may be in the form ..
+
+ model_name is case-insensitive.
+
+ Raise LookupError if no application exists with this label, or no
+ model exists with this name in the application. Raise ValueError if
+ called with a single argument that doesn't contain exactly one dot.
+ """
+ if require_ready:
+ self.check_models_ready()
+ else:
+ self.check_apps_ready()
+
+ if model_name is None:
+ app_label, model_name = app_label.split('.')
+
+ app_config = self.get_app_config(app_label)
+
+ if not require_ready and app_config.models is None:
+ app_config.import_models()
+
+ return app_config.get_model(model_name, require_ready=require_ready)
+
+ def register_model(self, app_label, model):
+ # Since this method is called when models are imported, it cannot
+ # perform imports because of the risk of import loops. It mustn't
+ # call get_app_config().
+ model_name = model._meta.model_name
+ app_models = self.all_models[app_label]
+ if model_name in app_models:
+ if (model.__name__ == app_models[model_name].__name__ and
+ model.__module__ == app_models[model_name].__module__):
+ warnings.warn(
+ "Model '%s.%s' was already registered. "
+ "Reloading models is not advised as it can lead to inconsistencies, "
+ "most notably with related models." % (app_label, model_name),
+ RuntimeWarning, stacklevel=2)
+ else:
+ raise RuntimeError(
+ "Conflicting '%s' models in application '%s': %s and %s." %
+ (model_name, app_label, app_models[model_name], model))
+ app_models[model_name] = model
+ self.do_pending_operations(model)
+ self.clear_cache()
+
+ def is_installed(self, app_name):
+ """
+ Check whether an application with this name exists in the registry.
+
+ app_name is the full name of the app e.g. 'django.contrib.admin'.
+ """
+ self.check_apps_ready()
+ return any(ac.name == app_name for ac in self.app_configs.values())
+
+ def get_containing_app_config(self, object_name):
+ """
+ Look for an app config containing a given object.
+
+ object_name is the dotted Python path to the object.
+
+ Return the app config for the inner application in case of nesting.
+ Return None if the object isn't in any registered app config.
+ """
+ self.check_apps_ready()
+ candidates = []
+ for app_config in self.app_configs.values():
+ if object_name.startswith(app_config.name):
+ subpath = object_name[len(app_config.name):]
+ if subpath == '' or subpath[0] == '.':
+ candidates.append(app_config)
+ if candidates:
+ return sorted(candidates, key=lambda ac: -len(ac.name))[0]
+
+ def get_registered_model(self, app_label, model_name):
+ """
+ Similar to get_model(), but doesn't require that an app exists with
+ the given app_label.
+
+ It's safe to call this method at import time, even while the registry
+ is being populated.
+ """
+ model = self.all_models[app_label].get(model_name.lower())
+ if model is None:
+ raise LookupError(
+ "Model '%s.%s' not registered." % (app_label, model_name))
+ return model
+
+ @functools.lru_cache(maxsize=None)
+ def get_swappable_settings_name(self, to_string):
+ """
+ For a given model string (e.g. "auth.User"), return the name of the
+ corresponding settings name if it refers to a swappable model. If the
+ referred model is not swappable, return None.
+
+ This method is decorated with lru_cache because it's performance
+ critical when it comes to migrations. Since the swappable settings don't
+ change after Django has loaded the settings, there is no reason to get
+ the respective settings attribute over and over again.
+ """
+ for model in self.get_models(include_swapped=True):
+ swapped = model._meta.swapped
+ # Is this model swapped out for the model given by to_string?
+ if swapped and swapped == to_string:
+ return model._meta.swappable
+ # Is this model swappable and the one given by to_string?
+ if model._meta.swappable and model._meta.label == to_string:
+ return model._meta.swappable
+ return None
+
+ def set_available_apps(self, available):
+ """
+ Restrict the set of installed apps used by get_app_config[s].
+
+ available must be an iterable of application names.
+
+ set_available_apps() must be balanced with unset_available_apps().
+
+ Primarily used for performance optimization in TransactionTestCase.
+
+ This method is safe in the sense that it doesn't trigger any imports.
+ """
+ available = set(available)
+ installed = {app_config.name for app_config in self.get_app_configs()}
+ if not available.issubset(installed):
+ raise ValueError(
+ "Available apps isn't a subset of installed apps, extra apps: %s"
+ % ", ".join(available - installed)
+ )
+
+ self.stored_app_configs.append(self.app_configs)
+ self.app_configs = OrderedDict(
+ (label, app_config)
+ for label, app_config in self.app_configs.items()
+ if app_config.name in available)
+ self.clear_cache()
+
+ def unset_available_apps(self):
+ """Cancel a previous call to set_available_apps()."""
+ self.app_configs = self.stored_app_configs.pop()
+ self.clear_cache()
+
+ def set_installed_apps(self, installed):
+ """
+ Enable a different set of installed apps for get_app_config[s].
+
+ installed must be an iterable in the same format as INSTALLED_APPS.
+
+ set_installed_apps() must be balanced with unset_installed_apps(),
+ even if it exits with an exception.
+
+ Primarily used as a receiver of the setting_changed signal in tests.
+
+ This method may trigger new imports, which may add new models to the
+ registry of all imported models. They will stay in the registry even
+ after unset_installed_apps(). Since it isn't possible to replay
+ imports safely (e.g. that could lead to registering listeners twice),
+ models are registered when they're imported and never removed.
+ """
+ if not self.ready:
+ raise AppRegistryNotReady("App registry isn't ready yet.")
+ self.stored_app_configs.append(self.app_configs)
+ self.app_configs = OrderedDict()
+ self.apps_ready = self.models_ready = self.loading = self.ready = False
+ self.clear_cache()
+ self.populate(installed)
+
+ def unset_installed_apps(self):
+ """Cancel a previous call to set_installed_apps()."""
+ self.app_configs = self.stored_app_configs.pop()
+ self.apps_ready = self.models_ready = self.ready = True
+ self.clear_cache()
+
+ def clear_cache(self):
+ """
+ Clear all internal caches, for methods that alter the app registry.
+
+ This is mostly used in tests.
+ """
+ # Call expire cache on each model. This will purge
+ # the relation tree and the fields cache.
+ self.get_models.cache_clear()
+ if self.ready:
+ # Circumvent self.get_models() to prevent that the cache is refilled.
+ # This particularly prevents that an empty value is cached while cloning.
+ for app_config in self.app_configs.values():
+ for model in app_config.get_models(include_auto_created=True):
+ model._meta._expire_cache()
+
+ def lazy_model_operation(self, function, *model_keys):
+ """
+ Take a function and a number of ("app_label", "modelname") tuples, and
+ when all the corresponding models have been imported and registered,
+ call the function with the model classes as its arguments.
+
+ The function passed to this method must accept exactly n models as
+ arguments, where n=len(model_keys).
+ """
+ # Base case: no arguments, just execute the function.
+ if not model_keys:
+ function()
+ # Recursive case: take the head of model_keys, wait for the
+ # corresponding model class to be imported and registered, then apply
+ # that argument to the supplied function. Pass the resulting partial
+ # to lazy_model_operation() along with the remaining model args and
+ # repeat until all models are loaded and all arguments are applied.
+ else:
+ next_model, more_models = model_keys[0], model_keys[1:]
+
+ # This will be executed after the class corresponding to next_model
+ # has been imported and registered. The `func` attribute provides
+ # duck-type compatibility with partials.
+ def apply_next_model(model):
+ next_function = partial(apply_next_model.func, model)
+ self.lazy_model_operation(next_function, *more_models)
+ apply_next_model.func = function
+
+ # If the model has already been imported and registered, partially
+ # apply it to the function now. If not, add it to the list of
+ # pending operations for the model, where it will be executed with
+ # the model class as its sole argument once the model is ready.
+ try:
+ model_class = self.get_registered_model(*next_model)
+ except LookupError:
+ self._pending_operations[next_model].append(apply_next_model)
+ else:
+ apply_next_model(model_class)
+
+ def do_pending_operations(self, model):
+ """
+ Take a newly-prepared model and pass it to each function waiting for
+ it. This is called at the very end of Apps.register_model().
+ """
+ key = model._meta.app_label, model._meta.model_name
+ for function in self._pending_operations.pop(key, []):
+ function(model)
+
+
+apps = Apps(installed_apps=None)
diff --git a/geekshop/django_2.0/Lib/site-packages/django/bin/__pycache__/django-admin.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/bin/__pycache__/django-admin.cpython-37.pyc
new file mode 100644
index 0000000..ccf476f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/bin/__pycache__/django-admin.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/bin/django-admin.py b/geekshop/django_2.0/Lib/site-packages/django/bin/django-admin.py
new file mode 100644
index 0000000..f518cdc
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/bin/django-admin.py
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+from django.core import management
+
+if __name__ == "__main__":
+ management.execute_from_command_line()
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/__init__.py
new file mode 100644
index 0000000..9e4b0a4
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/__init__.py
@@ -0,0 +1,200 @@
+"""
+Settings and configuration for Django.
+
+Read values from the module specified by the DJANGO_SETTINGS_MODULE environment
+variable, and then from django.conf.global_settings; see the global_settings.py
+for a list of all possible variables.
+"""
+
+import importlib
+import os
+import time
+import warnings
+
+from django.conf import global_settings
+from django.core.exceptions import ImproperlyConfigured
+from django.utils.deprecation import RemovedInDjango30Warning
+from django.utils.functional import LazyObject, empty
+
+ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
+
+
+class LazySettings(LazyObject):
+ """
+ A lazy proxy for either global Django settings or a custom settings object.
+ The user can manually configure settings prior to using them. Otherwise,
+ Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.
+ """
+ def _setup(self, name=None):
+ """
+ Load the settings module pointed to by the environment variable. This
+ is used the first time settings are needed, if the user hasn't
+ configured settings manually.
+ """
+ settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
+ if not settings_module:
+ desc = ("setting %s" % name) if name else "settings"
+ raise ImproperlyConfigured(
+ "Requested %s, but settings are not configured. "
+ "You must either define the environment variable %s "
+ "or call settings.configure() before accessing settings."
+ % (desc, ENVIRONMENT_VARIABLE))
+
+ self._wrapped = Settings(settings_module)
+
+ def __repr__(self):
+ # Hardcode the class name as otherwise it yields 'Settings'.
+ if self._wrapped is empty:
+ return ''
+ return '' % {
+ 'settings_module': self._wrapped.SETTINGS_MODULE,
+ }
+
+ def __getattr__(self, name):
+ """Return the value of a setting and cache it in self.__dict__."""
+ if self._wrapped is empty:
+ self._setup(name)
+ val = getattr(self._wrapped, name)
+ self.__dict__[name] = val
+ return val
+
+ def __setattr__(self, name, value):
+ """
+ Set the value of setting. Clear all cached values if _wrapped changes
+ (@override_settings does this) or clear single values when set.
+ """
+ if name == '_wrapped':
+ self.__dict__.clear()
+ else:
+ self.__dict__.pop(name, None)
+ super().__setattr__(name, value)
+
+ def __delattr__(self, name):
+ """Delete a setting and clear it from cache if needed."""
+ super().__delattr__(name)
+ self.__dict__.pop(name, None)
+
+ def configure(self, default_settings=global_settings, **options):
+ """
+ Called to manually configure the settings. The 'default_settings'
+ parameter sets where to retrieve any unspecified values from (its
+ argument must support attribute access (__getattr__)).
+ """
+ if self._wrapped is not empty:
+ raise RuntimeError('Settings already configured.')
+ holder = UserSettingsHolder(default_settings)
+ for name, value in options.items():
+ setattr(holder, name, value)
+ self._wrapped = holder
+
+ @property
+ def configured(self):
+ """Return True if the settings have already been configured."""
+ return self._wrapped is not empty
+
+
+class Settings:
+ def __init__(self, settings_module):
+ # update this dict from global settings (but only for ALL_CAPS settings)
+ for setting in dir(global_settings):
+ if setting.isupper():
+ setattr(self, setting, getattr(global_settings, setting))
+
+ # store the settings module in case someone later cares
+ self.SETTINGS_MODULE = settings_module
+
+ mod = importlib.import_module(self.SETTINGS_MODULE)
+
+ tuple_settings = (
+ "INSTALLED_APPS",
+ "TEMPLATE_DIRS",
+ "LOCALE_PATHS",
+ )
+ self._explicit_settings = set()
+ for setting in dir(mod):
+ if setting.isupper():
+ setting_value = getattr(mod, setting)
+
+ if (setting in tuple_settings and
+ not isinstance(setting_value, (list, tuple))):
+ raise ImproperlyConfigured("The %s setting must be a list or a tuple. " % setting)
+ setattr(self, setting, setting_value)
+ self._explicit_settings.add(setting)
+
+ if not self.SECRET_KEY:
+ raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
+
+ if self.is_overridden('DEFAULT_CONTENT_TYPE'):
+ warnings.warn('The DEFAULT_CONTENT_TYPE setting is deprecated.', RemovedInDjango30Warning)
+
+ if hasattr(time, 'tzset') and self.TIME_ZONE:
+ # When we can, attempt to validate the timezone. If we can't find
+ # this file, no check happens and it's harmless.
+ zoneinfo_root = '/usr/share/zoneinfo'
+ if (os.path.exists(zoneinfo_root) and not
+ os.path.exists(os.path.join(zoneinfo_root, *(self.TIME_ZONE.split('/'))))):
+ raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
+ # Move the time zone info into os.environ. See ticket #2315 for why
+ # we don't do this unconditionally (breaks Windows).
+ os.environ['TZ'] = self.TIME_ZONE
+ time.tzset()
+
+ def is_overridden(self, setting):
+ return setting in self._explicit_settings
+
+ def __repr__(self):
+ return '<%(cls)s "%(settings_module)s">' % {
+ 'cls': self.__class__.__name__,
+ 'settings_module': self.SETTINGS_MODULE,
+ }
+
+
+class UserSettingsHolder:
+ """Holder for user configured settings."""
+ # SETTINGS_MODULE doesn't make much sense in the manually configured
+ # (standalone) case.
+ SETTINGS_MODULE = None
+
+ def __init__(self, default_settings):
+ """
+ Requests for configuration variables not in this class are satisfied
+ from the module specified in default_settings (if possible).
+ """
+ self.__dict__['_deleted'] = set()
+ self.default_settings = default_settings
+
+ def __getattr__(self, name):
+ if name in self._deleted:
+ raise AttributeError
+ return getattr(self.default_settings, name)
+
+ def __setattr__(self, name, value):
+ self._deleted.discard(name)
+ if name == 'DEFAULT_CONTENT_TYPE':
+ warnings.warn('The DEFAULT_CONTENT_TYPE setting is deprecated.', RemovedInDjango30Warning)
+ super().__setattr__(name, value)
+
+ def __delattr__(self, name):
+ self._deleted.add(name)
+ if hasattr(self, name):
+ super().__delattr__(name)
+
+ def __dir__(self):
+ return sorted(
+ s for s in list(self.__dict__) + dir(self.default_settings)
+ if s not in self._deleted
+ )
+
+ def is_overridden(self, setting):
+ deleted = (setting in self._deleted)
+ set_locally = (setting in self.__dict__)
+ set_on_default = getattr(self.default_settings, 'is_overridden', lambda s: False)(setting)
+ return deleted or set_locally or set_on_default
+
+ def __repr__(self):
+ return '<%(cls)s>' % {
+ 'cls': self.__class__.__name__,
+ }
+
+
+settings = LazySettings()
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..1a7fe26
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/__pycache__/global_settings.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/__pycache__/global_settings.cpython-37.pyc
new file mode 100644
index 0000000..c30cf2f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/__pycache__/global_settings.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/__init__.py-tpl b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/__init__.py-tpl
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/admin.py-tpl b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/admin.py-tpl
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/admin.py-tpl
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/apps.py-tpl b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/apps.py-tpl
new file mode 100644
index 0000000..9b2ce52
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/apps.py-tpl
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class {{ camel_case_app_name }}Config(AppConfig):
+ name = '{{ app_name }}'
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/migrations/__init__.py-tpl b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/migrations/__init__.py-tpl
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/models.py-tpl b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/models.py-tpl
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/models.py-tpl
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/tests.py-tpl b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/tests.py-tpl
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/tests.py-tpl
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/views.py-tpl b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/views.py-tpl
new file mode 100644
index 0000000..91ea44a
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/app_template/views.py-tpl
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/global_settings.py b/geekshop/django_2.0/Lib/site-packages/django/conf/global_settings.py
new file mode 100644
index 0000000..9f1bc8d
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/global_settings.py
@@ -0,0 +1,637 @@
+"""
+Default Django settings. Override these with settings in the module pointed to
+by the DJANGO_SETTINGS_MODULE environment variable.
+"""
+
+
+# This is defined here as a do-nothing function because we can't import
+# django.utils.translation -- that module depends on the settings.
+def gettext_noop(s):
+ return s
+
+
+####################
+# CORE #
+####################
+
+DEBUG = False
+
+# Whether the framework should propagate raw exceptions rather than catching
+# them. This is useful under some testing situations and should never be used
+# on a live site.
+DEBUG_PROPAGATE_EXCEPTIONS = False
+
+# Whether to use the "ETag" header. This saves bandwidth but slows down performance.
+# Deprecated (RemovedInDjango21Warning) in favor of ConditionalGetMiddleware
+# which sets the ETag regardless of this setting.
+USE_ETAGS = False
+
+# People who get code error notifications.
+# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')]
+ADMINS = []
+
+# List of IP addresses, as strings, that:
+# * See debug comments, when DEBUG is true
+# * Receive x-headers
+INTERNAL_IPS = []
+
+# Hosts/domain names that are valid for this site.
+# "*" matches anything, ".example.com" matches example.com and all subdomains
+ALLOWED_HOSTS = []
+
+# Local time zone for this installation. All choices can be found here:
+# https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all
+# systems may support all possibilities). When USE_TZ is True, this is
+# interpreted as the default user time zone.
+TIME_ZONE = 'America/Chicago'
+
+# If you set this to True, Django will use timezone-aware datetimes.
+USE_TZ = False
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+# Languages we provide translations for, out of the box.
+LANGUAGES = [
+ ('af', gettext_noop('Afrikaans')),
+ ('ar', gettext_noop('Arabic')),
+ ('ast', gettext_noop('Asturian')),
+ ('az', gettext_noop('Azerbaijani')),
+ ('bg', gettext_noop('Bulgarian')),
+ ('be', gettext_noop('Belarusian')),
+ ('bn', gettext_noop('Bengali')),
+ ('br', gettext_noop('Breton')),
+ ('bs', gettext_noop('Bosnian')),
+ ('ca', gettext_noop('Catalan')),
+ ('cs', gettext_noop('Czech')),
+ ('cy', gettext_noop('Welsh')),
+ ('da', gettext_noop('Danish')),
+ ('de', gettext_noop('German')),
+ ('dsb', gettext_noop('Lower Sorbian')),
+ ('el', gettext_noop('Greek')),
+ ('en', gettext_noop('English')),
+ ('en-au', gettext_noop('Australian English')),
+ ('en-gb', gettext_noop('British English')),
+ ('eo', gettext_noop('Esperanto')),
+ ('es', gettext_noop('Spanish')),
+ ('es-ar', gettext_noop('Argentinian Spanish')),
+ ('es-co', gettext_noop('Colombian Spanish')),
+ ('es-mx', gettext_noop('Mexican Spanish')),
+ ('es-ni', gettext_noop('Nicaraguan Spanish')),
+ ('es-ve', gettext_noop('Venezuelan Spanish')),
+ ('et', gettext_noop('Estonian')),
+ ('eu', gettext_noop('Basque')),
+ ('fa', gettext_noop('Persian')),
+ ('fi', gettext_noop('Finnish')),
+ ('fr', gettext_noop('French')),
+ ('fy', gettext_noop('Frisian')),
+ ('ga', gettext_noop('Irish')),
+ ('gd', gettext_noop('Scottish Gaelic')),
+ ('gl', gettext_noop('Galician')),
+ ('he', gettext_noop('Hebrew')),
+ ('hi', gettext_noop('Hindi')),
+ ('hr', gettext_noop('Croatian')),
+ ('hsb', gettext_noop('Upper Sorbian')),
+ ('hu', gettext_noop('Hungarian')),
+ ('ia', gettext_noop('Interlingua')),
+ ('id', gettext_noop('Indonesian')),
+ ('io', gettext_noop('Ido')),
+ ('is', gettext_noop('Icelandic')),
+ ('it', gettext_noop('Italian')),
+ ('ja', gettext_noop('Japanese')),
+ ('ka', gettext_noop('Georgian')),
+ ('kab', gettext_noop('Kabyle')),
+ ('kk', gettext_noop('Kazakh')),
+ ('km', gettext_noop('Khmer')),
+ ('kn', gettext_noop('Kannada')),
+ ('ko', gettext_noop('Korean')),
+ ('lb', gettext_noop('Luxembourgish')),
+ ('lt', gettext_noop('Lithuanian')),
+ ('lv', gettext_noop('Latvian')),
+ ('mk', gettext_noop('Macedonian')),
+ ('ml', gettext_noop('Malayalam')),
+ ('mn', gettext_noop('Mongolian')),
+ ('mr', gettext_noop('Marathi')),
+ ('my', gettext_noop('Burmese')),
+ ('nb', gettext_noop('Norwegian Bokmål')),
+ ('ne', gettext_noop('Nepali')),
+ ('nl', gettext_noop('Dutch')),
+ ('nn', gettext_noop('Norwegian Nynorsk')),
+ ('os', gettext_noop('Ossetic')),
+ ('pa', gettext_noop('Punjabi')),
+ ('pl', gettext_noop('Polish')),
+ ('pt', gettext_noop('Portuguese')),
+ ('pt-br', gettext_noop('Brazilian Portuguese')),
+ ('ro', gettext_noop('Romanian')),
+ ('ru', gettext_noop('Russian')),
+ ('sk', gettext_noop('Slovak')),
+ ('sl', gettext_noop('Slovenian')),
+ ('sq', gettext_noop('Albanian')),
+ ('sr', gettext_noop('Serbian')),
+ ('sr-latn', gettext_noop('Serbian Latin')),
+ ('sv', gettext_noop('Swedish')),
+ ('sw', gettext_noop('Swahili')),
+ ('ta', gettext_noop('Tamil')),
+ ('te', gettext_noop('Telugu')),
+ ('th', gettext_noop('Thai')),
+ ('tr', gettext_noop('Turkish')),
+ ('tt', gettext_noop('Tatar')),
+ ('udm', gettext_noop('Udmurt')),
+ ('uk', gettext_noop('Ukrainian')),
+ ('ur', gettext_noop('Urdu')),
+ ('vi', gettext_noop('Vietnamese')),
+ ('zh-hans', gettext_noop('Simplified Chinese')),
+ ('zh-hant', gettext_noop('Traditional Chinese')),
+]
+
+# Languages using BiDi (right-to-left) layout
+LANGUAGES_BIDI = ["he", "ar", "fa", "ur"]
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+LOCALE_PATHS = []
+
+# Settings for language cookie
+LANGUAGE_COOKIE_NAME = 'django_language'
+LANGUAGE_COOKIE_AGE = None
+LANGUAGE_COOKIE_DOMAIN = None
+LANGUAGE_COOKIE_PATH = '/'
+
+
+# If you set this to True, Django will format dates, numbers and calendars
+# according to user current locale.
+USE_L10N = False
+
+# Not-necessarily-technical managers of the site. They get broken link
+# notifications and other various emails.
+MANAGERS = ADMINS
+
+# Default content type and charset to use for all HttpResponse objects, if a
+# MIME type isn't manually specified. These are used to construct the
+# Content-Type header.
+DEFAULT_CONTENT_TYPE = 'text/html'
+DEFAULT_CHARSET = 'utf-8'
+
+# Encoding of files read from disk (template and initial SQL files).
+FILE_CHARSET = 'utf-8'
+
+# Email address that error messages come from.
+SERVER_EMAIL = 'root@localhost'
+
+# Database connection info. If left empty, will default to the dummy backend.
+DATABASES = {}
+
+# Classes used to implement DB routing behavior.
+DATABASE_ROUTERS = []
+
+# The email backend to use. For possible shortcuts see django.core.mail.
+# The default is to use the SMTP backend.
+# Third-party backends can be specified by providing a Python path
+# to a module that defines an EmailBackend class.
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+# Host for sending email.
+EMAIL_HOST = 'localhost'
+
+# Port for sending email.
+EMAIL_PORT = 25
+
+# Whether to send SMTP 'Date' header in the local time zone or in UTC.
+EMAIL_USE_LOCALTIME = False
+
+# Optional SMTP authentication information for EMAIL_HOST.
+EMAIL_HOST_USER = ''
+EMAIL_HOST_PASSWORD = ''
+EMAIL_USE_TLS = False
+EMAIL_USE_SSL = False
+EMAIL_SSL_CERTFILE = None
+EMAIL_SSL_KEYFILE = None
+EMAIL_TIMEOUT = None
+
+# List of strings representing installed apps.
+INSTALLED_APPS = []
+
+TEMPLATES = []
+
+# Default form rendering class.
+FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
+
+# Default email address to use for various automated correspondence from
+# the site managers.
+DEFAULT_FROM_EMAIL = 'webmaster@localhost'
+
+# Subject-line prefix for email messages send with django.core.mail.mail_admins
+# or ...mail_managers. Make sure to include the trailing space.
+EMAIL_SUBJECT_PREFIX = '[Django] '
+
+# Whether to append trailing slashes to URLs.
+APPEND_SLASH = True
+
+# Whether to prepend the "www." subdomain to URLs that don't have it.
+PREPEND_WWW = False
+
+# Override the server-derived value of SCRIPT_NAME
+FORCE_SCRIPT_NAME = None
+
+# List of compiled regular expression objects representing User-Agent strings
+# that are not allowed to visit any page, systemwide. Use this for bad
+# robots/crawlers. Here are a few examples:
+# import re
+# DISALLOWED_USER_AGENTS = [
+# re.compile(r'^NaverBot.*'),
+# re.compile(r'^EmailSiphon.*'),
+# re.compile(r'^SiteSucker.*'),
+# re.compile(r'^sohu-search'),
+# ]
+DISALLOWED_USER_AGENTS = []
+
+ABSOLUTE_URL_OVERRIDES = {}
+
+# List of compiled regular expression objects representing URLs that need not
+# be reported by BrokenLinkEmailsMiddleware. Here are a few examples:
+# import re
+# IGNORABLE_404_URLS = [
+# re.compile(r'^/apple-touch-icon.*\.png$'),
+# re.compile(r'^/favicon.ico$'),
+# re.compile(r'^/robots.txt$'),
+# re.compile(r'^/phpmyadmin/'),
+# re.compile(r'\.(cgi|php|pl)$'),
+# ]
+IGNORABLE_404_URLS = []
+
+# A secret key for this particular Django installation. Used in secret-key
+# hashing algorithms. Set this in your settings, or Django will complain
+# loudly.
+SECRET_KEY = ''
+
+# Default file storage mechanism that holds media.
+DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
+
+# Absolute filesystem path to the directory that will hold user-uploaded files.
+# Example: "/var/www/example.com/media/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT.
+# Examples: "http://example.com/media/", "http://media.example.com/"
+MEDIA_URL = ''
+
+# Absolute path to the directory static files should be collected to.
+# Example: "/var/www/example.com/static/"
+STATIC_ROOT = None
+
+# URL that handles the static files served from STATIC_ROOT.
+# Example: "http://example.com/static/", "http://static.example.com/"
+STATIC_URL = None
+
+# List of upload handler classes to be applied in order.
+FILE_UPLOAD_HANDLERS = [
+ 'django.core.files.uploadhandler.MemoryFileUploadHandler',
+ 'django.core.files.uploadhandler.TemporaryFileUploadHandler',
+]
+
+# Maximum size, in bytes, of a request before it will be streamed to the
+# file system instead of into memory.
+FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB
+
+# Maximum size in bytes of request data (excluding file uploads) that will be
+# read before a SuspiciousOperation (RequestDataTooBig) is raised.
+DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB
+
+# Maximum number of GET/POST parameters that will be read before a
+# SuspiciousOperation (TooManyFieldsSent) is raised.
+DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
+
+# Directory in which upload streamed files will be temporarily saved. A value of
+# `None` will make Django use the operating system's default temporary directory
+# (i.e. "/tmp" on *nix systems).
+FILE_UPLOAD_TEMP_DIR = None
+
+# The numeric mode to set newly-uploaded files to. The value should be a mode
+# you'd pass directly to os.chmod; see https://docs.python.org/3/library/os.html#files-and-directories.
+FILE_UPLOAD_PERMISSIONS = None
+
+# The numeric mode to assign to newly-created directories, when uploading files.
+# The value should be a mode as you'd pass to os.chmod;
+# see https://docs.python.org/3/library/os.html#files-and-directories.
+FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
+
+# Python module path where user will place custom format definition.
+# The directory where this setting is pointing should contain subdirectories
+# named as the locales, containing a formats.py file
+# (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use)
+FORMAT_MODULE_PATH = None
+
+# Default formatting for date objects. See all available format strings here:
+# http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'N j, Y'
+
+# Default formatting for datetime objects. See all available format strings here:
+# http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATETIME_FORMAT = 'N j, Y, P'
+
+# Default formatting for time objects. See all available format strings here:
+# http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+TIME_FORMAT = 'P'
+
+# Default formatting for date objects when only the year and month are relevant.
+# See all available format strings here:
+# http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+YEAR_MONTH_FORMAT = 'F Y'
+
+# Default formatting for date objects when only the month and day are relevant.
+# See all available format strings here:
+# http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+MONTH_DAY_FORMAT = 'F j'
+
+# Default short formatting for date objects. See all available format strings here:
+# http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+SHORT_DATE_FORMAT = 'm/d/Y'
+
+# Default short formatting for datetime objects.
+# See all available format strings here:
+# http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+SHORT_DATETIME_FORMAT = 'm/d/Y P'
+
+# Default formats to be used when parsing dates from input boxes, in order
+# See all available format string here:
+# http://docs.python.org/library/datetime.html#strftime-behavior
+# * Note that these format strings are different from the ones to display dates
+DATE_INPUT_FORMATS = [
+ '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
+ '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
+ '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
+ '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
+ '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
+]
+
+# Default formats to be used when parsing times from input boxes, in order
+# See all available format string here:
+# http://docs.python.org/library/datetime.html#strftime-behavior
+# * Note that these format strings are different from the ones to display dates
+TIME_INPUT_FORMATS = [
+ '%H:%M:%S', # '14:30:59'
+ '%H:%M:%S.%f', # '14:30:59.000200'
+ '%H:%M', # '14:30'
+]
+
+# Default formats to be used when parsing dates and times from input boxes,
+# in order
+# See all available format string here:
+# http://docs.python.org/library/datetime.html#strftime-behavior
+# * Note that these format strings are different from the ones to display dates
+DATETIME_INPUT_FORMATS = [
+ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
+ '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
+ '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
+ '%Y-%m-%d', # '2006-10-25'
+ '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
+ '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200'
+ '%m/%d/%Y %H:%M', # '10/25/2006 14:30'
+ '%m/%d/%Y', # '10/25/2006'
+ '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
+ '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200'
+ '%m/%d/%y %H:%M', # '10/25/06 14:30'
+ '%m/%d/%y', # '10/25/06'
+]
+
+# First day of week, to be used on calendars
+# 0 means Sunday, 1 means Monday...
+FIRST_DAY_OF_WEEK = 0
+
+# Decimal separator symbol
+DECIMAL_SEPARATOR = '.'
+
+# Boolean that sets whether to add thousand separator when formatting numbers
+USE_THOUSAND_SEPARATOR = False
+
+# Number of digits that will be together, when splitting them by
+# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands...
+NUMBER_GROUPING = 0
+
+# Thousand separator symbol
+THOUSAND_SEPARATOR = ','
+
+# The tablespaces to use for each model when not specified otherwise.
+DEFAULT_TABLESPACE = ''
+DEFAULT_INDEX_TABLESPACE = ''
+
+# Default X-Frame-Options header value
+X_FRAME_OPTIONS = 'SAMEORIGIN'
+
+USE_X_FORWARDED_HOST = False
+USE_X_FORWARDED_PORT = False
+
+# The Python dotted path to the WSGI application that Django's internal server
+# (runserver) will use. If `None`, the return value of
+# 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same
+# behavior as previous versions of Django. Otherwise this should point to an
+# actual WSGI application object.
+WSGI_APPLICATION = None
+
+# If your Django app is behind a proxy that sets a header to specify secure
+# connections, AND that proxy ensures that user-submitted headers with the
+# same name are ignored (so that people can't spoof it), set this value to
+# a tuple of (header_name, header_value). For any requests that come in with
+# that header/value, request.is_secure() will return True.
+# WARNING! Only set this if you fully understand what you're doing. Otherwise,
+# you may be opening yourself up to a security risk.
+SECURE_PROXY_SSL_HEADER = None
+
+##############
+# MIDDLEWARE #
+##############
+
+# List of middleware to use. Order is important; in the request phase, these
+# middleware will be applied in the order given, and in the response
+# phase the middleware will be applied in reverse order.
+MIDDLEWARE = []
+
+############
+# SESSIONS #
+############
+
+# Cache to store session data if using the cache session backend.
+SESSION_CACHE_ALIAS = 'default'
+# Cookie name. This can be whatever you want.
+SESSION_COOKIE_NAME = 'sessionid'
+# Age of cookie, in seconds (default: 2 weeks).
+SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
+# A string like "example.com", or None for standard domain cookie.
+SESSION_COOKIE_DOMAIN = None
+# Whether the session cookie should be secure (https:// only).
+SESSION_COOKIE_SECURE = False
+# The path of the session cookie.
+SESSION_COOKIE_PATH = '/'
+# Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others)
+SESSION_COOKIE_HTTPONLY = True
+# Whether to save the session data on every request.
+SESSION_SAVE_EVERY_REQUEST = False
+# Whether a user's session cookie expires when the Web browser is closed.
+SESSION_EXPIRE_AT_BROWSER_CLOSE = False
+# The module to store session data
+SESSION_ENGINE = 'django.contrib.sessions.backends.db'
+# Directory to store session files if using the file session module. If None,
+# the backend will use a sensible default.
+SESSION_FILE_PATH = None
+# class to serialize session data
+SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
+
+#########
+# CACHE #
+#########
+
+# The cache backends to use.
+CACHES = {
+ 'default': {
+ 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
+ }
+}
+CACHE_MIDDLEWARE_KEY_PREFIX = ''
+CACHE_MIDDLEWARE_SECONDS = 600
+CACHE_MIDDLEWARE_ALIAS = 'default'
+
+##################
+# AUTHENTICATION #
+##################
+
+AUTH_USER_MODEL = 'auth.User'
+
+AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
+
+LOGIN_URL = '/accounts/login/'
+
+LOGIN_REDIRECT_URL = '/accounts/profile/'
+
+LOGOUT_REDIRECT_URL = None
+
+# The number of days a password reset link is valid for
+PASSWORD_RESET_TIMEOUT_DAYS = 3
+
+# the first hasher in this list is the preferred algorithm. any
+# password using different algorithms will be converted automatically
+# upon login
+PASSWORD_HASHERS = [
+ 'django.contrib.auth.hashers.PBKDF2PasswordHasher',
+ 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
+ 'django.contrib.auth.hashers.Argon2PasswordHasher',
+ 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
+ 'django.contrib.auth.hashers.BCryptPasswordHasher',
+]
+
+AUTH_PASSWORD_VALIDATORS = []
+
+###########
+# SIGNING #
+###########
+
+SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
+
+########
+# CSRF #
+########
+
+# Dotted path to callable to be used as view when a request is
+# rejected by the CSRF middleware.
+CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'
+
+# Settings for CSRF cookie.
+CSRF_COOKIE_NAME = 'csrftoken'
+CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52
+CSRF_COOKIE_DOMAIN = None
+CSRF_COOKIE_PATH = '/'
+CSRF_COOKIE_SECURE = False
+CSRF_COOKIE_HTTPONLY = False
+CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
+CSRF_TRUSTED_ORIGINS = []
+CSRF_USE_SESSIONS = False
+
+############
+# MESSAGES #
+############
+
+# Class to use as messages backend
+MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
+
+# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within
+# django.contrib.messages to avoid imports in this settings file.
+
+###########
+# LOGGING #
+###########
+
+# The callable to use to configure logging
+LOGGING_CONFIG = 'logging.config.dictConfig'
+
+# Custom logging configuration.
+LOGGING = {}
+
+# Default exception reporter filter class used in case none has been
+# specifically assigned to the HttpRequest instance.
+DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'
+
+###########
+# TESTING #
+###########
+
+# The name of the class to use to run the test suite
+TEST_RUNNER = 'django.test.runner.DiscoverRunner'
+
+# Apps that don't need to be serialized at test database creation time
+# (only apps with migrations are to start with)
+TEST_NON_SERIALIZED_APPS = []
+
+############
+# FIXTURES #
+############
+
+# The list of directories to search for fixtures
+FIXTURE_DIRS = []
+
+###############
+# STATICFILES #
+###############
+
+# A list of locations of additional static files
+STATICFILES_DIRS = []
+
+# The default file storage backend used during the build process
+STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
+
+# List of finder classes that know how to find static files in
+# various locations.
+STATICFILES_FINDERS = [
+ 'django.contrib.staticfiles.finders.FileSystemFinder',
+ 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
+ # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
+]
+
+##############
+# MIGRATIONS #
+##############
+
+# Migration module overrides for apps, by app label.
+MIGRATION_MODULES = {}
+
+#################
+# SYSTEM CHECKS #
+#################
+
+# List of all issues generated by system checks that should be silenced. Light
+# issues like warnings, infos or debugs will not generate a message. Silencing
+# serious issues like errors and criticals does not result in hiding the
+# message, but Django will not stop you from e.g. running server.
+SILENCED_SYSTEM_CHECKS = []
+
+#######################
+# SECURITY MIDDLEWARE #
+#######################
+SECURE_BROWSER_XSS_FILTER = False
+SECURE_CONTENT_TYPE_NOSNIFF = False
+SECURE_HSTS_INCLUDE_SUBDOMAINS = False
+SECURE_HSTS_PRELOAD = False
+SECURE_HSTS_SECONDS = 0
+SECURE_REDIRECT_EXEMPT = []
+SECURE_SSL_HOST = None
+SECURE_SSL_REDIRECT = False
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/__init__.py
new file mode 100644
index 0000000..330833d
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/__init__.py
@@ -0,0 +1,569 @@
+"""
+LANG_INFO is a dictionary structure to provide meta information about languages.
+
+About name_local: capitalize it as if your language name was appearing
+inside a sentence in your language.
+The 'fallback' key can be used to specify a special fallback logic which doesn't
+follow the traditional 'fr-ca' -> 'fr' fallback logic.
+"""
+
+LANG_INFO = {
+ 'af': {
+ 'bidi': False,
+ 'code': 'af',
+ 'name': 'Afrikaans',
+ 'name_local': 'Afrikaans',
+ },
+ 'ar': {
+ 'bidi': True,
+ 'code': 'ar',
+ 'name': 'Arabic',
+ 'name_local': 'العربيّة',
+ },
+ 'ast': {
+ 'bidi': False,
+ 'code': 'ast',
+ 'name': 'Asturian',
+ 'name_local': 'asturianu',
+ },
+ 'az': {
+ 'bidi': True,
+ 'code': 'az',
+ 'name': 'Azerbaijani',
+ 'name_local': 'Azərbaycanca',
+ },
+ 'be': {
+ 'bidi': False,
+ 'code': 'be',
+ 'name': 'Belarusian',
+ 'name_local': 'беларуская',
+ },
+ 'bg': {
+ 'bidi': False,
+ 'code': 'bg',
+ 'name': 'Bulgarian',
+ 'name_local': 'български',
+ },
+ 'bn': {
+ 'bidi': False,
+ 'code': 'bn',
+ 'name': 'Bengali',
+ 'name_local': 'বাংলা',
+ },
+ 'br': {
+ 'bidi': False,
+ 'code': 'br',
+ 'name': 'Breton',
+ 'name_local': 'brezhoneg',
+ },
+ 'bs': {
+ 'bidi': False,
+ 'code': 'bs',
+ 'name': 'Bosnian',
+ 'name_local': 'bosanski',
+ },
+ 'ca': {
+ 'bidi': False,
+ 'code': 'ca',
+ 'name': 'Catalan',
+ 'name_local': 'català',
+ },
+ 'cs': {
+ 'bidi': False,
+ 'code': 'cs',
+ 'name': 'Czech',
+ 'name_local': 'česky',
+ },
+ 'cy': {
+ 'bidi': False,
+ 'code': 'cy',
+ 'name': 'Welsh',
+ 'name_local': 'Cymraeg',
+ },
+ 'da': {
+ 'bidi': False,
+ 'code': 'da',
+ 'name': 'Danish',
+ 'name_local': 'dansk',
+ },
+ 'de': {
+ 'bidi': False,
+ 'code': 'de',
+ 'name': 'German',
+ 'name_local': 'Deutsch',
+ },
+ 'dsb': {
+ 'bidi': False,
+ 'code': 'dsb',
+ 'name': 'Lower Sorbian',
+ 'name_local': 'dolnoserbski',
+ },
+ 'el': {
+ 'bidi': False,
+ 'code': 'el',
+ 'name': 'Greek',
+ 'name_local': 'Ελληνικά',
+ },
+ 'en': {
+ 'bidi': False,
+ 'code': 'en',
+ 'name': 'English',
+ 'name_local': 'English',
+ },
+ 'en-au': {
+ 'bidi': False,
+ 'code': 'en-au',
+ 'name': 'Australian English',
+ 'name_local': 'Australian English',
+ },
+ 'en-gb': {
+ 'bidi': False,
+ 'code': 'en-gb',
+ 'name': 'British English',
+ 'name_local': 'British English',
+ },
+ 'eo': {
+ 'bidi': False,
+ 'code': 'eo',
+ 'name': 'Esperanto',
+ 'name_local': 'Esperanto',
+ },
+ 'es': {
+ 'bidi': False,
+ 'code': 'es',
+ 'name': 'Spanish',
+ 'name_local': 'español',
+ },
+ 'es-ar': {
+ 'bidi': False,
+ 'code': 'es-ar',
+ 'name': 'Argentinian Spanish',
+ 'name_local': 'español de Argentina',
+ },
+ 'es-co': {
+ 'bidi': False,
+ 'code': 'es-co',
+ 'name': 'Colombian Spanish',
+ 'name_local': 'español de Colombia',
+ },
+ 'es-mx': {
+ 'bidi': False,
+ 'code': 'es-mx',
+ 'name': 'Mexican Spanish',
+ 'name_local': 'español de Mexico',
+ },
+ 'es-ni': {
+ 'bidi': False,
+ 'code': 'es-ni',
+ 'name': 'Nicaraguan Spanish',
+ 'name_local': 'español de Nicaragua',
+ },
+ 'es-ve': {
+ 'bidi': False,
+ 'code': 'es-ve',
+ 'name': 'Venezuelan Spanish',
+ 'name_local': 'español de Venezuela',
+ },
+ 'et': {
+ 'bidi': False,
+ 'code': 'et',
+ 'name': 'Estonian',
+ 'name_local': 'eesti',
+ },
+ 'eu': {
+ 'bidi': False,
+ 'code': 'eu',
+ 'name': 'Basque',
+ 'name_local': 'Basque',
+ },
+ 'fa': {
+ 'bidi': True,
+ 'code': 'fa',
+ 'name': 'Persian',
+ 'name_local': 'فارسی',
+ },
+ 'fi': {
+ 'bidi': False,
+ 'code': 'fi',
+ 'name': 'Finnish',
+ 'name_local': 'suomi',
+ },
+ 'fr': {
+ 'bidi': False,
+ 'code': 'fr',
+ 'name': 'French',
+ 'name_local': 'français',
+ },
+ 'fy': {
+ 'bidi': False,
+ 'code': 'fy',
+ 'name': 'Frisian',
+ 'name_local': 'frysk',
+ },
+ 'ga': {
+ 'bidi': False,
+ 'code': 'ga',
+ 'name': 'Irish',
+ 'name_local': 'Gaeilge',
+ },
+ 'gd': {
+ 'bidi': False,
+ 'code': 'gd',
+ 'name': 'Scottish Gaelic',
+ 'name_local': 'Gàidhlig',
+ },
+ 'gl': {
+ 'bidi': False,
+ 'code': 'gl',
+ 'name': 'Galician',
+ 'name_local': 'galego',
+ },
+ 'he': {
+ 'bidi': True,
+ 'code': 'he',
+ 'name': 'Hebrew',
+ 'name_local': 'עברית',
+ },
+ 'hi': {
+ 'bidi': False,
+ 'code': 'hi',
+ 'name': 'Hindi',
+ 'name_local': 'Hindi',
+ },
+ 'hr': {
+ 'bidi': False,
+ 'code': 'hr',
+ 'name': 'Croatian',
+ 'name_local': 'Hrvatski',
+ },
+ 'hsb': {
+ 'bidi': False,
+ 'code': 'hsb',
+ 'name': 'Upper Sorbian',
+ 'name_local': 'hornjoserbsce',
+ },
+ 'hu': {
+ 'bidi': False,
+ 'code': 'hu',
+ 'name': 'Hungarian',
+ 'name_local': 'Magyar',
+ },
+ 'ia': {
+ 'bidi': False,
+ 'code': 'ia',
+ 'name': 'Interlingua',
+ 'name_local': 'Interlingua',
+ },
+ 'io': {
+ 'bidi': False,
+ 'code': 'io',
+ 'name': 'Ido',
+ 'name_local': 'ido',
+ },
+ 'id': {
+ 'bidi': False,
+ 'code': 'id',
+ 'name': 'Indonesian',
+ 'name_local': 'Bahasa Indonesia',
+ },
+ 'is': {
+ 'bidi': False,
+ 'code': 'is',
+ 'name': 'Icelandic',
+ 'name_local': 'Íslenska',
+ },
+ 'it': {
+ 'bidi': False,
+ 'code': 'it',
+ 'name': 'Italian',
+ 'name_local': 'italiano',
+ },
+ 'ja': {
+ 'bidi': False,
+ 'code': 'ja',
+ 'name': 'Japanese',
+ 'name_local': '日本語',
+ },
+ 'ka': {
+ 'bidi': False,
+ 'code': 'ka',
+ 'name': 'Georgian',
+ 'name_local': 'ქართული',
+ },
+ 'kab': {
+ 'bidi': False,
+ 'code': 'kab',
+ 'name': 'Kabyle',
+ 'name_local': 'taqbaylit',
+ },
+ 'kk': {
+ 'bidi': False,
+ 'code': 'kk',
+ 'name': 'Kazakh',
+ 'name_local': 'Қазақ',
+ },
+ 'km': {
+ 'bidi': False,
+ 'code': 'km',
+ 'name': 'Khmer',
+ 'name_local': 'Khmer',
+ },
+ 'kn': {
+ 'bidi': False,
+ 'code': 'kn',
+ 'name': 'Kannada',
+ 'name_local': 'Kannada',
+ },
+ 'ko': {
+ 'bidi': False,
+ 'code': 'ko',
+ 'name': 'Korean',
+ 'name_local': '한국어',
+ },
+ 'lb': {
+ 'bidi': False,
+ 'code': 'lb',
+ 'name': 'Luxembourgish',
+ 'name_local': 'Lëtzebuergesch',
+ },
+ 'lt': {
+ 'bidi': False,
+ 'code': 'lt',
+ 'name': 'Lithuanian',
+ 'name_local': 'Lietuviškai',
+ },
+ 'lv': {
+ 'bidi': False,
+ 'code': 'lv',
+ 'name': 'Latvian',
+ 'name_local': 'latviešu',
+ },
+ 'mk': {
+ 'bidi': False,
+ 'code': 'mk',
+ 'name': 'Macedonian',
+ 'name_local': 'Македонски',
+ },
+ 'ml': {
+ 'bidi': False,
+ 'code': 'ml',
+ 'name': 'Malayalam',
+ 'name_local': 'Malayalam',
+ },
+ 'mn': {
+ 'bidi': False,
+ 'code': 'mn',
+ 'name': 'Mongolian',
+ 'name_local': 'Mongolian',
+ },
+ 'mr': {
+ 'bidi': False,
+ 'code': 'mr',
+ 'name': 'Marathi',
+ 'name_local': 'मराठी',
+ },
+ 'my': {
+ 'bidi': False,
+ 'code': 'my',
+ 'name': 'Burmese',
+ 'name_local': 'မြန်မာဘာသာ',
+ },
+ 'nb': {
+ 'bidi': False,
+ 'code': 'nb',
+ 'name': 'Norwegian Bokmal',
+ 'name_local': 'norsk (bokmål)',
+ },
+ 'ne': {
+ 'bidi': False,
+ 'code': 'ne',
+ 'name': 'Nepali',
+ 'name_local': 'नेपाली',
+ },
+ 'nl': {
+ 'bidi': False,
+ 'code': 'nl',
+ 'name': 'Dutch',
+ 'name_local': 'Nederlands',
+ },
+ 'nn': {
+ 'bidi': False,
+ 'code': 'nn',
+ 'name': 'Norwegian Nynorsk',
+ 'name_local': 'norsk (nynorsk)',
+ },
+ 'no': {
+ 'bidi': False,
+ 'code': 'no',
+ 'name': 'Norwegian',
+ 'name_local': 'norsk',
+ },
+ 'os': {
+ 'bidi': False,
+ 'code': 'os',
+ 'name': 'Ossetic',
+ 'name_local': 'Ирон',
+ },
+ 'pa': {
+ 'bidi': False,
+ 'code': 'pa',
+ 'name': 'Punjabi',
+ 'name_local': 'Punjabi',
+ },
+ 'pl': {
+ 'bidi': False,
+ 'code': 'pl',
+ 'name': 'Polish',
+ 'name_local': 'polski',
+ },
+ 'pt': {
+ 'bidi': False,
+ 'code': 'pt',
+ 'name': 'Portuguese',
+ 'name_local': 'Português',
+ },
+ 'pt-br': {
+ 'bidi': False,
+ 'code': 'pt-br',
+ 'name': 'Brazilian Portuguese',
+ 'name_local': 'Português Brasileiro',
+ },
+ 'ro': {
+ 'bidi': False,
+ 'code': 'ro',
+ 'name': 'Romanian',
+ 'name_local': 'Română',
+ },
+ 'ru': {
+ 'bidi': False,
+ 'code': 'ru',
+ 'name': 'Russian',
+ 'name_local': 'Русский',
+ },
+ 'sk': {
+ 'bidi': False,
+ 'code': 'sk',
+ 'name': 'Slovak',
+ 'name_local': 'Slovensky',
+ },
+ 'sl': {
+ 'bidi': False,
+ 'code': 'sl',
+ 'name': 'Slovenian',
+ 'name_local': 'Slovenščina',
+ },
+ 'sq': {
+ 'bidi': False,
+ 'code': 'sq',
+ 'name': 'Albanian',
+ 'name_local': 'shqip',
+ },
+ 'sr': {
+ 'bidi': False,
+ 'code': 'sr',
+ 'name': 'Serbian',
+ 'name_local': 'српски',
+ },
+ 'sr-latn': {
+ 'bidi': False,
+ 'code': 'sr-latn',
+ 'name': 'Serbian Latin',
+ 'name_local': 'srpski (latinica)',
+ },
+ 'sv': {
+ 'bidi': False,
+ 'code': 'sv',
+ 'name': 'Swedish',
+ 'name_local': 'svenska',
+ },
+ 'sw': {
+ 'bidi': False,
+ 'code': 'sw',
+ 'name': 'Swahili',
+ 'name_local': 'Kiswahili',
+ },
+ 'ta': {
+ 'bidi': False,
+ 'code': 'ta',
+ 'name': 'Tamil',
+ 'name_local': 'தமிழ்',
+ },
+ 'te': {
+ 'bidi': False,
+ 'code': 'te',
+ 'name': 'Telugu',
+ 'name_local': 'తెలుగు',
+ },
+ 'th': {
+ 'bidi': False,
+ 'code': 'th',
+ 'name': 'Thai',
+ 'name_local': 'ภาษาไทย',
+ },
+ 'tr': {
+ 'bidi': False,
+ 'code': 'tr',
+ 'name': 'Turkish',
+ 'name_local': 'Türkçe',
+ },
+ 'tt': {
+ 'bidi': False,
+ 'code': 'tt',
+ 'name': 'Tatar',
+ 'name_local': 'Татарча',
+ },
+ 'udm': {
+ 'bidi': False,
+ 'code': 'udm',
+ 'name': 'Udmurt',
+ 'name_local': 'Удмурт',
+ },
+ 'uk': {
+ 'bidi': False,
+ 'code': 'uk',
+ 'name': 'Ukrainian',
+ 'name_local': 'Українська',
+ },
+ 'ur': {
+ 'bidi': True,
+ 'code': 'ur',
+ 'name': 'Urdu',
+ 'name_local': 'اردو',
+ },
+ 'vi': {
+ 'bidi': False,
+ 'code': 'vi',
+ 'name': 'Vietnamese',
+ 'name_local': 'Tiếng Việt',
+ },
+ 'zh-cn': {
+ 'fallback': ['zh-hans'],
+ },
+ 'zh-hans': {
+ 'bidi': False,
+ 'code': 'zh-hans',
+ 'name': 'Simplified Chinese',
+ 'name_local': '简体中文',
+ },
+ 'zh-hant': {
+ 'bidi': False,
+ 'code': 'zh-hant',
+ 'name': 'Traditional Chinese',
+ 'name_local': '繁體中文',
+ },
+ 'zh-hk': {
+ 'fallback': ['zh-hant'],
+ },
+ 'zh-mo': {
+ 'fallback': ['zh-hant'],
+ },
+ 'zh-my': {
+ 'fallback': ['zh-hans'],
+ },
+ 'zh-sg': {
+ 'fallback': ['zh-hans'],
+ },
+ 'zh-tw': {
+ 'fallback': ['zh-hant'],
+ },
+}
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..aa31fd9
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..8d85cae
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.po
new file mode 100644
index 0000000..7f34b07
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.po
@@ -0,0 +1,1231 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Stephen Cox , 2011-2012
+# unklphil , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/"
+"af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+msgid "Arabic"
+msgstr "Arabies"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "Aserbeidjans"
+
+msgid "Bulgarian"
+msgstr "Bulgaars"
+
+msgid "Belarusian"
+msgstr "Wit-Russies"
+
+msgid "Bengali"
+msgstr "Bengali"
+
+msgid "Breton"
+msgstr "Bretons"
+
+msgid "Bosnian"
+msgstr "Bosnies"
+
+msgid "Catalan"
+msgstr "Katalaans"
+
+msgid "Czech"
+msgstr "Tsjeggies"
+
+msgid "Welsh"
+msgstr "Welsh"
+
+msgid "Danish"
+msgstr "Deens"
+
+msgid "German"
+msgstr "Duits"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Grieks"
+
+msgid "English"
+msgstr "Engels"
+
+msgid "Australian English"
+msgstr "Australiese Engels"
+
+msgid "British English"
+msgstr "Britse Engels"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Spaans"
+
+msgid "Argentinian Spanish"
+msgstr "Argentynse Spaans"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Meksikaanse Spaans"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nicaraguaanse Spaans"
+
+msgid "Venezuelan Spanish"
+msgstr "Venezolaanse Spaans"
+
+msgid "Estonian"
+msgstr "Estnies"
+
+msgid "Basque"
+msgstr "Baskies"
+
+msgid "Persian"
+msgstr "Persies"
+
+msgid "Finnish"
+msgstr "Fins"
+
+msgid "French"
+msgstr "Fraans"
+
+msgid "Frisian"
+msgstr "Fries"
+
+msgid "Irish"
+msgstr "Iers"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Galicies"
+
+msgid "Hebrew"
+msgstr "Hebreeus"
+
+msgid "Hindi"
+msgstr "Hindoe"
+
+msgid "Croatian"
+msgstr "Kroaties"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Hongaars"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesies"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "Yslands"
+
+msgid "Italian"
+msgstr "Italiaans"
+
+msgid "Japanese"
+msgstr "Japannees"
+
+msgid "Georgian"
+msgstr "Georgian"
+
+msgid "Kazakh"
+msgstr "Kazakh"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Koreaanse"
+
+msgid "Luxembourgish"
+msgstr "Luxemburgs"
+
+msgid "Lithuanian"
+msgstr "Litaus"
+
+msgid "Latvian"
+msgstr "Lets"
+
+msgid "Macedonian"
+msgstr "Macedonies"
+
+msgid "Malayalam"
+msgstr "Malabaars"
+
+msgid "Mongolian"
+msgstr "Mongools"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr "Birmaans"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Nepalees"
+
+msgid "Dutch"
+msgstr "Nederlands"
+
+msgid "Norwegian Nynorsk"
+msgstr "Noorweegse Nynorsk"
+
+msgid "Ossetic"
+msgstr "Osseties"
+
+msgid "Punjabi"
+msgstr "Punjabi"
+
+msgid "Polish"
+msgstr "Pools"
+
+msgid "Portuguese"
+msgstr "Portugees"
+
+msgid "Brazilian Portuguese"
+msgstr "Brasiliaanse Portugees"
+
+msgid "Romanian"
+msgstr "Roemeens"
+
+msgid "Russian"
+msgstr "Russiese"
+
+msgid "Slovak"
+msgstr "Slowaakse"
+
+msgid "Slovenian"
+msgstr "Sloveens"
+
+msgid "Albanian"
+msgstr "Albanees"
+
+msgid "Serbian"
+msgstr "Serwies"
+
+msgid "Serbian Latin"
+msgstr "Serwies Latyns"
+
+msgid "Swedish"
+msgstr "Sweeds"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Teloegoe"
+
+msgid "Thai"
+msgstr "Thai"
+
+msgid "Turkish"
+msgstr "Turkish"
+
+msgid "Tatar"
+msgstr "Tataars"
+
+msgid "Udmurt"
+msgstr "Oedmoerts"
+
+msgid "Ukrainian"
+msgstr "Oekraïens"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Viëtnamees"
+
+msgid "Simplified Chinese"
+msgstr "Vereenvoudigde Sjinees"
+
+msgid "Traditional Chinese"
+msgstr "Tradisionele Chinese"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr "Sindikasie"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Sleutel 'n geldige waarde in."
+
+msgid "Enter a valid URL."
+msgstr "Sleutel 'n geldige URL in."
+
+msgid "Enter a valid integer."
+msgstr "Sleutel 'n geldige heelgetal in."
+
+msgid "Enter a valid email address."
+msgstr "Sleutel 'n geldige e-pos adres in."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Sleutel 'n geldige \"slak\" wat bestaan uit letters, syfers, beklemtoon of "
+"koppel."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Sleutel 'n geldige IPv4-adres in."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Voer 'n geldige IPv6-adres in."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Voer 'n geldige IPv4 of IPv6-adres in."
+
+msgid "Enter only digits separated by commas."
+msgstr "Sleutel slegs syfers in wat deur kommas geskei is."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Maak seker dat hierdie waarde %(limit_value)s is (dit is %(show_value)s )."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+"Maak seker dat hierdie waarde minder as of gelyk aan %(limit_value)s is."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Maak seker dat hierdie waarde groter as of gelyk aan %(limit_value)s is."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Maak seker hierdie waarde het ten minste %(limit_value)d karakter (dit het "
+"%(show_value)d)."
+msgstr[1] ""
+"Maak seker hierdie waarde het ten minste %(limit_value)d karakters (dit het "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Maak seker hierdie waarde het op die meeste %(limit_value)d karakter (dit "
+"het %(show_value)d)."
+msgstr[1] ""
+"Maak seker hierdie waarde het op die meeste %(limit_value)d karakters (dit "
+"het %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Maak seker dat daar nie meer as %(max)s syfer in totaal is nie."
+msgstr[1] "Maak seker dat daar nie meer as %(max)s syfers in totaal is nie."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Maak seker dat daar nie meer as %(max)s desimale plek is nie."
+msgstr[1] "Maak seker dat daar nie meer as %(max)s desimale plekke is nie."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Maak seker dat daar nie meer as %(max)s syfer voor die desimale punt is nie."
+msgstr[1] ""
+"Maak seker dat daar nie meer as %(max)s syfers voor die desimale punt is nie."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "en"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s met hierdie %(field_labels)s bestaan alreeds."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Waarde %(value)r is nie 'n geldige keuse nie."
+
+msgid "This field cannot be null."
+msgstr "Hierdie veld kan nie nil wees nie."
+
+msgid "This field cannot be blank."
+msgstr "Hierdie veld kan nie leeg wees nie."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s met hierdie %(field_label)s bestaan alreeds."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s moet uniek wees vir %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Veld van type: %(field_type)s "
+
+msgid "Integer"
+msgstr "Heelgetal"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' waarde moet 'n heelgetal wees."
+
+msgid "Big (8 byte) integer"
+msgstr "Groot (8 greep) heelgetal"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s' waarde moet óf True of False wees."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boole (Eder waar of vals)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (tot %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Kommas geskeide heelgetalle"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' waarde het 'n ongeldige datumformaat. Dit met in die JJJJ-MM-DD "
+"formaat wees."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"'%(value)s' waarde het die korrekte formaat (JJJJ-MM-DD), maar dit is 'n "
+"ongeldige datum."
+
+msgid "Date (without time)"
+msgstr "Datum (sonder die tyd)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"'%(value)s' waarde se formaat is ongeldig. Dit moet in JJJJ-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] formaat wees."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"'%(value)s' waarde het die korrekte formaat (JJJJ-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) maar dit is 'n ongeldige datum/tyd."
+
+msgid "Date (with time)"
+msgstr "Datum (met die tyd)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "'%(value)s' waarde moet 'n desimale getal wees."
+
+msgid "Decimal number"
+msgstr "Desimale getal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "E-pos adres"
+
+msgid "File path"
+msgstr "Lêer pad"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "'%(value)s' waarde meote 'n dryfpunt getal wees."
+
+msgid "Floating point number"
+msgstr "Dryfpunt getal"
+
+msgid "IPv4 address"
+msgstr "IPv4 adres"
+
+msgid "IP address"
+msgstr "IP adres"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "'%(value)s' waarde moet óf None, True of False wees."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boole (Eder waar, vals of niks)"
+
+msgid "Positive integer"
+msgstr "Positiewe heelgetal"
+
+msgid "Positive small integer"
+msgstr "Positiewe klein heelgetal"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (tot by %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Klein heelgetal"
+
+msgid "Text"
+msgstr "Teks"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"'%(value)s' waarde se formaat is ongeldig. Dit moet in HH:MM[:ss[.uuuuuu]] "
+"formaat wees."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"'%(value)s' waarde het die regte formaat (HH:MM[:ss[.uuuuuu]]) maar is nie "
+"'n geldige tyd nie."
+
+msgid "Time"
+msgstr "Tyd"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Rou binêre data"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "Lêer"
+
+msgid "Image"
+msgstr "Prent"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Vreemde sleutel (tipe bepaal deur verwante veld)"
+
+msgid "One-to-one relationship"
+msgstr "Een-tot-een-verhouding"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Baie-tot-baie-verwantskap"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Die veld is verpligtend."
+
+msgid "Enter a whole number."
+msgstr "Sleutel 'n hele getal in."
+
+msgid "Enter a number."
+msgstr "Sleutel 'n nommer in."
+
+msgid "Enter a valid date."
+msgstr "Sleutel 'n geldige datum in."
+
+msgid "Enter a valid time."
+msgstr "Sleutel 'n geldige tyd in."
+
+msgid "Enter a valid date/time."
+msgstr "Sleutel 'n geldige datum/tyd in."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Geen lêer is ingedien nie. Maak seker die kodering tipe op die vorm is reg."
+
+msgid "No file was submitted."
+msgstr "Geen lêer is ingedien nie."
+
+msgid "The submitted file is empty."
+msgstr "Die ingedien lêer is leeg."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Maak seker hierdie lêernaam het op die meeste %(max)d karakter (dit het "
+"%(length)d)."
+msgstr[1] ""
+"Maak seker hierdie lêernaam het op die meeste %(max)d karakters (dit het "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Stuur die lêer of tiek die maak skoon boksie, nie beide nie."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Laai 'n geldige prent. Die lêer wat jy opgelaai het is nie 'n prent nie of "
+"dit is 'n korrupte prent."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Kies 'n geldige keuse. %(value)s is nie een van die beskikbare keuses nie."
+
+msgid "Enter a list of values."
+msgstr "Sleatel 'n lys van waardes in."
+
+msgid "Enter a complete value."
+msgstr "Sleutel 'n volledige waarde in."
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Versteekte veld %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Dien asseblief %d of minder vorms in."
+msgstr[1] "Dien asseblief %d of minder vorms in."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Dien asseblief %d of meer vorms in."
+msgstr[1] "Dien asseblief %d of meer vorms in."
+
+msgid "Order"
+msgstr "Orde"
+
+msgid "Delete"
+msgstr "Verwyder"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Korrigeer die dubbele data vir %(field)s ."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Korrigeer die dubbele data vir %(field)s , dit moet uniek wees."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Korrigeer die dubbele data vir %(field_name)s, dit moet uniek wees vir die "
+"%(lookup)s in %(date_field)s ."
+
+msgid "Please correct the duplicate values below."
+msgstr "Korrigeer die dubbele waardes hieronder."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Kies 'n geldige keuse. Daardie keuse is nie een van die beskikbare keuses "
+"nie."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s kon nie in tydsone %(current_timezone)s vertolk word nie; dit "
+"mag dubbelsinnig wees, of nie bestaan nie."
+
+msgid "Clear"
+msgstr "Maak skoon"
+
+msgid "Currently"
+msgstr "Tans"
+
+msgid "Change"
+msgstr "Verander"
+
+msgid "Unknown"
+msgstr "Onbekend"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nee"
+
+msgid "yes,no,maybe"
+msgstr "ja,nee,miskien"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d greep"
+msgstr[1] "%(size)d grepe"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "nm"
+
+msgid "a.m."
+msgstr "vm"
+
+msgid "PM"
+msgstr "NM"
+
+msgid "AM"
+msgstr "VM"
+
+msgid "midnight"
+msgstr "middernag"
+
+msgid "noon"
+msgstr "middag"
+
+msgid "Monday"
+msgstr "Maandag"
+
+msgid "Tuesday"
+msgstr "Dinsdag"
+
+msgid "Wednesday"
+msgstr "Woensdag"
+
+msgid "Thursday"
+msgstr "Donderdag"
+
+msgid "Friday"
+msgstr "Vrydag"
+
+msgid "Saturday"
+msgstr "Saterdag"
+
+msgid "Sunday"
+msgstr "Sondag"
+
+msgid "Mon"
+msgstr "Ma"
+
+msgid "Tue"
+msgstr "Di"
+
+msgid "Wed"
+msgstr "Wo"
+
+msgid "Thu"
+msgstr "Do"
+
+msgid "Fri"
+msgstr "Vr"
+
+msgid "Sat"
+msgstr "Sa"
+
+msgid "Sun"
+msgstr "So"
+
+msgid "January"
+msgstr "Januarie"
+
+msgid "February"
+msgstr "Februarie"
+
+msgid "March"
+msgstr "Maart"
+
+msgid "April"
+msgstr "April"
+
+msgid "May"
+msgstr "Mei"
+
+msgid "June"
+msgstr "Junie"
+
+msgid "July"
+msgstr "Julie"
+
+msgid "August"
+msgstr "Augustus"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "Oktober"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "Desember"
+
+msgid "jan"
+msgstr "jan"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "mei"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "aug"
+
+msgid "sep"
+msgstr "sept"
+
+msgid "oct"
+msgstr "okt"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "des"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Maart"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mei"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Junie"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Julie"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Aug."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Okt."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Des."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Januarie"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Februarie"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Maart"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mei"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junie"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julie"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Augustus"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "September"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Oktober"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "November"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Desember"
+
+msgid "This is not a valid IPv6 address."
+msgstr "HIerdie is nie 'n geldige IPv6-adres nie."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "of"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ","
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d jaar"
+msgstr[1] "%d jare"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d maand"
+msgstr[1] "%d maande"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d week"
+msgstr[1] "%d weke"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dag"
+msgstr[1] "%d dae"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d uur"
+msgstr[1] "%d ure"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuut"
+msgstr[1] "%d minute"
+
+msgid "0 minutes"
+msgstr "0 minute"
+
+msgid "Forbidden"
+msgstr "Verbied"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr "Meer inligting is beskikbaar met DEBUG=True."
+
+msgid "No year specified"
+msgstr "Geen jaar gespesifiseer"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Geen maand gespesifiseer"
+
+msgid "No day specified"
+msgstr "Geen dag gespesifiseer"
+
+msgid "No week specified"
+msgstr "Geen week gespesifiseer"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Geen %(verbose_name_plural)s beskikbaar nie"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Toekomstige %(verbose_name_plural)s is nie beskikbaar nie, omdat "
+"%(class_name)s.allow_future vals is."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Ongeldige datum string '%(datestr)s' die formaat moet wees '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Geen %(verbose_name)s gevind vir die soektog"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"Bladsy is nie 'laaste' nie, en dit kan nie omgeskakel word na 'n heelgetal "
+"nie."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Ongeldige bladsy (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Leë lys en ' %(class_name)s.allow_empty' is vals."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Gids indekse word nie hier toegelaat nie."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" bestaan nie"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Indeks van %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6330ab5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d0c82d8
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po
@@ -0,0 +1,1314 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Bashar Al-Abdulhadi, 2015-2016
+# Bashar Al-Abdulhadi, 2014
+# Eyad Toma , 2013-2014
+# Jannis Leidel , 2011
+# Ossama Khayat , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+msgid "Afrikaans"
+msgstr "الإفريقية"
+
+msgid "Arabic"
+msgstr "العربيّة"
+
+msgid "Asturian"
+msgstr "الأسترية"
+
+msgid "Azerbaijani"
+msgstr "الأذربيجانية"
+
+msgid "Bulgarian"
+msgstr "البلغاريّة"
+
+msgid "Belarusian"
+msgstr "البيلاروسية"
+
+msgid "Bengali"
+msgstr "البنغاليّة"
+
+msgid "Breton"
+msgstr "البريتونية"
+
+msgid "Bosnian"
+msgstr "البوسنيّة"
+
+msgid "Catalan"
+msgstr "الكتلانيّة"
+
+msgid "Czech"
+msgstr "التشيكيّة"
+
+msgid "Welsh"
+msgstr "الويلز"
+
+msgid "Danish"
+msgstr "الدنماركيّة"
+
+msgid "German"
+msgstr "الألمانيّة"
+
+msgid "Lower Sorbian"
+msgstr "الصربية السفلى"
+
+msgid "Greek"
+msgstr "اليونانيّة"
+
+msgid "English"
+msgstr "الإنجليزيّة"
+
+msgid "Australian English"
+msgstr "الإنجليزية الإسترالية"
+
+msgid "British English"
+msgstr "الإنجليزيّة البريطانيّة"
+
+msgid "Esperanto"
+msgstr "الاسبرانتو"
+
+msgid "Spanish"
+msgstr "الإسبانيّة"
+
+msgid "Argentinian Spanish"
+msgstr "الأسبانية الأرجنتينية"
+
+msgid "Colombian Spanish"
+msgstr "الكولومبية الإسبانية"
+
+msgid "Mexican Spanish"
+msgstr "الأسبانية المكسيكية"
+
+msgid "Nicaraguan Spanish"
+msgstr "الإسبانية النيكاراغوية"
+
+msgid "Venezuelan Spanish"
+msgstr "الإسبانية الفنزويلية"
+
+msgid "Estonian"
+msgstr "الإستونيّة"
+
+msgid "Basque"
+msgstr "الباسك"
+
+msgid "Persian"
+msgstr "الفارسيّة"
+
+msgid "Finnish"
+msgstr "الفنلنديّة"
+
+msgid "French"
+msgstr "الفرنسيّة"
+
+msgid "Frisian"
+msgstr "الفريزيّة"
+
+msgid "Irish"
+msgstr "الإيرلنديّة"
+
+msgid "Scottish Gaelic"
+msgstr "الغيلية الأسكتلندية"
+
+msgid "Galician"
+msgstr "الجليقيّة"
+
+msgid "Hebrew"
+msgstr "العبريّة"
+
+msgid "Hindi"
+msgstr "الهندية"
+
+msgid "Croatian"
+msgstr "الكرواتيّة"
+
+msgid "Upper Sorbian"
+msgstr "الصربية العليا"
+
+msgid "Hungarian"
+msgstr "الهنغاريّة"
+
+msgid "Interlingua"
+msgstr "اللغة الوسيطة"
+
+msgid "Indonesian"
+msgstr "الإندونيسيّة"
+
+msgid "Ido"
+msgstr "ايدو"
+
+msgid "Icelandic"
+msgstr "الآيسلنديّة"
+
+msgid "Italian"
+msgstr "الإيطاليّة"
+
+msgid "Japanese"
+msgstr "اليابانيّة"
+
+msgid "Georgian"
+msgstr "الجورجيّة"
+
+msgid "Kazakh"
+msgstr "الكازاخستانية"
+
+msgid "Khmer"
+msgstr "الخمر"
+
+msgid "Kannada"
+msgstr "الهنديّة (كنّادا)"
+
+msgid "Korean"
+msgstr "الكوريّة"
+
+msgid "Luxembourgish"
+msgstr "اللوكسمبرجية"
+
+msgid "Lithuanian"
+msgstr "اللتوانيّة"
+
+msgid "Latvian"
+msgstr "اللاتفيّة"
+
+msgid "Macedonian"
+msgstr "المقدونيّة"
+
+msgid "Malayalam"
+msgstr "المايالام"
+
+msgid "Mongolian"
+msgstr "المنغوليّة"
+
+msgid "Marathi"
+msgstr "المهاراتية"
+
+msgid "Burmese"
+msgstr "البورمية"
+
+msgid "Norwegian Bokmål"
+msgstr "النرويجية"
+
+msgid "Nepali"
+msgstr "النيبالية"
+
+msgid "Dutch"
+msgstr "الهولنديّة"
+
+msgid "Norwegian Nynorsk"
+msgstr "النينورسك نرويجيّة"
+
+msgid "Ossetic"
+msgstr "الأوسيتيكية"
+
+msgid "Punjabi"
+msgstr "البنجابيّة"
+
+msgid "Polish"
+msgstr "البولنديّة"
+
+msgid "Portuguese"
+msgstr "البرتغاليّة"
+
+msgid "Brazilian Portuguese"
+msgstr "البرتغاليّة البرازيليّة"
+
+msgid "Romanian"
+msgstr "الرومانيّة"
+
+msgid "Russian"
+msgstr "الروسيّة"
+
+msgid "Slovak"
+msgstr "السلوفاكيّة"
+
+msgid "Slovenian"
+msgstr "السلوفانيّة"
+
+msgid "Albanian"
+msgstr "الألبانيّة"
+
+msgid "Serbian"
+msgstr "الصربيّة"
+
+msgid "Serbian Latin"
+msgstr "اللاتينيّة الصربيّة"
+
+msgid "Swedish"
+msgstr "السويديّة"
+
+msgid "Swahili"
+msgstr "السواحلية"
+
+msgid "Tamil"
+msgstr "التاميل"
+
+msgid "Telugu"
+msgstr "التيلوغو"
+
+msgid "Thai"
+msgstr "التايلنديّة"
+
+msgid "Turkish"
+msgstr "التركيّة"
+
+msgid "Tatar"
+msgstr "التتاريية"
+
+msgid "Udmurt"
+msgstr "الأدمرتية"
+
+msgid "Ukrainian"
+msgstr "الأكرانيّة"
+
+msgid "Urdu"
+msgstr "الأوردو"
+
+msgid "Vietnamese"
+msgstr "الفيتناميّة"
+
+msgid "Simplified Chinese"
+msgstr "الصينيّة المبسطة"
+
+msgid "Traditional Chinese"
+msgstr "الصينيّة التقليدية"
+
+msgid "Messages"
+msgstr "الرسائل"
+
+msgid "Site Maps"
+msgstr "خرائط الموقع"
+
+msgid "Static Files"
+msgstr "الملفات الثابتة"
+
+msgid "Syndication"
+msgstr "توظيف النشر"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "أدخل قيمة صحيحة."
+
+msgid "Enter a valid URL."
+msgstr "أدخل رابطاً صحيحاً."
+
+msgid "Enter a valid integer."
+msgstr "أدخل رقم صالح."
+
+msgid "Enter a valid email address."
+msgstr "أدخل عنوان بريد إلكتروني صحيح."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr "أدخل اختصار 'slug' صحيح يتكوّن من أحرف، أرقام، شرطات سفلية وعاديّة."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr "أدخل اختصار 'slug' صحيح يتكوّن من أحرف، أرقام، شرطات سفلية وعاديّة."
+
+msgid "Enter a valid IPv4 address."
+msgstr "أدخل عنوان IPv4 صحيح."
+
+msgid "Enter a valid IPv6 address."
+msgstr "أدخل عنوان IPv6 صحيح."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "أدخل عنوان IPv4 أو عنوان IPv6 صحيح."
+
+msgid "Enter only digits separated by commas."
+msgstr "أدخل أرقاما فقط مفصول بينها بفواصل."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "تحقق من أن هذه القيمة هي %(limit_value)s (إنها %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "تحقق من أن تكون هذه القيمة أقل من %(limit_value)s أو مساوية لها."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "تحقق من أن تكون هذه القيمة أكثر من %(limit_value)s أو مساوية لها."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[1] ""
+"تأكد أن هذه القيمة تحتوي على حرف أو رمز %(limit_value)d على الأقل (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[2] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف و رمز على الأقل (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[3] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[4] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[5] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي "
+"حالياً على %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[1] ""
+"تأكد أن هذه القيمة تحتوي على حرف أو رمز %(limit_value)d على الأكثر (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[2] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف و رمز على الأكثر (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[3] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[4] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي "
+"حالياً على %(show_value)d)."
+msgstr[5] ""
+"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي "
+"حالياً على %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "تحقق من أن تدخل %(max)s أرقام لا أكثر."
+msgstr[1] "تحقق من أن تدخل رقم %(max)s لا أكثر."
+msgstr[2] "تحقق من أن تدخل %(max)s رقمين لا أكثر."
+msgstr[3] "تحقق من أن تدخل %(max)s أرقام لا أكثر."
+msgstr[4] "تحقق من أن تدخل %(max)s أرقام لا أكثر."
+msgstr[5] "تحقق من أن تدخل %(max)s أرقام لا أكثر."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر."
+msgstr[1] "تحقق من أن تدخل خانة %(max)s عشرية لا أكثر."
+msgstr[2] "تحقق من أن تدخل %(max)s خانتين عشريتين لا أكثر."
+msgstr[3] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر."
+msgstr[4] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر."
+msgstr[5] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر."
+msgstr[1] "تحقق من أن تدخل رقم %(max)s قبل الفاصل العشري لا أكثر."
+msgstr[2] "تحقق من أن تدخل %(max)s رقمين قبل الفاصل العشري لا أكثر."
+msgstr[3] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر."
+msgstr[4] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر."
+msgstr[5] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "و"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s بهذا %(field_labels)s موجود سلفاً."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "القيمة %(value)r ليست خيارا صحيحاً."
+
+msgid "This field cannot be null."
+msgstr "لا يمكن تعيين null كقيمة لهذا الحقل."
+
+msgid "This field cannot be blank."
+msgstr "لا يمكن ترك هذا الحقل فارغاً."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "النموذج %(model_name)s والحقل %(field_label)s موجود مسبقاً."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s يجب أن يكون فريد لـ %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "حقل نوع: %(field_type)s"
+
+msgid "Integer"
+msgstr "عدد صحيح"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "قيمة '%(value)s' يجب ان تكون عدد صحيح."
+
+msgid "Big (8 byte) integer"
+msgstr "عدد صحيح كبير (8 بايت)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "قيمة '%(value)s' يجب أن تكون True أو False."
+
+msgid "Boolean (Either True or False)"
+msgstr "ثنائي (إما True أو False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "سلسلة نص (%(max_length)s كحد أقصى)"
+
+msgid "Comma-separated integers"
+msgstr "أرقام صحيحة مفصولة بفواصل"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"قيمة '%(value)s' ليست من بُنية تاريخ صحيحة. القيمة يجب ان تكون من البُنية YYYY-"
+"MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr "قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD) لكنها تحوي تاريخ غير صحيح."
+
+msgid "Date (without time)"
+msgstr "التاريخ (دون الوقت)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"قيمة '%(value)s' ليست من بُنية صحيحة. القيمة يجب ان تكون من البُنية YYYY-MM-DD "
+"HH:MM[:ss[.uuuuuu]][TZ] ."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) لكنها "
+"تحوي وقت و تاريخ غير صحيحين."
+
+msgid "Date (with time)"
+msgstr "التاريخ (مع الوقت)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "قيمة '%(value)s' يجب ان تكون عدد عشري."
+
+msgid "Decimal number"
+msgstr "رقم عشري"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"قيمة '%(value)s' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق [DD] [HH:"
+"[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "المدّة"
+
+msgid "Email address"
+msgstr "عنوان بريد إلكتروني"
+
+msgid "File path"
+msgstr "مسار الملف"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "قيمة '%(value)s' يجب ان تكون عدد فاصل عائم."
+
+msgid "Floating point number"
+msgstr "رقم فاصلة عائمة"
+
+msgid "IPv4 address"
+msgstr "عنوان IPv4"
+
+msgid "IP address"
+msgstr "عنوان IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "قيمة '%(value)s' يجب ان تكون None أو True أو False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "ثنائي (إما True أو False أو None)"
+
+msgid "Positive integer"
+msgstr "عدد صحيح موجب"
+
+msgid "Positive small integer"
+msgstr "عدد صحيح صغير موجب"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (حتى %(max_length)s)"
+
+msgid "Small integer"
+msgstr "عدد صحيح صغير"
+
+msgid "Text"
+msgstr "نص"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"قيمة '%(value)s' ليست من بُنية صحيحة. القيمة يجب ان تكون من البُنية HH:MM[:ss[."
+"uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"قيمة '%(value)s' من بُنية صحيحة (HH:MM[:ss[.uuuuuu]]) لكنها تحوي وقت غير صحيح."
+
+msgid "Time"
+msgstr "وقت"
+
+msgid "URL"
+msgstr "رابط"
+
+msgid "Raw binary data"
+msgstr "البيانات الثنائية الخام"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' ليست قيمة UUID صحيحة."
+
+msgid "File"
+msgstr "ملف"
+
+msgid "Image"
+msgstr "صورة"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "النموذج %(model)s ذو الحقل و القيمة %(field)s %(value)r غير موجود."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "الحقل المرتبط (تم تحديد النوع وفقاً للحقل المرتبط)"
+
+msgid "One-to-one relationship"
+msgstr "علاقة واحد إلى واحد"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "%(from)s-%(to)s علاقة"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "%(from)s-%(to)s علاقات"
+
+msgid "Many-to-many relationship"
+msgstr "علاقة متعدد إلى متعدد"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "هذا الحقل مطلوب."
+
+msgid "Enter a whole number."
+msgstr "أدخل رقما صحيحا."
+
+msgid "Enter a number."
+msgstr "أدخل رقماً."
+
+msgid "Enter a valid date."
+msgstr "أدخل تاريخاً صحيحاً."
+
+msgid "Enter a valid time."
+msgstr "أدخل وقتاً صحيحاً."
+
+msgid "Enter a valid date/time."
+msgstr "أدخل تاريخاً/وقتاً صحيحاً."
+
+msgid "Enter a valid duration."
+msgstr "أدخل مدّة صحيحة"
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز الاستمارة."
+
+msgid "No file was submitted."
+msgstr "لم يتم إرسال اي ملف."
+
+msgid "The submitted file is empty."
+msgstr "الملف الذي قمت بإرساله فارغ."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على "
+"%(length)d حرف)."
+msgstr[1] ""
+"تأكد أن إسم هذا الملف يحتوي على حرف %(max)d على الأكثر (هو يحتوي الآن على "
+"%(length)d حرف)."
+msgstr[2] ""
+"تأكد أن إسم هذا الملف يحتوي على %(max)d حرفين على الأكثر (هو يحتوي الآن على "
+"%(length)d حرف)."
+msgstr[3] ""
+"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على "
+"%(length)d حرف)."
+msgstr[4] ""
+"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على "
+"%(length)d حرف)."
+msgstr[5] ""
+"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على "
+"%(length)d حرف)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "رجاءً أرسل ملف أو صح علامة صح عند مربع اختيار \"فارغ\"، وليس كلاهما."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"قم برفع صورة صحيحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف "
+"معطوب."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "انتق خياراً صحيحاً. %(value)s ليس أحد الخيارات المتاحة."
+
+msgid "Enter a list of values."
+msgstr "أدخل قائمة من القيم."
+
+msgid "Enter a complete value."
+msgstr "إدخال قيمة كاملة."
+
+msgid "Enter a valid UUID."
+msgstr "أدخل قيمة UUID صحيحة."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(الحقل الخفي %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "بيانات ManagementForm مفقودة أو تم العبث بها"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "الرجاء إرسال %d إستمارة أو أقل."
+msgstr[1] "الرجاء إرسال إستمارة %d أو أقل"
+msgstr[2] "الرجاء إرسال %d إستمارتين أو أقل"
+msgstr[3] "الرجاء إرسال %d إستمارة أو أقل"
+msgstr[4] "الرجاء إرسال %d إستمارة أو أقل"
+msgstr[5] "الرجاء إرسال %d إستمارة أو أقل"
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "الرجاء إرسال %d إستمارة أو أكثر."
+msgstr[1] "الرجاء إرسال إستمارة %d أو أكثر."
+msgstr[2] "الرجاء إرسال %d إستمارتين أو أكثر."
+msgstr[3] "الرجاء إرسال %d إستمارة أو أكثر."
+msgstr[4] "الرجاء إرسال %d إستمارة أو أكثر."
+msgstr[5] "الرجاء إرسال %d إستمارة أو أكثر."
+
+msgid "Order"
+msgstr "الترتيب"
+
+msgid "Delete"
+msgstr "احذف"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "رجاء صحّح بيانات %(field)s المتكررة."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "رجاء صحّح بيانات %(field)s المتكررة والتي يجب أن تكون مُميّزة."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"رجاء صحّح بيانات %(field_name)s المتكررة والتي يجب أن تكون مُميّزة لـ%(lookup)s "
+"في %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "رجاءً صحّح القيم المُكرّرة أدناه."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "انتق خياراً صحيحاً. اختيارك ليس أحد الخيارات المتاحة."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s لا يمكن تفسيرها في المنطقة الزمنية %(current_timezone)s; قد "
+"تكون غامضة أو أنها غير موجودة."
+
+msgid "Clear"
+msgstr "تفريغ"
+
+msgid "Currently"
+msgstr "حالياً"
+
+msgid "Change"
+msgstr "عدّل"
+
+msgid "Unknown"
+msgstr "مجهول"
+
+msgid "Yes"
+msgstr "نعم"
+
+msgid "No"
+msgstr "لا"
+
+msgid "yes,no,maybe"
+msgstr "نعم,لا,ربما"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d بايت"
+msgstr[1] "بايت واحد"
+msgstr[2] "بايتان"
+msgstr[3] "%(size)d بايتان"
+msgstr[4] "%(size)d بايت"
+msgstr[5] "%(size)d بايت"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s ك.ب"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s م.ب"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s ج.ب"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s ت.ب"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s ب.ب"
+
+msgid "p.m."
+msgstr "م"
+
+msgid "a.m."
+msgstr "ص"
+
+msgid "PM"
+msgstr "م"
+
+msgid "AM"
+msgstr "ص"
+
+msgid "midnight"
+msgstr "منتصف الليل"
+
+msgid "noon"
+msgstr "ظهراً"
+
+msgid "Monday"
+msgstr "الاثنين"
+
+msgid "Tuesday"
+msgstr "الثلاثاء"
+
+msgid "Wednesday"
+msgstr "الأربعاء"
+
+msgid "Thursday"
+msgstr "الخميس"
+
+msgid "Friday"
+msgstr "الجمعة"
+
+msgid "Saturday"
+msgstr "السبت"
+
+msgid "Sunday"
+msgstr "الأحد"
+
+msgid "Mon"
+msgstr "إثنين"
+
+msgid "Tue"
+msgstr "ثلاثاء"
+
+msgid "Wed"
+msgstr "أربعاء"
+
+msgid "Thu"
+msgstr "خميس"
+
+msgid "Fri"
+msgstr "جمعة"
+
+msgid "Sat"
+msgstr "سبت"
+
+msgid "Sun"
+msgstr "أحد"
+
+msgid "January"
+msgstr "يناير"
+
+msgid "February"
+msgstr "فبراير"
+
+msgid "March"
+msgstr "مارس"
+
+msgid "April"
+msgstr "إبريل"
+
+msgid "May"
+msgstr "مايو"
+
+msgid "June"
+msgstr "يونيو"
+
+msgid "July"
+msgstr "يوليو"
+
+msgid "August"
+msgstr "أغسطس"
+
+msgid "September"
+msgstr "سبتمبر"
+
+msgid "October"
+msgstr "أكتوبر"
+
+msgid "November"
+msgstr "نوفمبر"
+
+msgid "December"
+msgstr "ديسمبر"
+
+msgid "jan"
+msgstr "يناير"
+
+msgid "feb"
+msgstr "فبراير"
+
+msgid "mar"
+msgstr "مارس"
+
+msgid "apr"
+msgstr "إبريل"
+
+msgid "may"
+msgstr "مايو"
+
+msgid "jun"
+msgstr "يونيو"
+
+msgid "jul"
+msgstr "يوليو"
+
+msgid "aug"
+msgstr "أغسطس"
+
+msgid "sep"
+msgstr "سبتمبر"
+
+msgid "oct"
+msgstr "أكتوبر"
+
+msgid "nov"
+msgstr "نوفمبر"
+
+msgid "dec"
+msgstr "ديسمبر"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "يناير"
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "فبراير"
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "مارس"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "إبريل"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "مايو"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "يونيو"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "يوليو"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "أغسطس"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "سبتمبر"
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "أكتوبر"
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "نوفمبر"
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "ديسمبر"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "يناير"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "فبراير"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "مارس"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "أبريل"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "مايو"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "يونيو"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "يوليو"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "أغسطس"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "سبتمبر"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "أكتوبر"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "نوفمبر"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "ديسمبر"
+
+msgid "This is not a valid IPv6 address."
+msgstr "هذا ليس عنوان IPv6 صحيح."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "أو"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr "، "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d سنة"
+msgstr[1] "%d سنة"
+msgstr[2] "%d سنوات"
+msgstr[3] "%d سنوات"
+msgstr[4] "%d سنوات"
+msgstr[5] "%d سنوات"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d شهر"
+msgstr[1] "%d شهر"
+msgstr[2] "%d شهرين"
+msgstr[3] "%d أشهر"
+msgstr[4] "%d شهر"
+msgstr[5] "%d شهر"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d اسبوع."
+msgstr[1] "%d اسبوع."
+msgstr[2] "%d أسبوعين"
+msgstr[3] "%d أسابيع"
+msgstr[4] "%d اسبوع."
+msgstr[5] "%d أسبوع"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d يوم"
+msgstr[1] "%d يوم"
+msgstr[2] "%d يومان"
+msgstr[3] "%d أيام"
+msgstr[4] "%d يوم"
+msgstr[5] "%d يوم"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ساعة"
+msgstr[1] "%d ساعة واحدة"
+msgstr[2] "%d ساعتين"
+msgstr[3] "%d ساعات"
+msgstr[4] "%d ساعة"
+msgstr[5] "%d ساعة"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d دقيقة"
+msgstr[1] "%d دقيقة"
+msgstr[2] "%d دقيقتين"
+msgstr[3] "%d دقائق"
+msgstr[4] "%d دقيقة"
+msgstr[5] "%d دقيقة"
+
+msgid "0 minutes"
+msgstr "0 دقيقة"
+
+msgid "Forbidden"
+msgstr "ممنوع"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "تم الفشل للتحقق من CSRF. تم إنهاء الطلب."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"أنت ترى هذه الرسالة لأن هذا الموقع HTTPS يتطلب إرسال 'Referer header' من "
+"قبل المتصفح، ولكن لم تم إرسال أي شيء. هذا الـheader مطلوب لأسباب أمنية، "
+"لضمان أن متصفحك لم يتم اختطافه من قبل أطراف أخرى."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"إذا قمت بضبط متصفحك لتعطيل 'Referer headers'، يرجى إعادة تفعيلها، على الأقل "
+"بالنسبة لهذا الموقع، أو لاتصالات HTTPS، أو للطلبات من نفس المنشأ 'same-"
+"origin'."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"أنت ترى هذه الرسالة لأن هذا الموقع يتطلب كعكة CSRF عند تقديم النماذج. ملف "
+"الكعكة هذا مطلوب لأسباب أمنية في تعريف الإرتباط، لضمان أنه لم يتم اختطاف "
+"المتصفح من قبل أطراف أخرى."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"إذا قمت بضبط المتصفح لتعطيل الكوكيز الرجاء إعادة تغعيلها، على الأقل بالنسبة "
+"لهذا الموقع، أو للطلبات من نفس المنشأ 'same-origin'."
+
+msgid "More information is available with DEBUG=True."
+msgstr "يتوفر مزيد من المعلومات عند ضبط الخيار DEBUG=True."
+
+msgid "No year specified"
+msgstr "لم تحدد السنة"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "لم تحدد الشهر"
+
+msgid "No day specified"
+msgstr "لم تحدد اليوم"
+
+msgid "No week specified"
+msgstr "لم تحدد الأسبوع"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "لا يوجد %(verbose_name_plural)s"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"التاريخ بالمستقبل %(verbose_name_plural)s غير متوفر لأن قيمة %(class_name)s."
+"allow_future هي False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "نسق تاريخ غير صحيح '%(datestr)s' محدد بالشكل '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "لم يعثر على أي %(verbose_name)s مطابقة لهذا الإستعلام"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "الصفحة ليست 'الأخيرة'، ولا يمكن تحويل القيمة إلى رقم صحيح."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "صفحة خاطئة (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "قائمة فارغة و '%(class_name)s.allow_empty' قيمته False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "لا يسمح لفهارس الدليل هنا."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "المسار \"%(path)s\" غير موجود."
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "فهرس لـ %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..7c421f6
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..15b9ebe
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/formats.py
new file mode 100644
index 0000000..770b453
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ar/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F، Y'
+TIME_FORMAT = 'g:i A'
+# DATETIME_FORMAT =
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+# SHORT_DATETIME_FORMAT =
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6c1e32e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po
new file mode 100644
index 0000000..14ac3f6
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po
@@ -0,0 +1,1212 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ḷḷumex03 , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Asturian (http://www.transifex.com/django/django/language/"
+"ast/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ast\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikáans"
+
+msgid "Arabic"
+msgstr "Árabe"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "Azerbaixanu"
+
+msgid "Bulgarian"
+msgstr "Búlgaru"
+
+msgid "Belarusian"
+msgstr "Bielorrusu"
+
+msgid "Bengali"
+msgstr "Bengalí"
+
+msgid "Breton"
+msgstr "Bretón"
+
+msgid "Bosnian"
+msgstr "Bosniu"
+
+msgid "Catalan"
+msgstr "Catalán"
+
+msgid "Czech"
+msgstr "Checu"
+
+msgid "Welsh"
+msgstr "Galés"
+
+msgid "Danish"
+msgstr "Danés"
+
+msgid "German"
+msgstr "Alemán"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Griegu"
+
+msgid "English"
+msgstr "Inglés"
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr "Inglés británicu"
+
+msgid "Esperanto"
+msgstr "Esperantu"
+
+msgid "Spanish"
+msgstr "Castellán"
+
+msgid "Argentinian Spanish"
+msgstr "Español arxentín"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Español mexicanu"
+
+msgid "Nicaraguan Spanish"
+msgstr "Español nicaraguanu"
+
+msgid "Venezuelan Spanish"
+msgstr "Español venezolanu"
+
+msgid "Estonian"
+msgstr "Estoniu"
+
+msgid "Basque"
+msgstr "Vascu"
+
+msgid "Persian"
+msgstr "Persa"
+
+msgid "Finnish"
+msgstr "Finés"
+
+msgid "French"
+msgstr "Francés"
+
+msgid "Frisian"
+msgstr "Frisón"
+
+msgid "Irish"
+msgstr "Irlandés"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Gallegu"
+
+msgid "Hebrew"
+msgstr "Hebréu"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croata"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Húngaru"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesiu"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "Islandés"
+
+msgid "Italian"
+msgstr "Italianu"
+
+msgid "Japanese"
+msgstr "Xaponés"
+
+msgid "Georgian"
+msgstr "Xeorxanu"
+
+msgid "Kazakh"
+msgstr "Kazakh"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Canarés"
+
+msgid "Korean"
+msgstr "Coreanu"
+
+msgid "Luxembourgish"
+msgstr "Luxemburgués"
+
+msgid "Lithuanian"
+msgstr "Lituanu"
+
+msgid "Latvian"
+msgstr "Letón"
+
+msgid "Macedonian"
+msgstr "Macedoniu"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongol"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr "Birmanu"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Nepalí"
+
+msgid "Dutch"
+msgstr "Holandés"
+
+msgid "Norwegian Nynorsk"
+msgstr "Nynorsk noruegu"
+
+msgid "Ossetic"
+msgstr "Osetiu"
+
+msgid "Punjabi"
+msgstr "Punjabi"
+
+msgid "Polish"
+msgstr "Polacu"
+
+msgid "Portuguese"
+msgstr "Portugués"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugués brasileñu"
+
+msgid "Romanian"
+msgstr "Rumanu"
+
+msgid "Russian"
+msgstr "Rusu"
+
+msgid "Slovak"
+msgstr "Eslovacu"
+
+msgid "Slovenian"
+msgstr "Eslovenu"
+
+msgid "Albanian"
+msgstr "Albanu"
+
+msgid "Serbian"
+msgstr "Serbiu"
+
+msgid "Serbian Latin"
+msgstr "Serbiu llatín"
+
+msgid "Swedish"
+msgstr "Suecu"
+
+msgid "Swahili"
+msgstr "Suaḥili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Tailandés"
+
+msgid "Turkish"
+msgstr "Turcu"
+
+msgid "Tatar"
+msgstr "Tatar"
+
+msgid "Udmurt"
+msgstr "Udmurtu"
+
+msgid "Ukrainian"
+msgstr "Ucranianu"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "Chinu simplificáu"
+
+msgid "Traditional Chinese"
+msgstr "Chinu tradicional"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Introduz un valor válidu."
+
+msgid "Enter a valid URL."
+msgstr "Introduz una URL válida."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr "Introduz una direición de corréu válida."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Introduz un 'slug' válidu que consista en lletres, númberu, guiones baxos o "
+"medios. "
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Introduz una direición IPv4 válida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Introduz una direición IPv6 válida."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Introduz una direición IPv4 o IPv6 válida."
+
+msgid "Enter only digits separated by commas."
+msgstr "Introduz namái díxitos separtaos per comes."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Asegúrate qu'esti valor ye %(limit_value)s (ye %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Asegúrate qu'esti valor ye menor o igual a %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Asegúrate qu'esti valor ye mayor o igual a %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrate qu'esti valor tien polo menos %(limit_value)d caráuter (tien "
+"%(show_value)d)."
+msgstr[1] ""
+"Asegúrate qu'esti valor tien polo menos %(limit_value)d caráuteres (tien "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrate qu'esti valor tien como muncho %(limit_value)d caráuter (tien "
+"%(show_value)d)."
+msgstr[1] ""
+"Asegúrate qu'esti valor tien como muncho %(limit_value)d caráuteres (tien "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Asegúrate que nun hai más de %(max)s díxitu en total."
+msgstr[1] "Asegúrate que nun hai más de %(max)s díxitos en total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Asegúrate que nun hai más de %(max)s allugamientu decimal."
+msgstr[1] "Asegúrate que nun hai más de %(max)s allugamientos decimales."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Asegúrate que nun hai más de %(max)s díxitu enantes del puntu decimal."
+msgstr[1] ""
+"Asegúrate que nun hai más de %(max)s díxitos enantes del puntu decimal."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "Esti campu nun pue ser nulu."
+
+msgid "This field cannot be blank."
+msgstr "Esti campu nun pue tar baleru."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s con esti %(field_label)s yá esiste."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Campu de la triba: %(field_type)s"
+
+msgid "Integer"
+msgstr "Enteru"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Enteru big (8 byte)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Boleanu (tamién True o False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (fasta %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Enteros separtaos per coma"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Data (ensin hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Data (con hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Númberu decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Direición de corréu"
+
+msgid "File path"
+msgstr "Camín del ficheru"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Númberu de puntu flotante"
+
+msgid "IPv4 address"
+msgstr "Direición IPv4"
+
+msgid "IP address"
+msgstr "Direición IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boleanu (tamién True, False o None)"
+
+msgid "Positive integer"
+msgstr "Enteru positivu"
+
+msgid "Positive small integer"
+msgstr "Enteru pequeñu positivu"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (fasta %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Enteru pequeñu"
+
+msgid "Text"
+msgstr "Testu"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Datos binarios crudos"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "Ficheru"
+
+msgid "Image"
+msgstr "Imaxe"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clave foriata (triba determinada pol campu rellacionáu)"
+
+msgid "One-to-one relationship"
+msgstr "Rellación a ún"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Rellación a munchos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Requierse esti campu."
+
+msgid "Enter a whole number."
+msgstr "Introduz un númberu completu"
+
+msgid "Enter a number."
+msgstr "Introduz un númberu."
+
+msgid "Enter a valid date."
+msgstr "Introduz una data válida."
+
+msgid "Enter a valid time."
+msgstr "Introduz una hora válida."
+
+msgid "Enter a valid date/time."
+msgstr "Introduz una data/hora válida."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nun s'unvió'l ficheru. Comprueba la triba de cifráu nel formulariu."
+
+msgid "No file was submitted."
+msgstr "No file was submitted."
+
+msgid "The submitted file is empty."
+msgstr "El ficheru dunviáu ta baleru."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Asegúrate qu'esti nome de ficheru tien polo menos %(max)d caráuter (tien "
+"%(length)d)."
+msgstr[1] ""
+"Asegúrate qu'esti nome de ficheru tien polo menos %(max)d caráuteres (tien "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Por favor, dunvia un ficheru o conseña la caxella , non dambos."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Xubi una imaxe válida. El ficheru que xubiesti o nun yera una imaxe, o taba "
+"toriada."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Esbilla una escoyeta válida. %(value)s nun una ún de les escoyetes "
+"disponibles."
+
+msgid "Enter a list of values."
+msgstr "Introduz una llista valores."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Campu anubríu %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Por favor, dunvia %d o menos formularios."
+msgstr[1] "Por favor, dunvia %d o menos formularios."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "Orde"
+
+msgid "Delete"
+msgstr "Desanciar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Por favor, igua'l datu duplicáu de %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Por favor, igua'l datu duplicáu pa %(field)s, el cual tien de ser únicu."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Por favor, igua'l datu duplicáu de %(field_name)s el cual tien de ser únicu "
+"pal %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Por favor, igua los valores duplicaos embaxo"
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Esbilla una escoyeta válida. Esa escoyeta nun ye una de les escoyetes "
+"disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"Nun pudo interpretase %(datetime)s nel fusu horariu %(current_timezone)s; "
+"pue ser ambiguu o pue nun esistir."
+
+msgid "Clear"
+msgstr "Llimpiar"
+
+msgid "Currently"
+msgstr "Anguaño"
+
+msgid "Change"
+msgstr "Camudar"
+
+msgid "Unknown"
+msgstr "Desconocíu"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "Non"
+
+msgid "yes,no,maybe"
+msgstr "sí,non,quiciabes"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "Media nueche"
+
+msgid "noon"
+msgstr "Meudía"
+
+msgid "Monday"
+msgstr "Llunes"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgid "Thursday"
+msgstr "Xueves"
+
+msgid "Friday"
+msgstr "Vienres"
+
+msgid "Saturday"
+msgstr "Sábadu"
+
+msgid "Sunday"
+msgstr "Domingu"
+
+msgid "Mon"
+msgstr "LLu"
+
+msgid "Tue"
+msgstr "Mar"
+
+msgid "Wed"
+msgstr "Mie"
+
+msgid "Thu"
+msgstr "Xue"
+
+msgid "Fri"
+msgstr "Vie"
+
+msgid "Sat"
+msgstr "Sáb"
+
+msgid "Sun"
+msgstr "Dom"
+
+msgid "January"
+msgstr "Xineru"
+
+msgid "February"
+msgstr "Febreru"
+
+msgid "March"
+msgstr "Marzu"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Mayu"
+
+msgid "June"
+msgstr "Xunu"
+
+msgid "July"
+msgstr "Xunetu"
+
+msgid "August"
+msgstr "Agostu"
+
+msgid "September"
+msgstr "Setiembre"
+
+msgid "October"
+msgstr "Ochobre"
+
+msgid "November"
+msgstr "Payares"
+
+msgid "December"
+msgstr "Avientu"
+
+msgid "jan"
+msgstr "xin"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "abr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "xun"
+
+msgid "jul"
+msgstr "xnt"
+
+msgid "aug"
+msgstr "ago"
+
+msgid "sep"
+msgstr "set"
+
+msgid "oct"
+msgstr "och"
+
+msgid "nov"
+msgstr "pay"
+
+msgid "dec"
+msgstr "avi"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Xin."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Mar."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Abr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "May."
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Xun."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Xnt."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Set."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Och."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Pay."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Avi."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Xineru"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Febreru"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Marzu"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mayu"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Xunu"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Xunetu"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Agostu"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Setiembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Ochobre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Payares"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Avientu"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "o"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d añu"
+msgstr[1] "%d años"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d meses"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d selmana"
+msgstr[1] "%d selmanes"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d díes"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d hores"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minutu"
+msgstr[1] "%d minutos"
+
+msgid "0 minutes"
+msgstr "0 minutos"
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "Nun s'especificó l'añu"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Nun s'especificó'l mes"
+
+msgid "No day specified"
+msgstr "Nun s'especificó'l día"
+
+msgid "No week specified"
+msgstr "Nun s'especificó la selmana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Ensin %(verbose_name_plural)s disponible"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Nun ta disponible'l %(verbose_name_plural)s futuru porque %(class_name)s."
+"allow_future ye False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Cadena de data inválida '%(datestr)s' col formatu dau '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Nun s'alcontró %(verbose_name)s que concase cola gueta"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "La páxina nun ye 'last', tampoco pue convertise a un int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Páxina inválida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "La llista ta balera y '%(class_name)s.allow_empty' ye False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Nun tán almitíos equí los indexaos de direutoriu."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" nun esiste"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Índiz de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..9f7fd2b
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.po
new file mode 100644
index 0000000..313c304
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.po
@@ -0,0 +1,1214 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Emin Mastizada , 2015-2016
+# Metin Amiroff , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/"
+"az/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: az\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+msgid "Arabic"
+msgstr "Ərəbcə"
+
+msgid "Asturian"
+msgstr "Asturiyaca"
+
+msgid "Azerbaijani"
+msgstr "Azərbaycanca"
+
+msgid "Bulgarian"
+msgstr "Bolqarca"
+
+msgid "Belarusian"
+msgstr "Belarusca"
+
+msgid "Bengali"
+msgstr "Benqalca"
+
+msgid "Breton"
+msgstr "Bretonca"
+
+msgid "Bosnian"
+msgstr "Bosniyaca"
+
+msgid "Catalan"
+msgstr "Katalanca"
+
+msgid "Czech"
+msgstr "Çexcə"
+
+msgid "Welsh"
+msgstr "Uelscə"
+
+msgid "Danish"
+msgstr "Danimarkaca"
+
+msgid "German"
+msgstr "Almanca"
+
+msgid "Lower Sorbian"
+msgstr "Aşağı Sorbca"
+
+msgid "Greek"
+msgstr "Yunanca"
+
+msgid "English"
+msgstr "İngiliscə"
+
+msgid "Australian English"
+msgstr "Avstraliya İngiliscəsi"
+
+msgid "British English"
+msgstr "Britaniya İngiliscəsi"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "İspanca"
+
+msgid "Argentinian Spanish"
+msgstr "Argentina İspancası"
+
+msgid "Colombian Spanish"
+msgstr "Kolumbia İspancası"
+
+msgid "Mexican Spanish"
+msgstr "Meksika İspancası"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nikaraqua İspancası"
+
+msgid "Venezuelan Spanish"
+msgstr "Venesuela İspancası"
+
+msgid "Estonian"
+msgstr "Estonca"
+
+msgid "Basque"
+msgstr "Baskca"
+
+msgid "Persian"
+msgstr "Farsca"
+
+msgid "Finnish"
+msgstr "Fincə"
+
+msgid "French"
+msgstr "Fransızca"
+
+msgid "Frisian"
+msgstr "Friscə"
+
+msgid "Irish"
+msgstr "İrlandca"
+
+msgid "Scottish Gaelic"
+msgstr "Şotland Keltcəsi"
+
+msgid "Galician"
+msgstr "Qallik dili"
+
+msgid "Hebrew"
+msgstr "İbranicə"
+
+msgid "Hindi"
+msgstr "Hindcə"
+
+msgid "Croatian"
+msgstr "Xorvatca"
+
+msgid "Upper Sorbian"
+msgstr "Üst Sorbca"
+
+msgid "Hungarian"
+msgstr "Macarca"
+
+msgid "Interlingua"
+msgstr "İnterlinqua"
+
+msgid "Indonesian"
+msgstr "İndonezcə"
+
+msgid "Ido"
+msgstr "İdoca"
+
+msgid "Icelandic"
+msgstr "İslandca"
+
+msgid "Italian"
+msgstr "İtalyanca"
+
+msgid "Japanese"
+msgstr "Yaponca"
+
+msgid "Georgian"
+msgstr "Gürcücə"
+
+msgid "Kazakh"
+msgstr "Qazax"
+
+msgid "Khmer"
+msgstr "Kxmercə"
+
+msgid "Kannada"
+msgstr "Kannada dili"
+
+msgid "Korean"
+msgstr "Koreyca"
+
+msgid "Luxembourgish"
+msgstr "Lüksemburqca"
+
+msgid "Lithuanian"
+msgstr "Litva dili"
+
+msgid "Latvian"
+msgstr "Latviya dili"
+
+msgid "Macedonian"
+msgstr "Makedonca"
+
+msgid "Malayalam"
+msgstr "Malayamca"
+
+msgid "Mongolian"
+msgstr "Monqolca"
+
+msgid "Marathi"
+msgstr "Marathicə"
+
+msgid "Burmese"
+msgstr "Burmescə"
+
+msgid "Norwegian Bokmål"
+msgstr "Norveç Bukmolcası"
+
+msgid "Nepali"
+msgstr "Nepal"
+
+msgid "Dutch"
+msgstr "Flamandca"
+
+msgid "Norwegian Nynorsk"
+msgstr "Nynorsk Norveçcəsi"
+
+msgid "Ossetic"
+msgstr "Osetincə"
+
+msgid "Punjabi"
+msgstr "Pancabicə"
+
+msgid "Polish"
+msgstr "Polyakca"
+
+msgid "Portuguese"
+msgstr "Portuqalca"
+
+msgid "Brazilian Portuguese"
+msgstr "Braziliya Portuqalcası"
+
+msgid "Romanian"
+msgstr "Rumınca"
+
+msgid "Russian"
+msgstr "Rusca"
+
+msgid "Slovak"
+msgstr "Slovakca"
+
+msgid "Slovenian"
+msgstr "Slovencə"
+
+msgid "Albanian"
+msgstr "Albanca"
+
+msgid "Serbian"
+msgstr "Serbcə"
+
+msgid "Serbian Latin"
+msgstr "Serbcə Latın"
+
+msgid "Swedish"
+msgstr "İsveçcə"
+
+msgid "Swahili"
+msgstr "Suahili"
+
+msgid "Tamil"
+msgstr "Tamilcə"
+
+msgid "Telugu"
+msgstr "Teluqu dili"
+
+msgid "Thai"
+msgstr "Tayca"
+
+msgid "Turkish"
+msgstr "Türkcə"
+
+msgid "Tatar"
+msgstr "Tatar"
+
+msgid "Udmurt"
+msgstr "Udmurtca"
+
+msgid "Ukrainian"
+msgstr "Ukraynaca"
+
+msgid "Urdu"
+msgstr "Urduca"
+
+msgid "Vietnamese"
+msgstr "Vyetnamca"
+
+msgid "Simplified Chinese"
+msgstr "Sadələşdirilmiş Çincə"
+
+msgid "Traditional Chinese"
+msgstr "Ənənəvi Çincə"
+
+msgid "Messages"
+msgstr "Mesajlar"
+
+msgid "Site Maps"
+msgstr "Sayt Xəritələri"
+
+msgid "Static Files"
+msgstr "Statik Fayllar"
+
+msgid "Syndication"
+msgstr "Sindikasiya"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Düzgün qiymət daxil edin."
+
+msgid "Enter a valid URL."
+msgstr "Düzgün URL daxil edin."
+
+msgid "Enter a valid integer."
+msgstr "Düzgün rəqəm daxil edin."
+
+msgid "Enter a valid email address."
+msgstr "Düzgün e-poçt ünvanı daxil edin."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Hərflərdən, rəqəmlərdən, alt-xətlərdən və ya defislərdən ibarət düzgün "
+"qısaltma daxil edin."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Keçərli Unicode hərfləri, rəqəmlər, alt xətt və ya defis olan 'slug' daxil "
+"edin."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Düzgün IPv4 ünvanı daxil edin."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Düzgün IPv6 ünvanını daxil edin."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Düzgün IPv4 və ya IPv6 ünvanını daxil edin."
+
+msgid "Enter only digits separated by commas."
+msgstr "Vergüllə ayırmaqla yalnız rəqəmlər daxil edin."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Əmin edin ki, bu qiymət %(limit_value)s-dir (bu %(show_value)s-dir)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+"Bu qiymətin %(limit_value)s-ya bərabər və ya ondan kiçik olduğunu yoxlayın."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Bu qiymətin %(limit_value)s-ya bərabər və ya ondan böyük olduğunu yoxlayın."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d "
+"var)"
+msgstr[1] ""
+"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d "
+"var)"
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d "
+"var)"
+msgstr[1] ""
+"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d "
+"var)"
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun."
+msgstr[1] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun."
+msgstr[1] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun."
+msgstr[1] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "və"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(field_labels)s ilə %(model_name)s artıq mövcuddur."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "%(value)r dəyəri doğru seçim deyil."
+
+msgid "This field cannot be null."
+msgstr "Bu sahə boş qala bilməz."
+
+msgid "This field cannot be blank."
+msgstr "Bu sahə ağ qala bilməz."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s bu %(field_label)s sahə ilə artıq mövcuddur."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s dəyəri %(date_field_label)s %(lookup_type)s üçün unikal "
+"olmalıdır."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Sahənin tipi: %(field_type)s"
+
+msgid "Integer"
+msgstr "Tam ədəd"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' dəyəri tam rəqəm olmalıdır."
+
+msgid "Big (8 byte) integer"
+msgstr "Böyük (8 bayt) tam ədəd"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s' dəyəri True və ya False olmalıdır."
+
+msgid "Boolean (Either True or False)"
+msgstr "Bul (ya Doğru, ya Yalan)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Sətir (%(max_length)s simvola kimi)"
+
+msgid "Comma-separated integers"
+msgstr "Vergüllə ayrılmış tam ədədlər"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' dəyəri səhv tarix formatındadır. Bu İİİİ-AA-GG formatında "
+"olmalıdır."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"'%(value)s dəyəri düzgün formatdadır (İİİİ-AA-GG) amma bu xətalı tarixdir."
+
+msgid "Date (without time)"
+msgstr "Tarix (saatsız)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Tarix (vaxt ilə)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Rasional ədəd"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr "Müddət"
+
+msgid "Email address"
+msgstr "E-poçt"
+
+msgid "File path"
+msgstr "Faylın ünvanı"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Sürüşən vergüllü ədəd"
+
+msgid "IPv4 address"
+msgstr "IPv4 ünvanı"
+
+msgid "IP address"
+msgstr "IP ünvan"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Bul (Ya Doğru, ya Yalan, ya da Heç nə)"
+
+msgid "Positive integer"
+msgstr "Müsbət tam ədəd"
+
+msgid "Positive small integer"
+msgstr "Müsbət tam kiçik ədəd"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Əzmə (%(max_length)s simvola kimi)"
+
+msgid "Small integer"
+msgstr "Kiçik tam ədəd"
+
+msgid "Text"
+msgstr "Mətn"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Vaxt"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' keçərli UUID deyil."
+
+msgid "File"
+msgstr "Fayl"
+
+msgid "Image"
+msgstr "Şəkil"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Xarici açar (bağlı olduğu sahəyə uyğun tipi alır)"
+
+msgid "One-to-one relationship"
+msgstr "Birin-birə münasibət"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Çoxun-çoxa münasibət"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Bu sahə vacibdir."
+
+msgid "Enter a whole number."
+msgstr "Tam ədəd daxil edin."
+
+msgid "Enter a number."
+msgstr "Ədəd daxil edin."
+
+msgid "Enter a valid date."
+msgstr "Düzgün tarix daxil edin."
+
+msgid "Enter a valid time."
+msgstr "Düzgün vaxt daxil edin."
+
+msgid "Enter a valid date/time."
+msgstr "Düzgün tarix/vaxt daxil edin."
+
+msgid "Enter a valid duration."
+msgstr "Keçərli müddət daxil edin."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Fayl göndərilməyib. Vərəqənin (\"form\") şifrələmə tipini yoxlayın."
+
+msgid "No file was submitted."
+msgstr "Fayl göndərilməyib."
+
+msgid "The submitted file is empty."
+msgstr "Göndərilən fayl boşdur."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Ya fayl göndərin, ya da xanaya quş qoymayın, hər ikisini də birdən etməyin."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Düzgün şəkil göndərin. Göndərdiyiniz fayl ya şəkil deyil, ya da şəkildə "
+"problem var."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Düzgün seçim edin. %(value)s seçimlər arasında yoxdur."
+
+msgid "Enter a list of values."
+msgstr "Qiymətlərin siyahısını daxil edin."
+
+msgid "Enter a complete value."
+msgstr "Tam dəyər daxil edin."
+
+msgid "Enter a valid UUID."
+msgstr "Keçərli UUID daxil et."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Gizli %(name)s sahəsi) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Lütfən %d və ya daha az forma göndərin."
+msgstr[1] "Lütfən %d və ya daha az forma göndərin."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Lütfən %d və ya daha çox forma göndərin."
+msgstr[1] "Lütfən %d və ya daha çox forma göndərin."
+
+msgid "Order"
+msgstr "Sırala"
+
+msgid "Delete"
+msgstr "Sil"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onların hamısı "
+"fərqli olmalıdır."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"%(field_name)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onlar "
+"%(date_field)s %(lookup)s-a görə fərqli olmalıdır."
+
+msgid "Please correct the duplicate values below."
+msgstr "Aşağıda təkrarlanan qiymətlərə düzəliş edin."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Düzgün seçim edin. Bu seçim mümkün deyil."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s %(current_timezone)s zaman qurşağında ifadə oluna bilmir; ya "
+"duallıq, ya da yanlışlıq var."
+
+msgid "Clear"
+msgstr "Təmizlə"
+
+msgid "Currently"
+msgstr "Hal-hazırda"
+
+msgid "Change"
+msgstr "Dəyiş"
+
+msgid "Unknown"
+msgstr "Məlum deyil"
+
+msgid "Yes"
+msgstr "Hə"
+
+msgid "No"
+msgstr "Yox"
+
+msgid "yes,no,maybe"
+msgstr "hə,yox,bəlkə"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bayt"
+msgstr[1] "%(size)d bayt"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s QB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "gecə yarısı"
+
+msgid "noon"
+msgstr "günorta"
+
+msgid "Monday"
+msgstr "Bazar ertəsi"
+
+msgid "Tuesday"
+msgstr "Çərşənbə axşamı"
+
+msgid "Wednesday"
+msgstr "Çərşənbə"
+
+msgid "Thursday"
+msgstr "Cümə axşamı"
+
+msgid "Friday"
+msgstr "Cümə"
+
+msgid "Saturday"
+msgstr "Şənbə"
+
+msgid "Sunday"
+msgstr "Bazar"
+
+msgid "Mon"
+msgstr "B.e"
+
+msgid "Tue"
+msgstr "Ç.a"
+
+msgid "Wed"
+msgstr "Çrş"
+
+msgid "Thu"
+msgstr "C.a"
+
+msgid "Fri"
+msgstr "Cüm"
+
+msgid "Sat"
+msgstr "Şnb"
+
+msgid "Sun"
+msgstr "Bzr"
+
+msgid "January"
+msgstr "Yanvar"
+
+msgid "February"
+msgstr "Fevral"
+
+msgid "March"
+msgstr "Mart"
+
+msgid "April"
+msgstr "Aprel"
+
+msgid "May"
+msgstr "May"
+
+msgid "June"
+msgstr "İyun"
+
+msgid "July"
+msgstr "İyul"
+
+msgid "August"
+msgstr "Avqust"
+
+msgid "September"
+msgstr "Sentyabr"
+
+msgid "October"
+msgstr "Oktyabr"
+
+msgid "November"
+msgstr "Noyabr"
+
+msgid "December"
+msgstr "Dekabr"
+
+msgid "jan"
+msgstr "ynv"
+
+msgid "feb"
+msgstr "fvr"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "iyn"
+
+msgid "jul"
+msgstr "iyl"
+
+msgid "aug"
+msgstr "avq"
+
+msgid "sep"
+msgstr "snt"
+
+msgid "oct"
+msgstr "okt"
+
+msgid "nov"
+msgstr "noy"
+
+msgid "dec"
+msgstr "dek"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Yan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Fev."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Mart"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Aprel"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "May"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "İyun"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "İyul"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Avq."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sent."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Okt."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Noy."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dek."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Yanvar"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Fevral"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Mart"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Aprel"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "May"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "İyun"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "İyul"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Avqust"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Sentyabr"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Oktyabr"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Noyabr"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Dekabr"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Bu doğru IPv6 ünvanı deyil."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "və ya"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d il"
+msgstr[1] "%d il"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d ay"
+msgstr[1] "%d ay"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d həftə"
+msgstr[1] "%d həftə"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d gün"
+msgstr[1] "%d gün"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d saat"
+msgstr[1] "%d saat"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d dəqiqə"
+msgstr[1] "%d dəqiqə"
+
+msgid "0 minutes"
+msgstr "0 dəqiqə"
+
+msgid "Forbidden"
+msgstr "Qadağan"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF təsdiqləmə alınmadı. Sorğu ləğv edildi."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr "Daha ətraflı məlumat DEBUG=True ilə mövcuddur."
+
+msgid "No year specified"
+msgstr "İl göstərilməyib"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Ay göstərilməyib"
+
+msgid "No day specified"
+msgstr "Gün göstərilməyib"
+
+msgid "No week specified"
+msgstr "Həftə göstərilməyib"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "%(verbose_name_plural)s seçmək mümkün deyil"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Gələcək %(verbose_name_plural)s seçmək mümkün deyil, çünki %(class_name)s."
+"allow_future Yalan kimi qeyd olunub."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "\"%(format)s\" formatına görə \"%(datestr)s\" tarixi düzgün deyil"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Sorğuya uyğun %(verbose_name)s tapılmadı"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Səhifə nə \"axırıncı\"dır, nə də tam ədədə çevirmək mümkündür."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Qeyri-düzgün səhifə (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Siyahı boşdur və '%(class_name)s.allow_empty' Yalan kimi qeyd olunub."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Ünvan indekslərinə icazə verilmir."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" mövcud deyil"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "%(directory)s-nin indeksi"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..dcf0f51
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..4c43c23
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/formats.py
new file mode 100644
index 0000000..82470d1
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/az/formats.py
@@ -0,0 +1,32 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j E Y'
+TIME_FORMAT = 'G:i'
+DATETIME_FORMAT = 'j E Y, G:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'd.m.Y'
+SHORT_DATETIME_FORMAT = 'd.m.Y H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d.%m.%Y', # '25.10.2006'
+ '%d.%m.%y', # '25.10.06'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59'
+ '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200'
+ '%d.%m.%Y %H:%M', # '25.10.2006 14:30'
+ '%d.%m.%Y', # '25.10.2006'
+ '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59'
+ '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200'
+ '%d.%m.%y %H:%M', # '25.10.06 14:30'
+ '%d.%m.%y', # '25.10.06'
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1715e2d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.po
new file mode 100644
index 0000000..7846119
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.po
@@ -0,0 +1,1298 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Viktar Palstsiuk , 2014-2015
+# znotdead , 2016-2017
+# Дмитрий Шатера , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-23 21:59+0000\n"
+"Last-Translator: znotdead \n"
+"Language-Team: Belarusian (http://www.transifex.com/django/django/language/"
+"be/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: be\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
+"%100>=11 && n%100<=14)? 2 : 3);\n"
+
+msgid "Afrikaans"
+msgstr "Афрыкаанс"
+
+msgid "Arabic"
+msgstr "Арабская"
+
+msgid "Asturian"
+msgstr "Астурыйская"
+
+msgid "Azerbaijani"
+msgstr "Азэрбайджанская"
+
+msgid "Bulgarian"
+msgstr "Баўгарская"
+
+msgid "Belarusian"
+msgstr "Беларуская"
+
+msgid "Bengali"
+msgstr "Бэнґальская"
+
+msgid "Breton"
+msgstr "Брэтонская"
+
+msgid "Bosnian"
+msgstr "Басьнійская"
+
+msgid "Catalan"
+msgstr "Каталёнская"
+
+msgid "Czech"
+msgstr "Чэская"
+
+msgid "Welsh"
+msgstr "Валійская"
+
+msgid "Danish"
+msgstr "Дацкая"
+
+msgid "German"
+msgstr "Нямецкая"
+
+msgid "Lower Sorbian"
+msgstr "Ніжнелужыцкая"
+
+msgid "Greek"
+msgstr "Грэцкая"
+
+msgid "English"
+msgstr "Анґельская"
+
+msgid "Australian English"
+msgstr "Анґельская (Аўстралія)"
+
+msgid "British English"
+msgstr "Анґельская (Брытанская)"
+
+msgid "Esperanto"
+msgstr "Эспэранта"
+
+msgid "Spanish"
+msgstr "Гішпанская"
+
+msgid "Argentinian Spanish"
+msgstr "Гішпанская (Арґентына)"
+
+msgid "Colombian Spanish"
+msgstr "Гішпанская (Калумбія)"
+
+msgid "Mexican Spanish"
+msgstr "Гішпанская (Мэксыка)"
+
+msgid "Nicaraguan Spanish"
+msgstr "Гішпанская (Нікараґуа)"
+
+msgid "Venezuelan Spanish"
+msgstr "Іспанская (Вэнэсуэла)"
+
+msgid "Estonian"
+msgstr "Эстонская"
+
+msgid "Basque"
+msgstr "Басконская"
+
+msgid "Persian"
+msgstr "Фарсі"
+
+msgid "Finnish"
+msgstr "Фінская"
+
+msgid "French"
+msgstr "Француская"
+
+msgid "Frisian"
+msgstr "Фрызкая"
+
+msgid "Irish"
+msgstr "Ірляндзкая"
+
+msgid "Scottish Gaelic"
+msgstr "Гэльская шатляндзкая"
+
+msgid "Galician"
+msgstr "Ґальская"
+
+msgid "Hebrew"
+msgstr "Габрэйская"
+
+msgid "Hindi"
+msgstr "Гінды"
+
+msgid "Croatian"
+msgstr "Харвацкая"
+
+msgid "Upper Sorbian"
+msgstr "Верхнелужыцкая"
+
+msgid "Hungarian"
+msgstr "Вугорская"
+
+msgid "Interlingua"
+msgstr "Інтэрлінгва"
+
+msgid "Indonesian"
+msgstr "Інданэзійская"
+
+msgid "Ido"
+msgstr "Іда"
+
+msgid "Icelandic"
+msgstr "Ісьляндзкая"
+
+msgid "Italian"
+msgstr "Італьянская"
+
+msgid "Japanese"
+msgstr "Японская"
+
+msgid "Georgian"
+msgstr "Грузінская"
+
+msgid "Kazakh"
+msgstr "Казаская"
+
+msgid "Khmer"
+msgstr "Кхмерская"
+
+msgid "Kannada"
+msgstr "Каннада"
+
+msgid "Korean"
+msgstr "Карэйская"
+
+msgid "Luxembourgish"
+msgstr "Люксэмбургская"
+
+msgid "Lithuanian"
+msgstr "Літоўская"
+
+msgid "Latvian"
+msgstr "Латыская"
+
+msgid "Macedonian"
+msgstr "Македонская"
+
+msgid "Malayalam"
+msgstr "Малаялам"
+
+msgid "Mongolian"
+msgstr "Манґольская"
+
+msgid "Marathi"
+msgstr "Маратхі"
+
+msgid "Burmese"
+msgstr "Бірманская"
+
+msgid "Norwegian Bokmål"
+msgstr "Нарвэская букмал"
+
+msgid "Nepali"
+msgstr "Нэпальская"
+
+msgid "Dutch"
+msgstr "Галяндзкая"
+
+msgid "Norwegian Nynorsk"
+msgstr "Нарвэская нюнорск"
+
+msgid "Ossetic"
+msgstr "Асяцінская"
+
+msgid "Punjabi"
+msgstr "Панджабі"
+
+msgid "Polish"
+msgstr "Польская"
+
+msgid "Portuguese"
+msgstr "Партуґальская"
+
+msgid "Brazilian Portuguese"
+msgstr "Партуґальская (Бразылія)"
+
+msgid "Romanian"
+msgstr "Румынская"
+
+msgid "Russian"
+msgstr "Расейская"
+
+msgid "Slovak"
+msgstr "Славацкая"
+
+msgid "Slovenian"
+msgstr "Славенская"
+
+msgid "Albanian"
+msgstr "Альбанская"
+
+msgid "Serbian"
+msgstr "Сэрбская"
+
+msgid "Serbian Latin"
+msgstr "Сэрбская (лацінка)"
+
+msgid "Swedish"
+msgstr "Швэдзкая"
+
+msgid "Swahili"
+msgstr "Суахілі"
+
+msgid "Tamil"
+msgstr "Тамільская"
+
+msgid "Telugu"
+msgstr "Тэлуґу"
+
+msgid "Thai"
+msgstr "Тайская"
+
+msgid "Turkish"
+msgstr "Турэцкая"
+
+msgid "Tatar"
+msgstr "Татарская"
+
+msgid "Udmurt"
+msgstr "Удмурцкая"
+
+msgid "Ukrainian"
+msgstr "Украінская"
+
+msgid "Urdu"
+msgstr "Урду"
+
+msgid "Vietnamese"
+msgstr "Віетнамская"
+
+msgid "Simplified Chinese"
+msgstr "Кітайская (спрошчаная)"
+
+msgid "Traditional Chinese"
+msgstr "Кітайская (звычайная)"
+
+msgid "Messages"
+msgstr "Паведамленні"
+
+msgid "Site Maps"
+msgstr "Мапы сайту"
+
+msgid "Static Files"
+msgstr "Cтатычныя файлы"
+
+msgid "Syndication"
+msgstr "Сындыкацыя"
+
+msgid "That page number is not an integer"
+msgstr "Лік гэтай старонкі не з'яўляецца цэлым лікам"
+
+msgid "That page number is less than 1"
+msgstr "Лік старонкі менш чым 1"
+
+msgid "That page contains no results"
+msgstr "Гэтая старонка не мае ніякіх вынікаў"
+
+msgid "Enter a valid value."
+msgstr "Пазначце правільнае значэньне."
+
+msgid "Enter a valid URL."
+msgstr "Пазначце чынную спасылку."
+
+msgid "Enter a valid integer."
+msgstr "Увядзіце цэлы лік."
+
+msgid "Enter a valid email address."
+msgstr "Увядзіце сапраўдны адрас электроннай пошты."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr "Бірка можа зьмяшчаць літары, лічбы, знакі падкрэсьліваньня ды злучкі."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Значэнне павінна быць толькі з літараў стандарту Unicode, личбаў, знакаў "
+"падкрэслівання ці злучкі."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Пазначце чынны адрас IPv4."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Пазначце чынны адрас IPv6."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Пазначце чынны адрас IPv4 або IPv6."
+
+msgid "Enter only digits separated by commas."
+msgstr "Набярыце лічбы, падзеленыя коскамі."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Упэўніцеся, што гэтае значэньне — %(limit_value)s (зараз яно — "
+"%(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Значэньне мусіць быць меншым або роўным %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Значэньне мусіць быць большым або роўным %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвал (зараз "
+"%(show_value)d)."
+msgstr[1] ""
+"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвала (зараз "
+"%(show_value)d)."
+msgstr[2] ""
+"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвалаў (зараз "
+"%(show_value)d)."
+msgstr[3] ""
+"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвалаў (зараз "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвал (зараз "
+"%(show_value)d)."
+msgstr[1] ""
+"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвала (зараз "
+"%(show_value)d)."
+msgstr[2] ""
+"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвалаў (зараз "
+"%(show_value)d)."
+msgstr[3] ""
+"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвалаў (зараз "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу."
+msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы."
+msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў."
+msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу пасьля коскі."
+msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы пасьля коскі."
+msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў пасьля коскі."
+msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў пасьля коскі."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу да коскі."
+msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы да коскі."
+msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў да коскі."
+msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў да коскі."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Пашырэнне файла '%(extension)s' не дапускаецца. Дапушчальныя пашырэння: "
+"'%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "Null сімвалы не дапускаюцца."
+
+msgid "and"
+msgstr "і"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s з такім %(field_labels)s ужо існуе."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Значэнне %(value)r не з'яўляецца правільным выбарам."
+
+msgid "This field cannot be null."
+msgstr "Поле ня можа мець значэньне «null»."
+
+msgid "This field cannot be blank."
+msgstr "Трэба запоўніць поле."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s з такім %(field_label)s ужо існуе."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s павінна быць унікальна для %(date_field_label)s "
+"%(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Палі віду: %(field_type)s"
+
+msgid "Integer"
+msgstr "Цэлы лік"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "Значэньне '%(value)s' павінна быць цэлым лікам."
+
+msgid "Big (8 byte) integer"
+msgstr "Вялікі (8 байтаў) цэлы"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "Значэньне '%(value)s' павінна быць True або False."
+
+msgid "Boolean (Either True or False)"
+msgstr "Ляґічнае («сапраўдна» або «не сапраўдна»)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Радок (ня болей за %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Цэлыя лікі, падзеленыя коскаю"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"Значэнне '%(value)s' мае няправільны фармат. Яно павінна быць у фармаце ГГГГ-"
+"ММ-ДД."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Значэнне '%(value)s' мае правільны фармат(ГГГГ-ММ-ДД) але гэта несапраўдная "
+"дата."
+
+msgid "Date (without time)"
+msgstr "Дата (бяз часу)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Значэнне '%(value)s' мае няправільны фармат. Яно павінна быць у фармаце ГГГГ-"
+"ММ-ДД ГГ:ХХ[:сс[.мммммм]][ЧА], дзе ЧА — часавы абсяг."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Значэнне '%(value)s' мае правільны фармат (ГГГГ-ММ-ДД ГГ:ХХ[:сс[.мммммм]]"
+"[ЧА], дзе ЧА — часавы абсяг) але гэта несапраўдныя дата/час."
+
+msgid "Date (with time)"
+msgstr "Дата (разам з часам)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "Значэньне '%(value)s' павінна быць дзесятковым лікам."
+
+msgid "Decimal number"
+msgstr "Дзесятковы лік"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"Значэньне '%(value)s' мае няправільны фармат. Яно павінна быць у фармаце "
+"[ДД] [ГГ:[ХХ:]]сс[.мммммм]."
+
+msgid "Duration"
+msgstr "Працягласць"
+
+msgid "Email address"
+msgstr "Адрас эл. пошты"
+
+msgid "File path"
+msgstr "Шлях да файла"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "Значэньне '%(value)s' павінна быць дробным лікам."
+
+msgid "Floating point number"
+msgstr "Лік зь пераноснай коскаю"
+
+msgid "IPv4 address"
+msgstr "Адрас IPv4"
+
+msgid "IP address"
+msgstr "Адрас IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Значэньне '%(value)s' павінна быць None, True альбо False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Ляґічнае («сапраўдна», «не сапраўдна» ці «нічога»)"
+
+msgid "Positive integer"
+msgstr "Дадатны цэлы лік"
+
+msgid "Positive small integer"
+msgstr "Дадатны малы цэлы лік"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Бірка (ня болей за %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Малы цэлы лік"
+
+msgid "Text"
+msgstr "Тэкст"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Значэньне '%(value)s' мае няправільны фармат. Яно павінна быць у фармаце HH:"
+"MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Значэнне '%(value)s' мае правільны фармат (ГГ:ХХ[:сс[.мммммм]]) але гэта "
+"несапраўдны час."
+
+msgid "Time"
+msgstr "Час"
+
+msgid "URL"
+msgstr "Сеціўная спасылка"
+
+msgid "Raw binary data"
+msgstr "Неапрацаваныя бінарныя зьвесткі"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' не з'яўляецца дапушчальным UUID."
+
+msgid "File"
+msgstr "Файл"
+
+msgid "Image"
+msgstr "Выява"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "Экземпляр %(model)s з %(field)s %(value)r не iснуе."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Вонкавы ключ (від вызначаецца паводле зьвязанага поля)"
+
+msgid "One-to-one relationship"
+msgstr "Сувязь «адзін да аднаго»"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "Сувязь %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "Сувязi %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Сувязь «некалькі да некалькіх»"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Поле трэба запоўніць."
+
+msgid "Enter a whole number."
+msgstr "Набярыце ўвесь лік."
+
+msgid "Enter a number."
+msgstr "Набярыце лік."
+
+msgid "Enter a valid date."
+msgstr "Пазначце чынную дату."
+
+msgid "Enter a valid time."
+msgstr "Пазначце чынны час."
+
+msgid "Enter a valid date/time."
+msgstr "Пазначце чынныя час і дату."
+
+msgid "Enter a valid duration."
+msgstr "Увядзіце сапраўдны тэрмін."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Файл не даслалі. Зірніце кадоўку блянку."
+
+msgid "No file was submitted."
+msgstr "Файл не даслалі."
+
+msgid "The submitted file is empty."
+msgstr "Дасланы файл — парожні."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвал (зараз "
+"%(length)d)."
+msgstr[1] ""
+"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвала (зараз "
+"%(length)d)."
+msgstr[2] ""
+"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвалаў (зараз "
+"%(length)d)."
+msgstr[3] ""
+"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвалаў (зараз "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Трэба або даслаць файл, або абраць «Ачысьціць», але нельга рабіць гэта "
+"адначасова."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Запампаваць чынны малюнак. Запампавалі або не выяву, або пашкоджаную выяву."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Абярыце дазволенае. %(value)s няма ў даступных значэньнях."
+
+msgid "Enter a list of values."
+msgstr "Упішыце сьпіс значэньняў."
+
+msgid "Enter a complete value."
+msgstr "Калі ласка, увядзіце поўнае значэньне."
+
+msgid "Enter a valid UUID."
+msgstr "Увядзіце сапраўдны UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Схаванае поле %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Данныя ManagementForm адсутнічаюць ці былі пашкоджаны"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Калі ласка, адпраўце %d або менш формаў."
+msgstr[1] "Калі ласка, адпраўце %d або менш формаў."
+msgstr[2] "Калі ласка, адпраўце %d або менш формаў."
+msgstr[3] "Калі ласка, адпраўце %d або менш формаў."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Калі ласка, адпраўце %d або больш формаў."
+msgstr[1] "Калі ласка, адпраўце %d або больш формаў."
+msgstr[2] "Калі ласка, адпраўце %d або больш формаў."
+msgstr[3] "Калі ласка, адпраўце %d або больш формаў."
+
+msgid "Order"
+msgstr "Парадак"
+
+msgid "Delete"
+msgstr "Выдаліць"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "У полі «%(field)s» выпраўце зьвесткі, якія паўтараюцца."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Выпраўце зьвесткі ў полі «%(field)s»: нельга, каб яны паўтараліся."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Выпраўце зьвесткі ў полі «%(field_name)s»: нельга каб зьвесткі ў "
+"«%(date_field)s» для «%(lookup)s» паўтараліся."
+
+msgid "Please correct the duplicate values below."
+msgstr "Выпраўце зьвесткі, якія паўтараюцца (гл. ніжэй)."
+
+msgid "The inline value did not match the parent instance."
+msgstr "Убудаванае значэнне не супадае з бацькоўскім значэннем."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Абярыце дазволенае. Абранага няма ў даступных значэньнях."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" не сапраўднае значэнне"
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"У часавым абсягу «%(current_timezone)s» нельга зразумець дату %(datetime)s: "
+"яна можа быць неадназначнаю або яе можа не існаваць."
+
+msgid "Clear"
+msgstr "Ачысьціць"
+
+msgid "Currently"
+msgstr "Зараз"
+
+msgid "Change"
+msgstr "Зьмяніць"
+
+msgid "Unknown"
+msgstr "Невядома"
+
+msgid "Yes"
+msgstr "Так"
+
+msgid "No"
+msgstr "Не"
+
+msgid "yes,no,maybe"
+msgstr "так,не,магчыма"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d байт"
+msgstr[1] "%(size)d байты"
+msgstr[2] "%(size)d байтаў"
+msgstr[3] "%(size)d байтаў"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s КБ"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s МБ"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s ҐБ"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s ТБ"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s ПБ"
+
+msgid "p.m."
+msgstr "папаўдні"
+
+msgid "a.m."
+msgstr "папоўначы"
+
+msgid "PM"
+msgstr "папаўдні"
+
+msgid "AM"
+msgstr "папоўначы"
+
+msgid "midnight"
+msgstr "поўнач"
+
+msgid "noon"
+msgstr "поўдзень"
+
+msgid "Monday"
+msgstr "Панядзелак"
+
+msgid "Tuesday"
+msgstr "Аўторак"
+
+msgid "Wednesday"
+msgstr "Серада"
+
+msgid "Thursday"
+msgstr "Чацьвер"
+
+msgid "Friday"
+msgstr "Пятніца"
+
+msgid "Saturday"
+msgstr "Субота"
+
+msgid "Sunday"
+msgstr "Нядзеля"
+
+msgid "Mon"
+msgstr "Пн"
+
+msgid "Tue"
+msgstr "Аў"
+
+msgid "Wed"
+msgstr "Ср"
+
+msgid "Thu"
+msgstr "Чц"
+
+msgid "Fri"
+msgstr "Пт"
+
+msgid "Sat"
+msgstr "Сб"
+
+msgid "Sun"
+msgstr "Нд"
+
+msgid "January"
+msgstr "студзеня"
+
+msgid "February"
+msgstr "лютага"
+
+msgid "March"
+msgstr "сакавік"
+
+msgid "April"
+msgstr "красавіка"
+
+msgid "May"
+msgstr "траўня"
+
+msgid "June"
+msgstr "чэрвеня"
+
+msgid "July"
+msgstr "ліпеня"
+
+msgid "August"
+msgstr "жніўня"
+
+msgid "September"
+msgstr "верасьня"
+
+msgid "October"
+msgstr "кастрычніка"
+
+msgid "November"
+msgstr "лістапада"
+
+msgid "December"
+msgstr "сьнежня"
+
+msgid "jan"
+msgstr "сту"
+
+msgid "feb"
+msgstr "лют"
+
+msgid "mar"
+msgstr "сак"
+
+msgid "apr"
+msgstr "кра"
+
+msgid "may"
+msgstr "тра"
+
+msgid "jun"
+msgstr "чэр"
+
+msgid "jul"
+msgstr "ліп"
+
+msgid "aug"
+msgstr "жні"
+
+msgid "sep"
+msgstr "вер"
+
+msgid "oct"
+msgstr "кас"
+
+msgid "nov"
+msgstr "ліс"
+
+msgid "dec"
+msgstr "сьн"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Сту."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Люты"
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "сакавік"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "красавіка"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "траўня"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "чэрвеня"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "ліпеня"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Жні."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Вер."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Кас."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Ліс."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Сьн."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "студзеня"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "лютага"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "сакавік"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "красавіка"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "траўня"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "чэрвеня"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "ліпеня"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "жніўня"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "верасьня"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "кастрычніка"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "лістапада"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "сьнежня"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Гэта ня правільны адрас IPv6."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s…"
+
+msgid "or"
+msgstr "або"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d год"
+msgstr[1] "%d гады"
+msgstr[2] "%d гадоў"
+msgstr[3] "%d гадоў"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d месяц"
+msgstr[1] "%d месяцы"
+msgstr[2] "%d месяцаў"
+msgstr[3] "%d месяцаў"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d тыдзень"
+msgstr[1] "%d тыдні"
+msgstr[2] "%d тыдняў"
+msgstr[3] "%d тыдняў"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d дзень"
+msgstr[1] "%d дні"
+msgstr[2] "%d дзён"
+msgstr[3] "%d дзён"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d гадзіна"
+msgstr[1] "%d гадзіны"
+msgstr[2] "%d гадзін"
+msgstr[3] "%d гадзін"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d хвіліна"
+msgstr[1] "%d хвіліны"
+msgstr[2] "%d хвілінаў"
+msgstr[3] "%d хвілінаў"
+
+msgid "0 minutes"
+msgstr "0 хвілін"
+
+msgid "Forbidden"
+msgstr "Забаронена"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF-праверка не атрымалася. Запыт спынены."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Вы бачыце гэта паведамленне, таму што гэты HTTPS-сайт патрабуе каб Referer "
+"загаловак быў адасланы вашым вэб-браўзэрам, але гэтага не адбылося. Гэты "
+"загаловак неабходны для бяспекі, каб пераканацца, што ваш браўзэр не "
+"ўзаламаны трэцімі асобамі."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Калі вы сканфігуравалі ваш браўзэр так, каб ён не працаваў з 'Referer' "
+"загалоўкамі, калі ласка дазвольце іх хаця б для гэтага сайту, ці для HTTPS "
+"злучэнняў, ці для 'same-origin' запытаў."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Калі вы выкарыстоўваеце тэг "
+"ці дадалі загаловак 'Referrer-Policy: no-referrer', калі ласка выдаліце іх. "
+"CSRF абароне неабходны 'Referer' загаловак для строгай праверкі. Калі Вы "
+"турбуецеся аб прыватнасці, выкарыстоўвайце альтэрнатывы, напрыклад , для спасылкі на сайты трэціх асоб."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Вы бачыце гэта паведамленне, таму што гэты сайт патрабуе CSRF кукі для "
+"адсылкі формы. Гэтыя кукі неабходныя для бяспекі, каб пераканацца, што ваш "
+"браўзэр не ўзламаны трэцімі асобамі."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Калі вы сканфігуравалі ваш браўзэр так, каб ён не працаваў з кукамі, калі "
+"ласка дазвольце іх хаця б для гэтага сайту ці для 'same-origin' запытаў."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Больш падрабязная інфармацыя даступная з DEBUG=True."
+
+msgid "No year specified"
+msgstr "Не пазначылі год"
+
+msgid "Date out of range"
+msgstr "Дата выходзіць за межы дыяпазону"
+
+msgid "No month specified"
+msgstr "Не пазначылі месяц"
+
+msgid "No day specified"
+msgstr "Не пазначылі дзень"
+
+msgid "No week specified"
+msgstr "Не пазначылі тыдзень"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Няма доступу да %(verbose_name_plural)s"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Няма доступу да %(verbose_name_plural)s, якія будуць, бо «%(class_name)s."
+"allow_future» мае значэньне «не сапраўдна»."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Радок даты «%(datestr)s» не адпавядае выгляду «%(format)s»"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Па запыце не знайшлі ніводнага %(verbose_name)s"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"Нумар бачыны ня мае значэньня «last» і яго нельга ператварыць у цэлы лік."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Няправільная старонка (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr ""
+"Сьпіс парожні, але «%(class_name)s.allow_empty» мае значэньне «не "
+"сапраўдна», што забараняе паказваць парожнія сьпісы."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Не дазваляецца глядзець сьпіс файлаў каталёґа."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "Шлях «%(path)s» не існуе."
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Файлы каталёґа «%(directory)s»"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Джанга: Web рамкі для перфекцыяністаў з крайнімі тэрмінамі."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Паглядзець заўвагі да выпуску для Джангі "
+"%(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Усталяванне прайшло паспяхова! Віншаванні!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Вы бачыце гэту старонку таму што DEBUG=True у вашым файле налад і вы не сканфігурыравалі ніякіх URL."
+
+msgid "Django Documentation"
+msgstr "Дакументацыя Джангі"
+
+msgid "Topics, references, & how-to's"
+msgstr "Тэмы, спасылкі, & як зрабіць"
+
+msgid "Tutorial: A Polling App"
+msgstr "Падручнік: Дадатак для галасавання"
+
+msgid "Get started with Django"
+msgstr "Пачніце з Джангаю"
+
+msgid "Django Community"
+msgstr "Джанга супольнасць"
+
+msgid "Connect, get help, or contribute"
+msgstr "Злучайцеся, атрымлівайце дапамогу, ці спрыяйце"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ed5cd50
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8a85adb
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po
@@ -0,0 +1,1253 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Boris Chervenkov , 2012
+# Jannis Leidel , 2011
+# Lyuboslav Petrov , 2014
+# Todor Lubenov , 2013-2015
+# Venelin Stoykov , 2015-2017
+# vestimir , 2014
+# Alexander Atanasov , 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-17 09:05+0000\n"
+"Last-Translator: Venelin Stoykov \n"
+"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/"
+"bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Африкански"
+
+msgid "Arabic"
+msgstr "арабски език"
+
+msgid "Asturian"
+msgstr "Астурийски"
+
+msgid "Azerbaijani"
+msgstr "Азербайджански език"
+
+msgid "Bulgarian"
+msgstr "български език"
+
+msgid "Belarusian"
+msgstr "Беларуски"
+
+msgid "Bengali"
+msgstr "бенгалски език"
+
+msgid "Breton"
+msgstr "Бретон"
+
+msgid "Bosnian"
+msgstr "босненски език"
+
+msgid "Catalan"
+msgstr "каталунски език"
+
+msgid "Czech"
+msgstr "чешки език"
+
+msgid "Welsh"
+msgstr "уелски език"
+
+msgid "Danish"
+msgstr "датски език"
+
+msgid "German"
+msgstr "немски език"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "гръцки език"
+
+msgid "English"
+msgstr "английски език"
+
+msgid "Australian English"
+msgstr "Австралийски Английски"
+
+msgid "British English"
+msgstr "британски английски"
+
+msgid "Esperanto"
+msgstr "Есперанто"
+
+msgid "Spanish"
+msgstr "испански език"
+
+msgid "Argentinian Spanish"
+msgstr "кастилски"
+
+msgid "Colombian Spanish"
+msgstr "Колумбийски Испански"
+
+msgid "Mexican Spanish"
+msgstr "Мексикански испански"
+
+msgid "Nicaraguan Spanish"
+msgstr "никарагуански испански"
+
+msgid "Venezuelan Spanish"
+msgstr "Испански Венецуелски"
+
+msgid "Estonian"
+msgstr "естонски език"
+
+msgid "Basque"
+msgstr "баски"
+
+msgid "Persian"
+msgstr "персийски език"
+
+msgid "Finnish"
+msgstr "финландски език"
+
+msgid "French"
+msgstr "френски език"
+
+msgid "Frisian"
+msgstr "фризийски език"
+
+msgid "Irish"
+msgstr "ирландски език"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "галицейски език"
+
+msgid "Hebrew"
+msgstr "иврит"
+
+msgid "Hindi"
+msgstr "хинди"
+
+msgid "Croatian"
+msgstr "хърватски език"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "унгарски език"
+
+msgid "Interlingua"
+msgstr "Международен"
+
+msgid "Indonesian"
+msgstr "индонезийски език"
+
+msgid "Ido"
+msgstr "Идо"
+
+msgid "Icelandic"
+msgstr "исландски език"
+
+msgid "Italian"
+msgstr "италиански език"
+
+msgid "Japanese"
+msgstr "японски език"
+
+msgid "Georgian"
+msgstr "грузински език"
+
+msgid "Kazakh"
+msgstr "Казахски"
+
+msgid "Khmer"
+msgstr "кхмерски език"
+
+msgid "Kannada"
+msgstr "каннада"
+
+msgid "Korean"
+msgstr "Корейски"
+
+msgid "Luxembourgish"
+msgstr "Люксембургски"
+
+msgid "Lithuanian"
+msgstr "Литовски"
+
+msgid "Latvian"
+msgstr "Латвийски"
+
+msgid "Macedonian"
+msgstr "Македонски"
+
+msgid "Malayalam"
+msgstr "малаялам"
+
+msgid "Mongolian"
+msgstr "Монголски"
+
+msgid "Marathi"
+msgstr "Марати"
+
+msgid "Burmese"
+msgstr "Бурмесе"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Непалски"
+
+msgid "Dutch"
+msgstr "холандски"
+
+msgid "Norwegian Nynorsk"
+msgstr "норвежки съвременен език"
+
+msgid "Ossetic"
+msgstr "Осетски"
+
+msgid "Punjabi"
+msgstr "пенджаби"
+
+msgid "Polish"
+msgstr "полски език"
+
+msgid "Portuguese"
+msgstr "португалски език"
+
+msgid "Brazilian Portuguese"
+msgstr "бразилски португалски"
+
+msgid "Romanian"
+msgstr "румънски език"
+
+msgid "Russian"
+msgstr "руски език"
+
+msgid "Slovak"
+msgstr "словашки език"
+
+msgid "Slovenian"
+msgstr "словенски език"
+
+msgid "Albanian"
+msgstr "албански език"
+
+msgid "Serbian"
+msgstr "сръбски език"
+
+msgid "Serbian Latin"
+msgstr "сръбски с латински букви"
+
+msgid "Swedish"
+msgstr "шведски език"
+
+msgid "Swahili"
+msgstr "Суахили"
+
+msgid "Tamil"
+msgstr "тамил"
+
+msgid "Telugu"
+msgstr "телугу"
+
+msgid "Thai"
+msgstr "тайландски език"
+
+msgid "Turkish"
+msgstr "турски език"
+
+msgid "Tatar"
+msgstr "Татарски"
+
+msgid "Udmurt"
+msgstr "Удмурт"
+
+msgid "Ukrainian"
+msgstr "украински език"
+
+msgid "Urdu"
+msgstr "Урду"
+
+msgid "Vietnamese"
+msgstr "виетнамски език"
+
+msgid "Simplified Chinese"
+msgstr "китайски език"
+
+msgid "Traditional Chinese"
+msgstr "традиционен китайски"
+
+msgid "Messages"
+msgstr "Съобщения"
+
+msgid "Site Maps"
+msgstr "Бързи Maps"
+
+msgid "Static Files"
+msgstr "Статични файлове"
+
+msgid "Syndication"
+msgstr "Syndication"
+
+msgid "That page number is not an integer"
+msgstr "Номерът на страницата не е цяло число"
+
+msgid "That page number is less than 1"
+msgstr "Номерът на страницата е по-малък от 1"
+
+msgid "That page contains no results"
+msgstr "В тази страница няма резултати"
+
+msgid "Enter a valid value."
+msgstr "Въведете валидна стойност. "
+
+msgid "Enter a valid URL."
+msgstr "Въведете валиден URL адрес."
+
+msgid "Enter a valid integer."
+msgstr "Въведете валидно число."
+
+msgid "Enter a valid email address."
+msgstr "Въведете валиден имейл адрес."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Въведете валиден 'слъг', състоящ се от букви, цифри, тирета или долни тирета."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Въведете валиден 'слъг', състоящ се от букви, цифри, тирета или долни тирета."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Въведете валиден IPv4 адрес."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Въведете валиден IPv6 адрес."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Въведете валиден IPv4 или IPv6 адрес."
+
+msgid "Enter only digits separated by commas."
+msgstr "Въведете само еднозначни числа, разделени със запетая. "
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Уверете се, че тази стойност е %(limit_value)s (тя е %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Уверете се, че тази стойност е по-малка или равна на %(limit_value)s ."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Уверете се, че тази стойност е по-голяма или равна на %(limit_value)s ."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Уверете се, че тази стойност е най-малко %(limit_value)d знака (тя има "
+"%(show_value)d )."
+msgstr[1] ""
+"Уверете се, че тази стойност е най-малко %(limit_value)d знака (тя има "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Уверете се, тази стойност има най-много %(limit_value)d знака (тя има "
+"%(show_value)d)."
+msgstr[1] ""
+"Уверете се, че тази стойност има най-много %(limit_value)d знака (тя има "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Уверете се, че има не повече от %(max)s цифри в общо."
+msgstr[1] "Уверете се, че има не повече от %(max)s цифри общо."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+"Уверете се, че има не повече от%(max)s знак след десетичната запетая."
+msgstr[1] ""
+"Уверете се, че има не повече от %(max)s знака след десетичната запетая."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Уверете се, че има не повече от %(max)s цифри преди десетичната запетая."
+msgstr[1] ""
+"Уверете се, че има не повече от %(max)s цифри преди десетичната запетая."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Не са разрешени файлове с раширение '%(extension)s'. Позволените разширения "
+"са: '%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "и"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s с тези %(field_labels)s вече съществува."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Стойността %(value)r не е валиден избор."
+
+msgid "This field cannot be null."
+msgstr "Това поле не може да има празна стойност."
+
+msgid "This field cannot be blank."
+msgstr "Това поле не може да е празно."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s с този %(field_label)s вече съществува."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s трябва да са уникални за %(date_field_label)s "
+"%(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Поле от тип: %(field_type)s"
+
+msgid "Integer"
+msgstr "Цяло число"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' стойност трябва да е цяло число."
+
+msgid "Big (8 byte) integer"
+msgstr "Голямо (8 байта) цяло число"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "Стойността на '%(value)s' трябва да бъде или True или False."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True или False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Символен низ (до %(max_length)s символа)"
+
+msgid "Comma-separated integers"
+msgstr "Цели числа, разделени с запетая"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' стойност е с формат невалидна дата. Тя трябва да бъде в YYYY-MM-"
+"DD формат."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Стойността на '%(value)s' е в правилния формат (ГГГГ-ММ-ДД), но тя е "
+"невалидна дата."
+
+msgid "Date (without time)"
+msgstr "Дата (без час)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Стойността на '%(value)s' е с невалиден формат. Трябва да бъде във формат "
+"ГГГГ-ММ-ДД ЧЧ:ММ[:сс[.uuuuuu]][TZ] (където u означава милисекунда, а TZ - "
+"часова зона)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Стойността на '%(value)s' е с правилен формат ( ГГГГ-ММ-ДД ЧЧ:ММ[:сс[."
+"μμμμμμ]][TZ]), но датата/часът са невалидни"
+
+msgid "Date (with time)"
+msgstr "Дата (и час)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "Стойността на '%(value)s' трябва да е десетично число."
+
+msgid "Decimal number"
+msgstr "Десетична дроб"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"Стойността на '%(value)s' е с невалиден формат. Тя трябва да бъде в [ДД] "
+"[ЧЧ:[ММ:]]сс[.μμμμμμ]"
+
+msgid "Duration"
+msgstr "Продължителност"
+
+msgid "Email address"
+msgstr "Email адрес"
+
+msgid "File path"
+msgstr "Път към файл"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "'%(value)s' стойност трябва да е число с плаваща запетая."
+
+msgid "Floating point number"
+msgstr "Число с плаваща запетая"
+
+msgid "IPv4 address"
+msgstr "IPv4 адрес"
+
+msgid "IP address"
+msgstr "IP адрес"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Стойност '%(value)s' трябва да бъде или None, True или False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Възможните стойности са True, False или None)"
+
+msgid "Positive integer"
+msgstr "Положително цяло число"
+
+msgid "Positive small integer"
+msgstr "Положително 2 байта цяло число"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (до %(max_length)s )"
+
+msgid "Small integer"
+msgstr "2 байта цяло число"
+
+msgid "Text"
+msgstr "Текст"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Стойността '%(value)s' е с невалиден формат. Тя трябва да бъде в ЧЧ:ММ [:"
+"сс[.μμμμμμ]]"
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Стойността на '%(value)s' е в правилния формат (ЧЧ:ММ [:сс[.μμμμμμ]]), но "
+"часът е невалиден."
+
+msgid "Time"
+msgstr "Време"
+
+msgid "URL"
+msgstr "URL адрес"
+
+msgid "Raw binary data"
+msgstr "сурови двоични данни"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' не е валиден UUID."
+
+msgid "File"
+msgstr "Файл"
+
+msgid "Image"
+msgstr "Изображение"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "Инстанция на %(model)s с %(field)s %(value)r не съществува."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Външен ключ (тип, определен от свързаното поле)"
+
+msgid "One-to-one relationship"
+msgstr "словенски език"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Много-към-много връзка"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Това поле е задължително."
+
+msgid "Enter a whole number."
+msgstr "Въведете цяло число. "
+
+msgid "Enter a number."
+msgstr "Въведете число."
+
+msgid "Enter a valid date."
+msgstr "Въведете валидна дата. "
+
+msgid "Enter a valid time."
+msgstr "Въведете валиден час."
+
+msgid "Enter a valid date/time."
+msgstr "Въведете валидна дата/час. "
+
+msgid "Enter a valid duration."
+msgstr "Въведете валидна продължителност."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Не е получен файл. Проверете типа кодиране на формата. "
+
+msgid "No file was submitted."
+msgstr "Няма изпратен файл."
+
+msgid "The submitted file is empty."
+msgstr "Каченият файл е празен. "
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] "Уверете се, това име е най-много %(max)d знака (то има %(length)d)."
+msgstr[1] ""
+"Уверете се, че това файлово име има най-много %(max)d знаци (има "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Моля, или пратете файл или маркирайте полето за изчистване, но не и двете."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Качете валидно изображение. Файлът, който сте качили или не е изображение, "
+"или е повреден. "
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Направете валиден избор. %(value)s не е един от възможните избори."
+
+msgid "Enter a list of values."
+msgstr "Въведете списък от стойности"
+
+msgid "Enter a complete value."
+msgstr "Въведете пълна стойност."
+
+msgid "Enter a valid UUID."
+msgstr "Въведете валиден UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Скрито поле %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Данни за мениджърската форма липсват или са били променени."
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Моля, въведете %d по-малко форми."
+msgstr[1] "Моля, въведете %d по-малко форми."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Моля, въведете %d или по-вече форми."
+msgstr[1] "Моля, въведете %d или по-вече форми."
+
+msgid "Order"
+msgstr "Ред"
+
+msgid "Delete"
+msgstr "Изтрий"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Моля, коригирайте дублираните данни за %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Моля, коригирайте дублираните данни за %(field)s, които трябва да са "
+"уникални."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Моля, коригирайте дублиранитe данни за %(field_name)s , които трябва да са "
+"уникални за %(lookup)s в %(date_field)s ."
+
+msgid "Please correct the duplicate values below."
+msgstr "Моля, коригирайте повтарящите се стойности по-долу."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Направете валиден избор. Този не е един от възможните избори. "
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s не може да бъде разчетено в %(current_timezone)s; може да е "
+"двусмислен или да не съществува"
+
+msgid "Clear"
+msgstr "Изчисти"
+
+msgid "Currently"
+msgstr "Сега"
+
+msgid "Change"
+msgstr "Промени"
+
+msgid "Unknown"
+msgstr "Неизвестно"
+
+msgid "Yes"
+msgstr "Да"
+
+msgid "No"
+msgstr "Не"
+
+msgid "yes,no,maybe"
+msgstr "да, не, може би"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d, байт"
+msgstr[1] "%(size)d, байта"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s ТБ"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "след обяд"
+
+msgid "a.m."
+msgstr "преди обяд"
+
+msgid "PM"
+msgstr "след обяд"
+
+msgid "AM"
+msgstr "преди обяд"
+
+msgid "midnight"
+msgstr "полунощ"
+
+msgid "noon"
+msgstr "обяд"
+
+msgid "Monday"
+msgstr "понеделник"
+
+msgid "Tuesday"
+msgstr "вторник"
+
+msgid "Wednesday"
+msgstr "сряда"
+
+msgid "Thursday"
+msgstr "четвъртък"
+
+msgid "Friday"
+msgstr "петък"
+
+msgid "Saturday"
+msgstr "събота"
+
+msgid "Sunday"
+msgstr "неделя"
+
+msgid "Mon"
+msgstr "Пон"
+
+msgid "Tue"
+msgstr "Вт"
+
+msgid "Wed"
+msgstr "Ср"
+
+msgid "Thu"
+msgstr "Чет"
+
+msgid "Fri"
+msgstr "Пет"
+
+msgid "Sat"
+msgstr "Съб"
+
+msgid "Sun"
+msgstr "Нед"
+
+msgid "January"
+msgstr "Януари"
+
+msgid "February"
+msgstr "Февруари"
+
+msgid "March"
+msgstr "Март"
+
+msgid "April"
+msgstr "Април"
+
+msgid "May"
+msgstr "Май"
+
+msgid "June"
+msgstr "Юни"
+
+msgid "July"
+msgstr "Юли"
+
+msgid "August"
+msgstr "Август"
+
+msgid "September"
+msgstr "Септември"
+
+msgid "October"
+msgstr "Октомври"
+
+msgid "November"
+msgstr "Ноември"
+
+msgid "December"
+msgstr "Декември"
+
+msgid "jan"
+msgstr "ян"
+
+msgid "feb"
+msgstr "фев"
+
+msgid "mar"
+msgstr "мар"
+
+msgid "apr"
+msgstr "апр"
+
+msgid "may"
+msgstr "май"
+
+msgid "jun"
+msgstr "юни"
+
+msgid "jul"
+msgstr "юли"
+
+msgid "aug"
+msgstr "авг"
+
+msgid "sep"
+msgstr "сеп"
+
+msgid "oct"
+msgstr "окт"
+
+msgid "nov"
+msgstr "ноев"
+
+msgid "dec"
+msgstr "дек"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ян."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Фев."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Март"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Април"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Май"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Юни"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Юли"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Авг."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Септ."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Окт."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Ноев."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Дек."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Януари"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Февруари"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Март"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Април"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Май"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Юни"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Юли"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Август"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Септември"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "след обяд"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Ноември"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Декември"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Въведете валиден IPv6 адрес."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "или"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ","
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d година"
+msgstr[1] "%d години"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d месец"
+msgstr[1] "%d месеца"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d седмица"
+msgstr[1] "%d седмици"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d дни"
+msgstr[1] "%d дни"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d час"
+msgstr[1] "%d часа"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d минута"
+msgstr[1] "%d минути"
+
+msgid "0 minutes"
+msgstr "0 минути"
+
+msgid "Forbidden"
+msgstr "Забранен"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF проверката се провали. Заявката прекратена."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Вие виждате това съобщение, защото този HTTPS сайт изисква 'Referer header' "
+"да бъде изпратен от вашият WEB браузър, но такъв не бе изпратен. Този "
+"header е задължителен от съображения за сигурност, за да се гарантира, че "
+"вашият браузър не е компрометиран от трети страни."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Ако сте конфигурирали вашия браузър, да забраните 'Referer' headers, моля да "
+"ги активирате отново, поне за този сайт, или за HTTPS връзки, или за 'same-"
+"origin' заявки."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Вие виждате това съобщение, защото този сайт изисква CSRF бисквитка когато "
+"се подават формуляри. Тази бисквитка е задължителна от съображения за "
+"сигурност, за да се гарантира, че вашият браузър не е компрометиран от трети "
+"страни."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Ако сте конфигурирали вашия браузър, да забраните бисквитките, моля да ги "
+"активирате отново, поне за този сайт, или за'same-origin' заявки."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Повече информация е на разположение с DEBUG=True."
+
+msgid "No year specified"
+msgstr "Не е посочена година"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Не е посочен месец"
+
+msgid "No day specified"
+msgstr "ноев"
+
+msgid "No week specified"
+msgstr "Не е посочена седмица"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Няма достъпни %(verbose_name_plural)s"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Бъдещo %(verbose_name_plural)s е достъпно, тъй като %(class_name)s."
+"allow_future е False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Невалидна дата '%(datestr)s' посочен формат '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Няма %(verbose_name)s , съвпадащи със заявката"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Страницата не е 'last' нито може да се преобразува в int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Невалидна страница (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Празен списък и '%(class_name)s.allow_empty' не е валидно."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Тук не е позволено индексиране на директория."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" не съществува"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Индекс %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: Фреймуоркът за перфекционисти с крайни срокове."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Вие виждате тази страница защото DEBUG=True е във вашият settings файл и не сте конфигурирали никакви "
+"URL-и"
+
+msgid "Django Documentation"
+msgstr "Django Документация"
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr "Започнете с Django"
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..ec8d14d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..454ab05
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/formats.py
new file mode 100644
index 0000000..4013dad
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bg/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'd F Y'
+TIME_FORMAT = 'H:i'
+# DATETIME_FORMAT =
+# YEAR_MONTH_FORMAT =
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'd.m.Y'
+# SHORT_DATETIME_FORMAT =
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = ' ' # Non-breaking space
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..7c325ca
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..05aeea1
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po
@@ -0,0 +1,1191 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel , 2011
+# M Nasimul Haque , 2013
+# Tahmid Rafi , 2012-2013
+# Tahmid Rafi , 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Bengali (http://www.transifex.com/django/django/language/"
+"bn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "আফ্রিকার অন্যতম সরকারি ভাষা"
+
+msgid "Arabic"
+msgstr "আরবী"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "আজারবাইজানি"
+
+msgid "Bulgarian"
+msgstr "বুলগেরিয়ান"
+
+msgid "Belarusian"
+msgstr "বেলারুশীয়"
+
+msgid "Bengali"
+msgstr "বাংলা"
+
+msgid "Breton"
+msgstr "ব্রেটন"
+
+msgid "Bosnian"
+msgstr "বসনিয়ান"
+
+msgid "Catalan"
+msgstr "ক্যাটালান"
+
+msgid "Czech"
+msgstr "চেক"
+
+msgid "Welsh"
+msgstr "ওয়েল্স"
+
+msgid "Danish"
+msgstr "ড্যানিশ"
+
+msgid "German"
+msgstr "জার্মান"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "গ্রিক"
+
+msgid "English"
+msgstr "ইংলিশ"
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr "বৃটিশ ইংলিশ"
+
+msgid "Esperanto"
+msgstr "আন্তর্জাতিক ভাষা"
+
+msgid "Spanish"
+msgstr "স্প্যানিশ"
+
+msgid "Argentinian Spanish"
+msgstr "আর্জেন্টিনিয়ান স্প্যানিশ"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "মেক্সিকান স্প্যানিশ"
+
+msgid "Nicaraguan Spanish"
+msgstr "নিকারাগুয়ান স্প্যানিশ"
+
+msgid "Venezuelan Spanish"
+msgstr "ভেনেজুয়েলার স্প্যানিশ"
+
+msgid "Estonian"
+msgstr "এস্তোনিয়ান"
+
+msgid "Basque"
+msgstr "বাস্ক"
+
+msgid "Persian"
+msgstr "ফারসি"
+
+msgid "Finnish"
+msgstr "ফিনিশ"
+
+msgid "French"
+msgstr "ফ্রেঞ্চ"
+
+msgid "Frisian"
+msgstr "ফ্রিজ্ল্যানডের ভাষা"
+
+msgid "Irish"
+msgstr "আইরিশ"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "গ্যালিসিয়ান"
+
+msgid "Hebrew"
+msgstr "হিব্রু"
+
+msgid "Hindi"
+msgstr "হিন্দী"
+
+msgid "Croatian"
+msgstr "ক্রোয়েশিয়ান"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "হাঙ্গেরিয়ান"
+
+msgid "Interlingua"
+msgstr ""
+
+msgid "Indonesian"
+msgstr "ইন্দোনেশিয়ান"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "আইসল্যান্ডিক"
+
+msgid "Italian"
+msgstr "ইটালিয়ান"
+
+msgid "Japanese"
+msgstr "জাপানিজ"
+
+msgid "Georgian"
+msgstr "জর্জিয়ান"
+
+msgid "Kazakh"
+msgstr "কাজাখ"
+
+msgid "Khmer"
+msgstr "খমার"
+
+msgid "Kannada"
+msgstr "কান্নাড়া"
+
+msgid "Korean"
+msgstr "কোরিয়ান"
+
+msgid "Luxembourgish"
+msgstr "লুক্সেমবার্গীয়"
+
+msgid "Lithuanian"
+msgstr "লিথুয়ানিয়ান"
+
+msgid "Latvian"
+msgstr "লাটভিয়ান"
+
+msgid "Macedonian"
+msgstr "ম্যাসাডোনিয়ান"
+
+msgid "Malayalam"
+msgstr "মালায়ালম"
+
+msgid "Mongolian"
+msgstr "মঙ্গোলিয়ান"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr "বার্মিজ"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "নেপালি"
+
+msgid "Dutch"
+msgstr "ডাচ"
+
+msgid "Norwegian Nynorsk"
+msgstr "নরওয়েজীয়ান নিনর্স্ক"
+
+msgid "Ossetic"
+msgstr "অসেটিক"
+
+msgid "Punjabi"
+msgstr "পাঞ্জাবী"
+
+msgid "Polish"
+msgstr "পোলিশ"
+
+msgid "Portuguese"
+msgstr "পর্তুগীজ"
+
+msgid "Brazilian Portuguese"
+msgstr "ব্রাজিলিয়ান পর্তুগীজ"
+
+msgid "Romanian"
+msgstr "রোমানিয়ান"
+
+msgid "Russian"
+msgstr "রাশান"
+
+msgid "Slovak"
+msgstr "স্লোভাক"
+
+msgid "Slovenian"
+msgstr "স্লোভেনিয়ান"
+
+msgid "Albanian"
+msgstr "আলবেনীয়ান"
+
+msgid "Serbian"
+msgstr "সার্বিয়ান"
+
+msgid "Serbian Latin"
+msgstr "সার্বিয়ান ল্যাটিন"
+
+msgid "Swedish"
+msgstr "সুইডিশ"
+
+msgid "Swahili"
+msgstr "সোয়াহিলি"
+
+msgid "Tamil"
+msgstr "তামিল"
+
+msgid "Telugu"
+msgstr "তেলেগু"
+
+msgid "Thai"
+msgstr "থাই"
+
+msgid "Turkish"
+msgstr "তুর্কি"
+
+msgid "Tatar"
+msgstr "তাতারদেশীয়"
+
+msgid "Udmurt"
+msgstr ""
+
+msgid "Ukrainian"
+msgstr "ইউক্রেনিয়ান"
+
+msgid "Urdu"
+msgstr "উর্দু"
+
+msgid "Vietnamese"
+msgstr "ভিয়েতনামিজ"
+
+msgid "Simplified Chinese"
+msgstr "সরলীকৃত চাইনীজ"
+
+msgid "Traditional Chinese"
+msgstr "প্রচলিত চাইনীজ"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "একটি বৈধ মান দিন।"
+
+msgid "Enter a valid URL."
+msgstr "বৈধ URL দিন"
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr "একটি বৈধ ইমেইল ঠিকানা লিখুন."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"বৈধ ’slug' প্রবেশ করান যাতে শুধুমাত্র ইংরেজী বর্ণ, অঙ্ক, আন্ডারস্কোর অথবা হাইফেন "
+"রয়েছে।"
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "একটি বৈধ IPv4 ঠিকানা দিন।"
+
+msgid "Enter a valid IPv6 address."
+msgstr "একটি বৈধ IPv6 ঠিকানা টাইপ করুন।"
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "একটি বৈধ IPv4 অথবা IPv6 ঠিকানা টাইপ করুন।"
+
+msgid "Enter only digits separated by commas."
+msgstr "শুধুমাত্র কমা দিয়ে সংখ্যা দিন।"
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "সংখ্যাটির মান %(limit_value)s হতে হবে (এটা এখন %(show_value)s আছে)।"
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে ছোট বা সমান হতে হবে।"
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে বড় বা সমান হতে হবে।"
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "এবং"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "এর মান null হতে পারবে না।"
+
+msgid "This field cannot be blank."
+msgstr "এই ফিল্ডের মান ফাঁকা হতে পারে না"
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(field_label)s সহ %(model_name)s আরেকটি রয়েছে।"
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "ফিল্ডের ধরণ: %(field_type)s"
+
+msgid "Integer"
+msgstr "ইন্টিজার"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "বিগ (৮ বাইট) ইন্টিজার"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "বুলিয়ান (হয় True অথবা False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "স্ট্রিং (সর্বোচ্চ %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "কমা দিয়ে আলাদা করা ইন্টিজার"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "তারিখ (সময় বাদে)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "তারিখ (সময় সহ)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "দশমিক সংখ্যা"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "ইমেইল ঠিকানা"
+
+msgid "File path"
+msgstr "ফাইল পথ"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "ফ্লোটিং পয়েন্ট সংখ্যা"
+
+msgid "IPv4 address"
+msgstr "IPv4 ঠিকানা"
+
+msgid "IP address"
+msgstr "আইপি ঠিকানা"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "বুলিয়ান (হয় True, False অথবা None)"
+
+msgid "Positive integer"
+msgstr "পজিটিভ ইন্টিজার"
+
+msgid "Positive small integer"
+msgstr "পজিটিভ স্মল ইন্টিজার"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "স্লাগ (সর্বোচ্চ %(max_length)s)"
+
+msgid "Small integer"
+msgstr "স্মল ইন্টিজার"
+
+msgid "Text"
+msgstr "টেক্সট"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "সময়"
+
+msgid "URL"
+msgstr "ইউআরএল (URL)"
+
+msgid "Raw binary data"
+msgstr "র বাইনারি ডাটা"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "ফাইল"
+
+msgid "Image"
+msgstr "ইমেজ"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "ফরেন কি (টাইপ রিলেটেড ফিল্ড দ্বারা নির্ণীত হবে)"
+
+msgid "One-to-one relationship"
+msgstr "ওয়ান-টু-ওয়ান রিলেশানশিপ"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "ম্যানি-টু-ম্যানি রিলেশানশিপ"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ""
+
+msgid "This field is required."
+msgstr "এটি আবশ্যক।"
+
+msgid "Enter a whole number."
+msgstr "একটি পূর্ণসংখ্যা দিন"
+
+msgid "Enter a number."
+msgstr "একটি সংখ্যা প্রবেশ করান।"
+
+msgid "Enter a valid date."
+msgstr "বৈধ তারিখ দিন।"
+
+msgid "Enter a valid time."
+msgstr "বৈধ সময় দিন।"
+
+msgid "Enter a valid date/time."
+msgstr "বৈধ তারিখ/সময় দিন।"
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "কোন ফাইল দেয়া হয়নি। ফর্মের এনকোডিং ঠিক আছে কিনা দেখুন।"
+
+msgid "No file was submitted."
+msgstr "কোন ফাইল দেয়া হয়নি।"
+
+msgid "The submitted file is empty."
+msgstr "ফাইলটি খালি।"
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"একটি ফাইল সাবমিট করুন অথবা ক্লিয়ার চেকবক্সটি চেক করে দিন, যে কোন একটি করুন।"
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"সঠিক ছবি আপলোড করুন। যে ফাইলটি আপলোড করা হয়েছে তা হয় ছবি নয় অথবা নষ্ট হয়ে "
+"যাওয়া ছবি।"
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "%(value)s বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।"
+
+msgid "Enter a list of values."
+msgstr "কয়েকটি মানের তালিকা দিন।"
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ""
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "ক্রম"
+
+msgid "Delete"
+msgstr "মুছুন"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr ""
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+
+msgid "Please correct the duplicate values below."
+msgstr ""
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "এটি বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।"
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+
+msgid "Clear"
+msgstr "পরিষ্কার করুন"
+
+msgid "Currently"
+msgstr "এই মুহুর্তে"
+
+msgid "Change"
+msgstr "পরিবর্তন"
+
+msgid "Unknown"
+msgstr "অজানা"
+
+msgid "Yes"
+msgstr "হ্যাঁ"
+
+msgid "No"
+msgstr "না"
+
+msgid "yes,no,maybe"
+msgstr "হ্যাঁ,না,হয়তো"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d বাইট"
+msgstr[1] "%(size)d বাইট"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s কিলোবাইট"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s মেগাবাইট"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s গিগাবাইট"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s টেরাবাইট"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s পেটাবাইট"
+
+msgid "p.m."
+msgstr "অপরাহ্ন"
+
+msgid "a.m."
+msgstr "পূর্বাহ্ন"
+
+msgid "PM"
+msgstr "অপরাহ্ন"
+
+msgid "AM"
+msgstr "পূর্বাহ্ন"
+
+msgid "midnight"
+msgstr "মধ্যরাত"
+
+msgid "noon"
+msgstr "দুপুর"
+
+msgid "Monday"
+msgstr "সোমবার"
+
+msgid "Tuesday"
+msgstr "মঙ্গলবার"
+
+msgid "Wednesday"
+msgstr "বুধবার"
+
+msgid "Thursday"
+msgstr "বৃহস্পতিবার"
+
+msgid "Friday"
+msgstr "শুক্রবার"
+
+msgid "Saturday"
+msgstr "শনিবার"
+
+msgid "Sunday"
+msgstr "রবিবার"
+
+msgid "Mon"
+msgstr "সোম"
+
+msgid "Tue"
+msgstr "মঙ্গল"
+
+msgid "Wed"
+msgstr "বুধ"
+
+msgid "Thu"
+msgstr "বৃহঃ"
+
+msgid "Fri"
+msgstr "শুক্র"
+
+msgid "Sat"
+msgstr "শনি"
+
+msgid "Sun"
+msgstr "রবি"
+
+msgid "January"
+msgstr "জানুয়ারি"
+
+msgid "February"
+msgstr "ফেব্রুয়ারি"
+
+msgid "March"
+msgstr "মার্চ"
+
+msgid "April"
+msgstr "এপ্রিল"
+
+msgid "May"
+msgstr "মে"
+
+msgid "June"
+msgstr "জুন"
+
+msgid "July"
+msgstr "জুলাই"
+
+msgid "August"
+msgstr "আগস্ট"
+
+msgid "September"
+msgstr "সেপ্টেম্বর"
+
+msgid "October"
+msgstr "অক্টোবর"
+
+msgid "November"
+msgstr "নভেম্বর"
+
+msgid "December"
+msgstr "ডিসেম্বর"
+
+msgid "jan"
+msgstr "জান."
+
+msgid "feb"
+msgstr "ফেব."
+
+msgid "mar"
+msgstr "মার্চ"
+
+msgid "apr"
+msgstr "এপ্রি."
+
+msgid "may"
+msgstr "মে"
+
+msgid "jun"
+msgstr "জুন"
+
+msgid "jul"
+msgstr "জুল."
+
+msgid "aug"
+msgstr "আগ."
+
+msgid "sep"
+msgstr "সেপ্টে."
+
+msgid "oct"
+msgstr "অক্টো."
+
+msgid "nov"
+msgstr "নভে."
+
+msgid "dec"
+msgstr "ডিসে."
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "জানু."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "ফেব্রু."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "মার্চ"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "এপ্রিল"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "মে"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "জুন"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "জুলাই"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "আগ."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "সেপ্ট."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "অক্টো."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "নভে."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "ডিসে."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "জানুয়ারি"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "ফেব্রুয়ারি"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "মার্চ"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "এপ্রিল"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "মে"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "জুন"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "জুলাই"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "আগস্ট"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "সেপ্টেম্বর"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "অক্টোবর"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "নভেম্বর"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "ডিসেম্বর"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "অথবা"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ","
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "0 minutes"
+msgstr "0 মিনিট"
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "কোন বছর উল্লেখ করা হয়নি"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "কোন মাস উল্লেখ করা হয়নি"
+
+msgid "No day specified"
+msgstr "কোন দিন উল্লেখ করা হয়নি"
+
+msgid "No week specified"
+msgstr "কোন সপ্তাহ উল্লেখ করা হয়নি"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "কোন %(verbose_name_plural)s নেই"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "কুয়েরি ম্যাচ করে এমন কোন %(verbose_name)s পাওয়া যায় নি"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr ""
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr ""
+
+msgid "Directory indexes are not allowed here."
+msgstr "ডিরেক্টরি ইনডেক্স অনুমোদিত নয়"
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" এর অস্তিত্ব নেই"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "%(directory)s এর ইনডেক্স"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..8ab3792
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..5ef0ed3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/formats.py
new file mode 100644
index 0000000..79c033c
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bn/formats.py
@@ -0,0 +1,32 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F, Y'
+TIME_FORMAT = 'g:i A'
+# DATETIME_FORMAT =
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'j M, Y'
+# SHORT_DATETIME_FORMAT =
+FIRST_DAY_OF_WEEK = 6 # Saturday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', # 25/10/2016
+ '%d/%m/%y', # 25/10/16
+ '%d-%m-%Y', # 25-10-2016
+ '%d-%m-%y', # 25-10-16
+]
+TIME_INPUT_FORMATS = [
+ '%H:%M:%S', # 14:30:59
+ '%H:%M', # 14:30
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S', # 25/10/2006 14:30:59
+ '%d/%m/%Y %H:%M', # 25/10/2006 14:30
+]
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..345448b
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.po
new file mode 100644
index 0000000..34e5c01
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.po
@@ -0,0 +1,1199 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Fulup , 2012,2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: br\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaneg"
+
+msgid "Arabic"
+msgstr "Arabeg"
+
+msgid "Asturian"
+msgstr "Astureg"
+
+msgid "Azerbaijani"
+msgstr "Azeri"
+
+msgid "Bulgarian"
+msgstr "Bulgareg"
+
+msgid "Belarusian"
+msgstr "Belaruseg"
+
+msgid "Bengali"
+msgstr "Bengaleg"
+
+msgid "Breton"
+msgstr "Brezhoneg"
+
+msgid "Bosnian"
+msgstr "Bosneg"
+
+msgid "Catalan"
+msgstr "Katalaneg"
+
+msgid "Czech"
+msgstr "Tchekeg"
+
+msgid "Welsh"
+msgstr "Kembraeg"
+
+msgid "Danish"
+msgstr "Daneg"
+
+msgid "German"
+msgstr "Alamaneg"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Gresianeg"
+
+msgid "English"
+msgstr "Saozneg"
+
+msgid "Australian English"
+msgstr "Saozneg Aostralia"
+
+msgid "British English"
+msgstr "Saozneg Breizh-Veur"
+
+msgid "Esperanto"
+msgstr "Esperanteg"
+
+msgid "Spanish"
+msgstr "Spagnoleg"
+
+msgid "Argentinian Spanish"
+msgstr "Spagnoleg Arc'hantina"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Spagnoleg Mec'hiko"
+
+msgid "Nicaraguan Spanish"
+msgstr "Spagnoleg Nicaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "Spagnoleg Venezuela"
+
+msgid "Estonian"
+msgstr "Estoneg"
+
+msgid "Basque"
+msgstr "Euskareg"
+
+msgid "Persian"
+msgstr "Perseg"
+
+msgid "Finnish"
+msgstr "Finneg"
+
+msgid "French"
+msgstr "Galleg"
+
+msgid "Frisian"
+msgstr "Frizeg"
+
+msgid "Irish"
+msgstr "Iwerzhoneg"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Galizeg"
+
+msgid "Hebrew"
+msgstr "Hebraeg"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Kroateg"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Hungareg"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonezeg"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandeg"
+
+msgid "Italian"
+msgstr "Italianeg"
+
+msgid "Japanese"
+msgstr "Japaneg"
+
+msgid "Georgian"
+msgstr "Jorjianeg"
+
+msgid "Kazakh"
+msgstr "kazak"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannata"
+
+msgid "Korean"
+msgstr "Koreaneg"
+
+msgid "Luxembourgish"
+msgstr "Luksembourgeg"
+
+msgid "Lithuanian"
+msgstr "Lituaneg"
+
+msgid "Latvian"
+msgstr "Latveg"
+
+msgid "Macedonian"
+msgstr "Makedoneg"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongoleg"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "Burmeg"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "nepaleg"
+
+msgid "Dutch"
+msgstr "Nederlandeg"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norvegeg Nynorsk"
+
+msgid "Ossetic"
+msgstr "Oseteg"
+
+msgid "Punjabi"
+msgstr "Punjabeg"
+
+msgid "Polish"
+msgstr "Poloneg"
+
+msgid "Portuguese"
+msgstr "Portugaleg"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugaleg Brazil"
+
+msgid "Romanian"
+msgstr "Roumaneg"
+
+msgid "Russian"
+msgstr "Rusianeg"
+
+msgid "Slovak"
+msgstr "Slovakeg"
+
+msgid "Slovenian"
+msgstr "Sloveneg"
+
+msgid "Albanian"
+msgstr "Albaneg"
+
+msgid "Serbian"
+msgstr "Serbeg"
+
+msgid "Serbian Latin"
+msgstr "Serbeg e lizherennoù latin"
+
+msgid "Swedish"
+msgstr "Svedeg"
+
+msgid "Swahili"
+msgstr "swahileg"
+
+msgid "Tamil"
+msgstr "Tamileg"
+
+msgid "Telugu"
+msgstr "Telougou"
+
+msgid "Thai"
+msgstr "Thai"
+
+msgid "Turkish"
+msgstr "Turkeg"
+
+msgid "Tatar"
+msgstr "tatar"
+
+msgid "Udmurt"
+msgstr "Oudmourteg"
+
+msgid "Ukrainian"
+msgstr "Ukraineg"
+
+msgid "Urdu"
+msgstr "Ourdou"
+
+msgid "Vietnamese"
+msgstr "Vietnameg"
+
+msgid "Simplified Chinese"
+msgstr "Sinaeg eeunaet"
+
+msgid "Traditional Chinese"
+msgstr "Sinaeg hengounel"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr "Tresoù al lec'hienn"
+
+msgid "Static Files"
+msgstr "Restroù statek"
+
+msgid "Syndication"
+msgstr "Sindikadur"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Merkit un talvoud reizh"
+
+msgid "Enter a valid URL."
+msgstr "Merkit un URL reizh"
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr "Merkit ur chomlec'h postel reizh"
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"N'hall bezañ er vaezienn-mañ nemet lizherennoù, niveroù, tiredoù izel _ ha "
+"barrennigoù-stagañ."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Merkit ur chomlec'h IPv4 reizh."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Merkit ur chomlec'h IPv6 reizh."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Merkit ur chomlec'h IPv4 pe IPv6 reizh."
+
+msgid "Enter only digits separated by commas."
+msgstr "Merkañ hepken sifroù dispartiet dre skejoù."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Bezit sur ez eo an talvoud-mañ %(limit_value)s (evit ar mare ez eo "
+"%(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Gwiriit mat emañ an talvoud-mañ a-is pe par da %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Gwiriit mat emañ an talvoud-mañ a-us pe par da %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "ha"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "N'hall ket ar vaezienn chom goullo"
+
+msgid "This field cannot be blank."
+msgstr "N'hall ket ar vaezienn chom goullo"
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Bez' ez eus c'hoazh eus ur %(model_name)s gant ar %(field_label)s-mañ."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Seurt maezienn : %(field_type)s"
+
+msgid "Integer"
+msgstr "Anterin"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Anterin bras (8 okted)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Boulean (gwir pe gaou)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "neudennad arouezennoù (betek %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Niveroù anterin dispartiet dre ur skej"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Deizad (hep eur)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Deizad (gant an eur)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Niver dekvedennel"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Chomlec'h postel"
+
+msgid "File path"
+msgstr "Treug war-du ar restr"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Niver gant skej nij"
+
+msgid "IPv4 address"
+msgstr "Chomlec'h IPv4"
+
+msgid "IP address"
+msgstr "Chomlec'h IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Rekis eo d'an talvoud '%(value)s' bezañ par da Hini, Gwir pe Gaou."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boulean (gwir pe gaou pe netra)"
+
+msgid "Positive integer"
+msgstr "Niver anterin pozitivel"
+
+msgid "Positive small integer"
+msgstr "Niver anterin bihan pozitivel"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (betek %(max_length)s arouez.)"
+
+msgid "Small integer"
+msgstr "Niver anterin bihan"
+
+msgid "Text"
+msgstr "Testenn"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Eur"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "Restr"
+
+msgid "Image"
+msgstr "Skeudenn"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Alc'hwez estren (seurt termenet dre ar vaezienn liammet)"
+
+msgid "One-to-one relationship"
+msgstr "Darempred unan-ouzh-unan"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Darempred lies-ouzh-lies"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ""
+
+msgid "This field is required."
+msgstr "Rekis eo leuniañ ar vaezienn."
+
+msgid "Enter a whole number."
+msgstr "Merkit un niver anterin."
+
+msgid "Enter a number."
+msgstr "Merkit un niver."
+
+msgid "Enter a valid date."
+msgstr "Merkit un deiziad reizh"
+
+msgid "Enter a valid time."
+msgstr "Merkit un eur reizh"
+
+msgid "Enter a valid date/time."
+msgstr "Merkit un eur/deiziad reizh"
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "N'eus ket kaset restr ebet. Gwiriit ar seurt enkodañ evit ar restr"
+
+msgid "No file was submitted."
+msgstr "N'eus bet kaset restr ebet."
+
+msgid "The submitted file is empty."
+msgstr "Goullo eo ar restr kaset."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Kasit ur restr pe askit al log riñsañ; an eil pe egile"
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Enpozhiit ur skeudenn reizh. Ar seurt bet enporzhiet ganeoc'h a oa foeltret "
+"pe ne oa ket ur skeudenn"
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Dizuit un dibab reizh. %(value)s n'emañ ket e-touez an dibaboù posupl."
+
+msgid "Enter a list of values."
+msgstr "Merkit ur roll talvoudoù"
+
+msgid "Enter a complete value."
+msgstr "Merkañ un talvoud klok"
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ""
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "Urzh"
+
+msgid "Delete"
+msgstr "Diverkañ"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Reizhit ar roadennoù e doubl e %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Reizhit ar roadennoù e doubl e %(field)s, na zle bezañ enni nemet talvoudoù "
+"dzho o-unan."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Reizhit ar roadennoù e doubl e %(field_name)s a rank bezañ ennañ talvodoù en "
+"o-unan evit lodenn %(lookup)s %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Reizhañ ar roadennoù e doubl zo a-is"
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Diuzit un dibab reizh. N'emañ ket an dibab-mañ e-touez ar re bosupl."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"N'eo ket bete komprenet an talvoud %(datetime)s er werzhid eur "
+"%(current_timezone)s; pe eo amjestr pe n'eus ket anezhañ."
+
+msgid "Clear"
+msgstr "Riñsañ"
+
+msgid "Currently"
+msgstr "Evit ar mare"
+
+msgid "Change"
+msgstr "Kemmañ"
+
+msgid "Unknown"
+msgstr "Dianav"
+
+msgid "Yes"
+msgstr "Ya"
+
+msgid "No"
+msgstr "Ket"
+
+msgid "yes,no,maybe"
+msgstr "ya, ket, marteze"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d okted"
+msgstr[1] "%(size)d okted"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "g.m."
+
+msgid "a.m."
+msgstr "mintin"
+
+msgid "PM"
+msgstr "G.M."
+
+msgid "AM"
+msgstr "Mintin"
+
+msgid "midnight"
+msgstr "hanternoz"
+
+msgid "noon"
+msgstr "kreisteiz"
+
+msgid "Monday"
+msgstr "Lun"
+
+msgid "Tuesday"
+msgstr "Meurzh"
+
+msgid "Wednesday"
+msgstr "Merc'her"
+
+msgid "Thursday"
+msgstr "Yaou"
+
+msgid "Friday"
+msgstr "Gwener"
+
+msgid "Saturday"
+msgstr "Sadorn"
+
+msgid "Sunday"
+msgstr "Sul"
+
+msgid "Mon"
+msgstr "Lun"
+
+msgid "Tue"
+msgstr "Meu"
+
+msgid "Wed"
+msgstr "Mer"
+
+msgid "Thu"
+msgstr "Yao"
+
+msgid "Fri"
+msgstr "Gwe"
+
+msgid "Sat"
+msgstr "Sad"
+
+msgid "Sun"
+msgstr "Sul"
+
+msgid "January"
+msgstr "Genver"
+
+msgid "February"
+msgstr "C'hwevrer"
+
+msgid "March"
+msgstr "Meurzh"
+
+msgid "April"
+msgstr "Ebrel"
+
+msgid "May"
+msgstr "Mae"
+
+msgid "June"
+msgstr "Mezheven"
+
+msgid "July"
+msgstr "Gouere"
+
+msgid "August"
+msgstr "Eost"
+
+msgid "September"
+msgstr "Gwengolo"
+
+msgid "October"
+msgstr "Here"
+
+msgid "November"
+msgstr "Du"
+
+msgid "December"
+msgstr "Kerzu"
+
+msgid "jan"
+msgstr "Gen"
+
+msgid "feb"
+msgstr "C'hwe"
+
+msgid "mar"
+msgstr "Meu"
+
+msgid "apr"
+msgstr "Ebr"
+
+msgid "may"
+msgstr "Mae"
+
+msgid "jun"
+msgstr "Mez"
+
+msgid "jul"
+msgstr "Gou"
+
+msgid "aug"
+msgstr "Eos"
+
+msgid "sep"
+msgstr "Gwe"
+
+msgid "oct"
+msgstr "Her"
+
+msgid "nov"
+msgstr "Du"
+
+msgid "dec"
+msgstr "Kzu"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Gen."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "C'hwe."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Meu."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Ebr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mae"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Mez."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Gou."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Eos."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Gwe."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Her."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Du"
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Kzu"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Genver"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "C'hwevrer"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Meurzh"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Ebrel"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mae"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Mezheven"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Gouere"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Eost"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Gwengolo"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Here"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Du"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Kerzu"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "pe"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ","
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d bloaz"
+msgstr[1] "%d bloaz"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d miz"
+msgstr[1] "%d miz"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d sizhun"
+msgstr[1] "%d sizhun"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d deiz"
+msgstr[1] "%d deiz"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d eur"
+msgstr[1] "%d eur"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d munud"
+msgstr[1] "%d munud"
+
+msgid "0 minutes"
+msgstr "0 munud"
+
+msgid "Forbidden"
+msgstr "Difennet"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "N'eus bet resisaet bloavezh ebet"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "N'eus bet resisaet miz ebet"
+
+msgid "No day specified"
+msgstr "N'eus bet resisaet deiz ebet"
+
+msgid "No week specified"
+msgstr "N'eus bet resisaet sizhun ebet"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "N'eus %(verbose_name_plural)s ebet da gaout."
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"En dazont ne vo ket a %(verbose_name_plural)s rak faos eo %(class_name)s."
+"allow_future."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Direizh eo ar furmad '%(format)s' evit an neudennad deiziad '%(datestr)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr ""
+"N'eus bet kavet traezenn %(verbose_name)s ebet o klotaén gant ar goulenn"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"N'eo ket 'last' ar bajenn na n'hall ket bezañ amdroet en un niver anterin."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr ""
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Roll goullo ha faos eo '%(class_name)s.allow_empty'."
+
+msgid "Directory indexes are not allowed here."
+msgstr "N'haller ket diskwel endalc'had ar c'havlec'h-mañ."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "N'eus ket eus \"%(path)s\""
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Meneger %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..57fec04
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po
new file mode 100644
index 0000000..967fd81
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po
@@ -0,0 +1,1211 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Filip Dupanović , 2011
+# Jannis Leidel , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Bosnian (http://www.transifex.com/django/django/language/"
+"bs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bs\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Afrikaans"
+msgstr ""
+
+msgid "Arabic"
+msgstr "arapski"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "Azerbejdžanski"
+
+msgid "Bulgarian"
+msgstr "bugarski"
+
+msgid "Belarusian"
+msgstr ""
+
+msgid "Bengali"
+msgstr "bengalski"
+
+msgid "Breton"
+msgstr ""
+
+msgid "Bosnian"
+msgstr "bosanski"
+
+msgid "Catalan"
+msgstr "katalonski"
+
+msgid "Czech"
+msgstr "češki"
+
+msgid "Welsh"
+msgstr "velški"
+
+msgid "Danish"
+msgstr "danski"
+
+msgid "German"
+msgstr "njemački"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "grčki"
+
+msgid "English"
+msgstr "engleski"
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr "Britanski engleski"
+
+msgid "Esperanto"
+msgstr ""
+
+msgid "Spanish"
+msgstr "španski"
+
+msgid "Argentinian Spanish"
+msgstr "Argentinski španski"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Meksički španski"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nikuaraganski španski"
+
+msgid "Venezuelan Spanish"
+msgstr ""
+
+msgid "Estonian"
+msgstr "estonski"
+
+msgid "Basque"
+msgstr "baskijski"
+
+msgid "Persian"
+msgstr "persijski"
+
+msgid "Finnish"
+msgstr "finski"
+
+msgid "French"
+msgstr "francuski"
+
+msgid "Frisian"
+msgstr "frišanski"
+
+msgid "Irish"
+msgstr "irski"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "galski"
+
+msgid "Hebrew"
+msgstr "hebrejski"
+
+msgid "Hindi"
+msgstr "hindi"
+
+msgid "Croatian"
+msgstr "hrvatski"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "mađarski"
+
+msgid "Interlingua"
+msgstr ""
+
+msgid "Indonesian"
+msgstr "Indonežanski"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "islandski"
+
+msgid "Italian"
+msgstr "italijanski"
+
+msgid "Japanese"
+msgstr "japanski"
+
+msgid "Georgian"
+msgstr "gruzijski"
+
+msgid "Kazakh"
+msgstr ""
+
+msgid "Khmer"
+msgstr "kambođanski"
+
+msgid "Kannada"
+msgstr "kanada"
+
+msgid "Korean"
+msgstr "korejski"
+
+msgid "Luxembourgish"
+msgstr ""
+
+msgid "Lithuanian"
+msgstr "litvanski"
+
+msgid "Latvian"
+msgstr "latvijski"
+
+msgid "Macedonian"
+msgstr "makedonski"
+
+msgid "Malayalam"
+msgstr "Malajalamski"
+
+msgid "Mongolian"
+msgstr "Mongolski"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr ""
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr ""
+
+msgid "Dutch"
+msgstr "holandski"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norveški novi"
+
+msgid "Ossetic"
+msgstr ""
+
+msgid "Punjabi"
+msgstr "Pandžabi"
+
+msgid "Polish"
+msgstr "poljski"
+
+msgid "Portuguese"
+msgstr "portugalski"
+
+msgid "Brazilian Portuguese"
+msgstr "brazilski portugalski"
+
+msgid "Romanian"
+msgstr "rumunski"
+
+msgid "Russian"
+msgstr "ruski"
+
+msgid "Slovak"
+msgstr "slovački"
+
+msgid "Slovenian"
+msgstr "slovenački"
+
+msgid "Albanian"
+msgstr "albanski"
+
+msgid "Serbian"
+msgstr "srpski"
+
+msgid "Serbian Latin"
+msgstr "srpski latinski"
+
+msgid "Swedish"
+msgstr "švedski"
+
+msgid "Swahili"
+msgstr ""
+
+msgid "Tamil"
+msgstr "tamilski"
+
+msgid "Telugu"
+msgstr "telugu"
+
+msgid "Thai"
+msgstr "tajlandski"
+
+msgid "Turkish"
+msgstr "turski"
+
+msgid "Tatar"
+msgstr ""
+
+msgid "Udmurt"
+msgstr ""
+
+msgid "Ukrainian"
+msgstr "ukrajinski"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "vijetnamežanski"
+
+msgid "Simplified Chinese"
+msgstr "novokineski"
+
+msgid "Traditional Chinese"
+msgstr "starokineski"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Unesite ispravnu vrijednost."
+
+msgid "Enter a valid URL."
+msgstr "Unesite ispravan URL."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr ""
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Unesite ispravan „slug“, koji se sastoji od slova, brojki, donjih crta ili "
+"crtica."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Unesite ispravnu IPv4 adresu."
+
+msgid "Enter a valid IPv6 address."
+msgstr ""
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr ""
+
+msgid "Enter only digits separated by commas."
+msgstr "Unesite samo brojke razdvojene zapetama."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Pobrinite se da je ova vrijednost %(limit_value)s (trenutno je "
+"%(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Ova vrijednost mora da bude manja ili jednaka %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Ova vrijednost mora biti veća ili jednaka %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "i"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "Ovo polje ne može ostati prazno."
+
+msgid "This field cannot be blank."
+msgstr "Ovo polje ne može biti prazno."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s sa ovom vrijednošću %(field_label)s već postoji."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Polje tipa: %(field_type)s"
+
+msgid "Integer"
+msgstr "Cijeo broj"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Big (8 bajtni) integer"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Bulova vrijednost (True ili False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (najviše %(max_length)s znakova)"
+
+msgid "Comma-separated integers"
+msgstr "Cijeli brojevi razdvojeni zapetama"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Datum (bez vremena)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Datum (sa vremenom)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Decimalni broj"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Email adresa"
+
+msgid "File path"
+msgstr "Putanja fajla"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Broj sa pokrenom zapetom"
+
+msgid "IPv4 address"
+msgstr ""
+
+msgid "IP address"
+msgstr "IP adresa"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Bulova vrijednost (True, False ili None)"
+
+msgid "Positive integer"
+msgstr ""
+
+msgid "Positive small integer"
+msgstr ""
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr ""
+
+msgid "Small integer"
+msgstr ""
+
+msgid "Text"
+msgstr "Tekst"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Vrijeme"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Image"
+msgstr ""
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Strani ključ (tip određen povezanim poljem)"
+
+msgid "One-to-one relationship"
+msgstr "Jedan-na-jedan odnos"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Više-na-više odsnos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ""
+
+msgid "This field is required."
+msgstr "Ovo polje se mora popuniti."
+
+msgid "Enter a whole number."
+msgstr "Unesite cijeo broj."
+
+msgid "Enter a number."
+msgstr "Unesite broj."
+
+msgid "Enter a valid date."
+msgstr "Unesite ispravan datum."
+
+msgid "Enter a valid time."
+msgstr "Unesite ispravno vrijeme"
+
+msgid "Enter a valid date/time."
+msgstr "Unesite ispravan datum/vrijeme."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Fajl nije prebačen. Provjerite tip enkodiranja formulara."
+
+msgid "No file was submitted."
+msgstr "Fajl nije prebačen."
+
+msgid "The submitted file is empty."
+msgstr "Prebačen fajl je prazan."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je "
+"oštećen."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"%(value)s nije među ponuđenim vrijednostima. Odaberite jednu od ponuđenih."
+
+msgid "Enter a list of values."
+msgstr "Unesite listu vrijednosti."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ""
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Order"
+msgstr "Redoslijed"
+
+msgid "Delete"
+msgstr "Obriši"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Ispravite dupli sadržaj za polja: %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Ispravite dupli sadržaj za polja: %(field)s, koji mora da bude jedinstven."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Ispravite dupli sadržaj za polja: %(field_name)s, koji mora da bude "
+"jedinstven za %(lookup)s u %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Ispravite duple vrijednosti dole."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Odabrana vrijednost nije među ponuđenima. Odaberite jednu od ponuđenih."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+
+msgid "Clear"
+msgstr "Očisti"
+
+msgid "Currently"
+msgstr "Trenutno"
+
+msgid "Change"
+msgstr "Izmjeni"
+
+msgid "Unknown"
+msgstr "Nepoznato"
+
+msgid "Yes"
+msgstr "Da"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "yes,no,maybe"
+msgstr "da,ne,možda"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "po p."
+
+msgid "a.m."
+msgstr "prije p."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "ponoć"
+
+msgid "noon"
+msgstr "podne"
+
+msgid "Monday"
+msgstr "ponedjeljak"
+
+msgid "Tuesday"
+msgstr "utorak"
+
+msgid "Wednesday"
+msgstr "srijeda"
+
+msgid "Thursday"
+msgstr "četvrtak"
+
+msgid "Friday"
+msgstr "petak"
+
+msgid "Saturday"
+msgstr "subota"
+
+msgid "Sunday"
+msgstr "nedjelja"
+
+msgid "Mon"
+msgstr "pon."
+
+msgid "Tue"
+msgstr "uto."
+
+msgid "Wed"
+msgstr "sri."
+
+msgid "Thu"
+msgstr "čet."
+
+msgid "Fri"
+msgstr "pet."
+
+msgid "Sat"
+msgstr "sub."
+
+msgid "Sun"
+msgstr "ned."
+
+msgid "January"
+msgstr "januar"
+
+msgid "February"
+msgstr "februar"
+
+msgid "March"
+msgstr "mart"
+
+msgid "April"
+msgstr "april"
+
+msgid "May"
+msgstr "maj"
+
+msgid "June"
+msgstr "juni"
+
+msgid "July"
+msgstr "juli"
+
+msgid "August"
+msgstr "august"
+
+msgid "September"
+msgstr "septembar"
+
+msgid "October"
+msgstr "oktobar"
+
+msgid "November"
+msgstr "novembar"
+
+msgid "December"
+msgstr "decembar"
+
+msgid "jan"
+msgstr "jan."
+
+msgid "feb"
+msgstr "feb."
+
+msgid "mar"
+msgstr "mar."
+
+msgid "apr"
+msgstr "apr."
+
+msgid "may"
+msgstr "maj."
+
+msgid "jun"
+msgstr "jun."
+
+msgid "jul"
+msgstr "jul."
+
+msgid "aug"
+msgstr "aug."
+
+msgid "sep"
+msgstr "sep."
+
+msgid "oct"
+msgstr "okt."
+
+msgid "nov"
+msgstr "nov."
+
+msgid "dec"
+msgstr "dec."
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Mart"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Maj"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Juni"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "juli"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "august"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "septembar"
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "oktobar"
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "novembar"
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "decembar"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "januar"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "februar"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "mart"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "april"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "maj"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "juni"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "juli"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "august"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "septembar"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "oktobar"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Novembar"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "decembar"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr ""
+
+msgid "or"
+msgstr "ili"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "0 minutes"
+msgstr ""
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "Godina nije naznačena"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Mjesec nije naznačen"
+
+msgid "No day specified"
+msgstr "Dan nije naznačen"
+
+msgid "No week specified"
+msgstr "Sedmica nije naznačena"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr ""
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr ""
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr ""
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr ""
+
+msgid "Directory indexes are not allowed here."
+msgstr ""
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr ""
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr ""
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..988d91c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..e453a62
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/formats.py
new file mode 100644
index 0000000..4018515
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/bs/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j. N Y.'
+TIME_FORMAT = 'G:i'
+DATETIME_FORMAT = 'j. N. Y. G:i T'
+YEAR_MONTH_FORMAT = 'F Y.'
+MONTH_DAY_FORMAT = 'j. F'
+SHORT_DATE_FORMAT = 'Y M j'
+# SHORT_DATETIME_FORMAT =
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6baaaa5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po
new file mode 100644
index 0000000..dae6fe8
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po
@@ -0,0 +1,1253 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Antoni Aloy , 2012,2015-2017
+# Carles Barrobés , 2011-2012,2014
+# duub qnnp, 2015
+# Jannis Leidel , 2011
+# Manuel Miranda , 2015
+# Roger Pons , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Catalan (http://www.transifex.com/django/django/language/"
+"ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikans"
+
+msgid "Arabic"
+msgstr "àrab"
+
+msgid "Asturian"
+msgstr "Asturià"
+
+msgid "Azerbaijani"
+msgstr "azerbaijanès"
+
+msgid "Bulgarian"
+msgstr "búlgar"
+
+msgid "Belarusian"
+msgstr "Bielorús"
+
+msgid "Bengali"
+msgstr "bengalí"
+
+msgid "Breton"
+msgstr "Bretó"
+
+msgid "Bosnian"
+msgstr "bosnià"
+
+msgid "Catalan"
+msgstr "català"
+
+msgid "Czech"
+msgstr "txec"
+
+msgid "Welsh"
+msgstr "gal·lès"
+
+msgid "Danish"
+msgstr "danès"
+
+msgid "German"
+msgstr "alemany"
+
+msgid "Lower Sorbian"
+msgstr "Lower Sorbian"
+
+msgid "Greek"
+msgstr "grec"
+
+msgid "English"
+msgstr "anglès"
+
+msgid "Australian English"
+msgstr "Anglès d'Austràlia"
+
+msgid "British English"
+msgstr "anglès britànic"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "espanyol"
+
+msgid "Argentinian Spanish"
+msgstr "castellà d'Argentina"
+
+msgid "Colombian Spanish"
+msgstr "Español de Colombia"
+
+msgid "Mexican Spanish"
+msgstr "espanyol de Mèxic"
+
+msgid "Nicaraguan Spanish"
+msgstr "castellà de Nicaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "Espanyol de Veneçuela"
+
+msgid "Estonian"
+msgstr "estonià"
+
+msgid "Basque"
+msgstr "euskera"
+
+msgid "Persian"
+msgstr "persa"
+
+msgid "Finnish"
+msgstr "finlandès"
+
+msgid "French"
+msgstr "francès"
+
+msgid "Frisian"
+msgstr "frisi"
+
+msgid "Irish"
+msgstr "irlandès"
+
+msgid "Scottish Gaelic"
+msgstr "Escocés Gaélico"
+
+msgid "Galician"
+msgstr "gallec"
+
+msgid "Hebrew"
+msgstr "hebreu"
+
+msgid "Hindi"
+msgstr "hindi"
+
+msgid "Croatian"
+msgstr "croat"
+
+msgid "Upper Sorbian"
+msgstr "Upper Sorbian"
+
+msgid "Hungarian"
+msgstr "hongarès"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "indonesi"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "islandès"
+
+msgid "Italian"
+msgstr "italià"
+
+msgid "Japanese"
+msgstr "japonès"
+
+msgid "Georgian"
+msgstr "georgià"
+
+msgid "Kazakh"
+msgstr "Kazakh"
+
+msgid "Khmer"
+msgstr "khmer"
+
+msgid "Kannada"
+msgstr "kannarès"
+
+msgid "Korean"
+msgstr "coreà"
+
+msgid "Luxembourgish"
+msgstr "Luxemburguès"
+
+msgid "Lithuanian"
+msgstr "lituà"
+
+msgid "Latvian"
+msgstr "letó"
+
+msgid "Macedonian"
+msgstr "macedoni"
+
+msgid "Malayalam"
+msgstr "malaiàlam "
+
+msgid "Mongolian"
+msgstr "mongol"
+
+msgid "Marathi"
+msgstr "Maratí"
+
+msgid "Burmese"
+msgstr "Burmès"
+
+msgid "Norwegian Bokmål"
+msgstr "Norwegian Bokmål"
+
+msgid "Nepali"
+msgstr "Nepalí"
+
+msgid "Dutch"
+msgstr "holandès"
+
+msgid "Norwegian Nynorsk"
+msgstr "noruec nynorsk"
+
+msgid "Ossetic"
+msgstr "Ossètic"
+
+msgid "Punjabi"
+msgstr "panjabi"
+
+msgid "Polish"
+msgstr "polonès"
+
+msgid "Portuguese"
+msgstr "portuguès"
+
+msgid "Brazilian Portuguese"
+msgstr "portuguès de brasil"
+
+msgid "Romanian"
+msgstr "romanès"
+
+msgid "Russian"
+msgstr "rus"
+
+msgid "Slovak"
+msgstr "eslovac"
+
+msgid "Slovenian"
+msgstr "eslovè"
+
+msgid "Albanian"
+msgstr "albanès"
+
+msgid "Serbian"
+msgstr "serbi"
+
+msgid "Serbian Latin"
+msgstr "serbi llatí"
+
+msgid "Swedish"
+msgstr "suec"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "tàmil"
+
+msgid "Telugu"
+msgstr "telugu"
+
+msgid "Thai"
+msgstr "tailandès"
+
+msgid "Turkish"
+msgstr "turc"
+
+msgid "Tatar"
+msgstr "Tatar"
+
+msgid "Udmurt"
+msgstr "Udmurt"
+
+msgid "Ukrainian"
+msgstr "ucraïnès"
+
+msgid "Urdu"
+msgstr "urdu"
+
+msgid "Vietnamese"
+msgstr "vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "xinès simplificat"
+
+msgid "Traditional Chinese"
+msgstr "xinès tradicional"
+
+msgid "Messages"
+msgstr "Missatges"
+
+msgid "Site Maps"
+msgstr "Mapes del lloc"
+
+msgid "Static Files"
+msgstr "Arxius estàtics"
+
+msgid "Syndication"
+msgstr "Sindicació"
+
+msgid "That page number is not an integer"
+msgstr "Aquesta plana no és un sencer"
+
+msgid "That page number is less than 1"
+msgstr "El nombre de plana és inferior a 1"
+
+msgid "That page contains no results"
+msgstr "La plana no conté cap resultat"
+
+msgid "Enter a valid value."
+msgstr "Introduïu un valor vàlid."
+
+msgid "Enter a valid URL."
+msgstr "Introduïu una URL vàlida."
+
+msgid "Enter a valid integer."
+msgstr "Introduïu un enter vàlid."
+
+msgid "Enter a valid email address."
+msgstr "Introdueix una adreça de correu electrònic vàlida"
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Introduïu un 'slug' vàlid, consistent en lletres, números, guions o guions "
+"baixos."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Introduïu un 'slug' vàlid format per lletres Unicode, números, guions o "
+"guions baixos."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Introduïu una adreça IPv4 vàlida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Entreu una adreça IPv6 vàlida."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Entreu una adreça IPv4 o IPv6 vàlida."
+
+msgid "Enter only digits separated by commas."
+msgstr "Introduïu només dígits separats per comes."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Assegureu-vos que el valor sigui %(limit_value)s (és %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+"Assegureu-vos que aquest valor sigui menor o igual que %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Assegureu-vos que aquest valor sigui més gran o igual que %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Assegureu-vos que aquest valor té almenys %(limit_value)d caràcter (en té "
+"%(show_value)d)."
+msgstr[1] ""
+"Assegureu-vos que aquest valor té almenys %(limit_value)d caràcters (en té "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Assegureu-vos que aquest valor té com a molt %(limit_value)d caràcter (en té "
+"%(show_value)d)."
+msgstr[1] ""
+"Assegureu-vos que aquest valor té com a molt %(limit_value)d caràcters (en "
+"té %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Assegureu-vos que no hi ha més de %(max)s dígit en total."
+msgstr[1] "Assegureu-vos que no hi ha més de %(max)s dígits en total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Assegureu-vos que no hi ha més de %(max)s decimal."
+msgstr[1] "Assegureu-vos que no hi ha més de %(max)s decimals."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Assegureu-vos que no hi ha més de %(max)s dígit abans de la coma decimal."
+msgstr[1] ""
+"Assegureu-vos que no hi ha més de %(max)s dígits abans de la coma decimal."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"L'extensió d'arxiu '%(extension)s' no es permesa. Les extensions permeses "
+"són: '%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "i"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "Ja existeix %(model_name)s amb aquest %(field_labels)s."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "El valor %(value)r no és una opció vàlida."
+
+msgid "This field cannot be null."
+msgstr "Aquest camp no pot ser nul."
+
+msgid "This field cannot be blank."
+msgstr "Aquest camp no pot estar en blanc."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Ja existeix %(model_name)s amb aquest %(field_label)s."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s ha de ser únic per a %(date_field_label)s i %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Camp del tipus: %(field_type)s"
+
+msgid "Integer"
+msgstr "Enter"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "El valor '%(value)s' ha de ser un nombre enter."
+
+msgid "Big (8 byte) integer"
+msgstr "Enter gran (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "El valor '%(value)s' ha de ser \"True\" o \"False\"."
+
+msgid "Boolean (Either True or False)"
+msgstr "Booleà (Cert o Fals)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (de fins a %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Enters separats per comes"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"El valor '%(value)s' no té un format de data vàlid. Ha de tenir el format "
+"YYYY-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"El valor '%(value)s' té el format correcte (YYYY-MM-DD) però no és una data "
+"vàlida."
+
+msgid "Date (without time)"
+msgstr "Data (sense hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"El valor '%(value)s' no té un format vàlid. Ha de tenir el format YYYY-MM-DD "
+"HH:MM[:ss[.uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"El valor '%(value)s' té el format correcte (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) però no és una data/hora vàlida."
+
+msgid "Date (with time)"
+msgstr "Data (amb hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "El valor '%(value)s' ha de ser un nombre decimal."
+
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"'El valor %(value)s' té un format invàlid. Ha d'estar en el format [DD] [HH:"
+"[MM:]]ss[.uuuuuu] ."
+
+msgid "Duration"
+msgstr "Durada"
+
+msgid "Email address"
+msgstr "Adreça de correu electrònic"
+
+msgid "File path"
+msgstr "Ruta del fitxer"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "El valor '%(value)s' ha de ser un número de coma flotant."
+
+msgid "Floating point number"
+msgstr "Número de coma flotant"
+
+msgid "IPv4 address"
+msgstr "Adreça IPv4"
+
+msgid "IP address"
+msgstr "Adreça IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "El valor '%(value)s' ha de ser None, True o False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleà (Cert, Fals o Cap ('None'))"
+
+msgid "Positive integer"
+msgstr "Enter positiu"
+
+msgid "Positive small integer"
+msgstr "Enter petit positiu"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (fins a %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Enter petit"
+
+msgid "Text"
+msgstr "Text"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"El valor '%(value)s' no té un format vàlid. Ha de tenir el format HH:MM[:ss[."
+"uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"El valor '%(value)s' té el format correcte (HH:MM[:ss[.uuuuuu]]) però no és "
+"una hora vàlida."
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Dades binàries"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' no és un UUID vàlid."
+
+msgid "File"
+msgstr "Arxiu"
+
+msgid "Image"
+msgstr "Imatge"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "La instància de %(model)s amb %(field)s %(value)r no existeix."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clau forana (tipus determinat pel camp relacionat)"
+
+msgid "One-to-one relationship"
+msgstr "Inter-relació un-a-un"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "relació %(from)s-%(to)s "
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "relacions %(from)s-%(to)s "
+
+msgid "Many-to-many relationship"
+msgstr "Inter-relació molts-a-molts"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Aquest camp és obligatori."
+
+msgid "Enter a whole number."
+msgstr "Introduïu un número sencer."
+
+msgid "Enter a number."
+msgstr "Introduïu un número."
+
+msgid "Enter a valid date."
+msgstr "Introduïu una data vàlida."
+
+msgid "Enter a valid time."
+msgstr "Introduïu una hora vàlida."
+
+msgid "Enter a valid date/time."
+msgstr "Introduïu una data/hora vàlides."
+
+msgid "Enter a valid duration."
+msgstr "Introdueixi una durada vàlida."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No s'ha enviat cap fitxer. Comproveu el tipus de codificació del formulari."
+
+msgid "No file was submitted."
+msgstr "No s'ha enviat cap fitxer."
+
+msgid "The submitted file is empty."
+msgstr "El fitxer enviat està buit."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Aquest nom d'arxiu hauria de tenir com a molt %(max)d caràcter (en té "
+"%(length)d)."
+msgstr[1] ""
+"Aquest nom d'arxiu hauria de tenir com a molt %(max)d caràcters (en té "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Si us plau, envieu un fitxer o marqueu la casella de selecció \"netejar\", "
+"no ambdós."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Carregueu una imatge vàlida. El fitxer que heu carregat no era una imatge o "
+"estava corrupte."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Esculliu una opció vàlida. %(value)s no és una de les opcions vàlides."
+
+msgid "Enter a list of values."
+msgstr "Introduïu una llista de valors."
+
+msgid "Enter a complete value."
+msgstr "Introduïu un valor complet."
+
+msgid "Enter a valid UUID."
+msgstr "Intrudueixi un UUID vàlid."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Camp ocult %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Falten dades de ManagementForm o s'ha manipulat"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Sisplau envieu com a molt %d formulari."
+msgstr[1] "Sisplau envieu com a molt %d formularis."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Sisplau envieu com a mínim %d formulari."
+msgstr[1] "Sisplau envieu com a mínim %d formularis."
+
+msgid "Order"
+msgstr "Ordre"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Si us plau, corregiu la dada duplicada per a %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Si us plau, corregiu la dada duplicada per a %(field)s, la qual ha de ser "
+"única."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Si us plau, corregiu la dada duplicada per a %(field_name)s, la qual ha de "
+"ser única per a %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Si us plau, corregiu els valors duplicats a sota."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Esculli una opció vàlida. Aquesta opció no és una de les opcions disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"No s'ha pogut interpretar %(datetime)s a la zona horària "
+"%(current_timezone)s; potser és ambigua o no existeix."
+
+msgid "Clear"
+msgstr "Netejar"
+
+msgid "Currently"
+msgstr "Actualment"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Unknown"
+msgstr "Desconegut"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "sí,no,potser"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "mitjanit"
+
+msgid "noon"
+msgstr "migdia"
+
+msgid "Monday"
+msgstr "Dilluns"
+
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgid "Thursday"
+msgstr "Dijous"
+
+msgid "Friday"
+msgstr "Divendres"
+
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgid "Mon"
+msgstr "dl."
+
+msgid "Tue"
+msgstr "dt."
+
+msgid "Wed"
+msgstr "dc."
+
+msgid "Thu"
+msgstr "dj."
+
+msgid "Fri"
+msgstr "dv."
+
+msgid "Sat"
+msgstr "ds."
+
+msgid "Sun"
+msgstr "dg."
+
+msgid "January"
+msgstr "gener"
+
+msgid "February"
+msgstr "febrer"
+
+msgid "March"
+msgstr "març"
+
+msgid "April"
+msgstr "abril"
+
+msgid "May"
+msgstr "maig"
+
+msgid "June"
+msgstr "juny"
+
+msgid "July"
+msgstr "juliol"
+
+msgid "August"
+msgstr "agost"
+
+msgid "September"
+msgstr "setembre"
+
+msgid "October"
+msgstr "octubre"
+
+msgid "November"
+msgstr "novembre"
+
+msgid "December"
+msgstr "desembre"
+
+msgid "jan"
+msgstr "gen."
+
+msgid "feb"
+msgstr "feb."
+
+msgid "mar"
+msgstr "març"
+
+msgid "apr"
+msgstr "abr."
+
+msgid "may"
+msgstr "maig"
+
+msgid "jun"
+msgstr "juny"
+
+msgid "jul"
+msgstr "jul."
+
+msgid "aug"
+msgstr "ago."
+
+msgid "sep"
+msgstr "set."
+
+msgid "oct"
+msgstr "oct."
+
+msgid "nov"
+msgstr "nov."
+
+msgid "dec"
+msgstr "des."
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "gen."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "mar."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "abr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "mai."
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "jun."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "jul."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "set."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "des."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "gener"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "febrer"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "març"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "maig"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "juny"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "juliol"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "agost"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "setembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "octubre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "novembre"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "desembre"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Aquesta no és una adreça IPv6 vàlida."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "o"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d any"
+msgstr[1] "%d anys"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d mesos"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d setmana"
+msgstr[1] "%d setmanes"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dia"
+msgstr[1] "%d dies"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d hores"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minuts"
+
+msgid "0 minutes"
+msgstr "0 minuts"
+
+msgid "Forbidden"
+msgstr "Prohibit"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "La verificació de CSRF ha fallat. Petició abortada."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Estàs veient aquest missatge perquè aquest lloc HTTPS requereix que el teu "
+"navegador enviï una capçalera 'Referer', i no n'ha arribada cap. Aquesta "
+"capçalera es requereix per motius de seguretat, per garantir que el teu "
+"navegador no està sent infiltrat per tercers."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Si has configurat el teu navegador per deshabilitar capçaleres 'Referer', "
+"sisplau torna-les a habilitar, com a mínim per a aquest lloc, o per a "
+"connexions HTTPs, o per a peticions amb el mateix orígen."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Estàs veient aquest missatge perquè aquest lloc requereix una galeta CSRF "
+"quan s'envien formularis. Aquesta galeta es requereix per motius de "
+"seguretat, per garantir que el teu navegador no està sent infiltrat per "
+"tercers."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Si has configurat el teu navegador per deshabilitar galetes, sisplau torna-"
+"les a habilitar, com a mínim per a aquest lloc, o per a peticions amb el "
+"mateix orígen."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Més informació disponible amb DEBUG=True."
+
+msgid "No year specified"
+msgstr "No s'ha especificat any"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "No s'ha especificat mes"
+
+msgid "No day specified"
+msgstr "No s'ha especificat dia"
+
+msgid "No week specified"
+msgstr "No s'ha especificat setmana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Cap %(verbose_name_plural)s disponible"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Futurs %(verbose_name_plural)s no disponibles perquè %(class_name)s."
+"allow_future és Fals."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Cadena invàlida de dats '%(datestr)s' donat el format '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No s'ha trobat sap %(verbose_name)s que coincideixi amb la petició"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "La pàgina no és 'last', ni es pot convertir en un enter"
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Pàgina invàlida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Llista buida i '%(class_name)s.allow_empty' és Fals."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Aquí no es permeten índexs de directori."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" no existeix"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Índex de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..6849dd0
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..af3e642
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/formats.py
new file mode 100644
index 0000000..baf4743
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ca/formats.py
@@ -0,0 +1,30 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = r'j \d\e F \d\e Y'
+TIME_FORMAT = 'G:i'
+DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\e\s G:i'
+YEAR_MONTH_FORMAT = r'F \d\e\l Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y G:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ # '31/12/2009', '31/12/09'
+ '%d/%m/%Y', '%d/%m/%y'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S',
+ '%d/%m/%Y %H:%M:%S.%f',
+ '%d/%m/%Y %H:%M',
+ '%d/%m/%y %H:%M:%S',
+ '%d/%m/%y %H:%M:%S.%f',
+ '%d/%m/%y %H:%M',
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..3d77721
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po
new file mode 100644
index 0000000..f408469
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po
@@ -0,0 +1,1272 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel , 2011
+# Jan Papež , 2012
+# Jirka Vejrazka , 2011
+# Tomáš Ehrlich , 2015
+# Vláďa Macek , 2012-2014
+# Vláďa Macek , 2015-2017
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 12:22+0000\n"
+"Last-Translator: Vláďa Macek \n"
+"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+msgid "Afrikaans"
+msgstr "afrikánsky"
+
+msgid "Arabic"
+msgstr "arabsky"
+
+msgid "Asturian"
+msgstr "Asturian"
+
+msgid "Azerbaijani"
+msgstr "Ázerbájdžánština"
+
+msgid "Bulgarian"
+msgstr "bulharsky"
+
+msgid "Belarusian"
+msgstr "bělorusky"
+
+msgid "Bengali"
+msgstr "bengálsky"
+
+msgid "Breton"
+msgstr "bretonsky"
+
+msgid "Bosnian"
+msgstr "bosensky"
+
+msgid "Catalan"
+msgstr "katalánsky"
+
+msgid "Czech"
+msgstr "česky"
+
+msgid "Welsh"
+msgstr "velšsky"
+
+msgid "Danish"
+msgstr "dánsky"
+
+msgid "German"
+msgstr "německy"
+
+msgid "Lower Sorbian"
+msgstr "Dolnolužická srbština"
+
+msgid "Greek"
+msgstr "řecky"
+
+msgid "English"
+msgstr "anglicky"
+
+msgid "Australian English"
+msgstr "australskou angličtinou"
+
+msgid "British English"
+msgstr "britskou angličtinou"
+
+msgid "Esperanto"
+msgstr "esperantsky"
+
+msgid "Spanish"
+msgstr "španělsky"
+
+msgid "Argentinian Spanish"
+msgstr "argentinskou španělštinou"
+
+msgid "Colombian Spanish"
+msgstr "kolumbijskou španělštinou"
+
+msgid "Mexican Spanish"
+msgstr "Mexická španělština"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nikaragujskou španělštinou"
+
+msgid "Venezuelan Spanish"
+msgstr "venezuelskou španělštinou"
+
+msgid "Estonian"
+msgstr "estonsky"
+
+msgid "Basque"
+msgstr "baskicky"
+
+msgid "Persian"
+msgstr "persky"
+
+msgid "Finnish"
+msgstr "finsky"
+
+msgid "French"
+msgstr "francouzsky"
+
+msgid "Frisian"
+msgstr "frísky"
+
+msgid "Irish"
+msgstr "irsky"
+
+msgid "Scottish Gaelic"
+msgstr "skotskou keltštinou"
+
+msgid "Galician"
+msgstr "galicijsky"
+
+msgid "Hebrew"
+msgstr "hebrejsky"
+
+msgid "Hindi"
+msgstr "hindsky"
+
+msgid "Croatian"
+msgstr "chorvatsky"
+
+msgid "Upper Sorbian"
+msgstr "Hornolužická srbština"
+
+msgid "Hungarian"
+msgstr "maďarsky"
+
+msgid "Interlingua"
+msgstr "interlingua"
+
+msgid "Indonesian"
+msgstr "indonésky"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "islandsky"
+
+msgid "Italian"
+msgstr "italsky"
+
+msgid "Japanese"
+msgstr "japonsky"
+
+msgid "Georgian"
+msgstr "gruzínsky"
+
+msgid "Kazakh"
+msgstr "kazašsky"
+
+msgid "Khmer"
+msgstr "khmersky"
+
+msgid "Kannada"
+msgstr "kannadsky"
+
+msgid "Korean"
+msgstr "korejsky"
+
+msgid "Luxembourgish"
+msgstr "lucembursky"
+
+msgid "Lithuanian"
+msgstr "litevsky"
+
+msgid "Latvian"
+msgstr "lotyšsky"
+
+msgid "Macedonian"
+msgstr "makedonsky"
+
+msgid "Malayalam"
+msgstr "malajálamsky"
+
+msgid "Mongolian"
+msgstr "mongolsky"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "barmštinou"
+
+msgid "Norwegian Bokmål"
+msgstr "Bokmål Norština"
+
+msgid "Nepali"
+msgstr "nepálsky"
+
+msgid "Dutch"
+msgstr "nizozemsky"
+
+msgid "Norwegian Nynorsk"
+msgstr "norsky (Nynorsk)"
+
+msgid "Ossetic"
+msgstr "osetštinou"
+
+msgid "Punjabi"
+msgstr "paňdžábsky"
+
+msgid "Polish"
+msgstr "polsky"
+
+msgid "Portuguese"
+msgstr "portugalsky"
+
+msgid "Brazilian Portuguese"
+msgstr "brazilskou portugalštinou"
+
+msgid "Romanian"
+msgstr "rumunsky"
+
+msgid "Russian"
+msgstr "rusky"
+
+msgid "Slovak"
+msgstr "slovensky"
+
+msgid "Slovenian"
+msgstr "slovinsky"
+
+msgid "Albanian"
+msgstr "albánsky"
+
+msgid "Serbian"
+msgstr "srbsky"
+
+msgid "Serbian Latin"
+msgstr "srbsky (latinkou)"
+
+msgid "Swedish"
+msgstr "švédsky"
+
+msgid "Swahili"
+msgstr "svahilsky"
+
+msgid "Tamil"
+msgstr "tamilsky"
+
+msgid "Telugu"
+msgstr "telužsky"
+
+msgid "Thai"
+msgstr "thajsky"
+
+msgid "Turkish"
+msgstr "turecky"
+
+msgid "Tatar"
+msgstr "tatarsky"
+
+msgid "Udmurt"
+msgstr "udmurtsky"
+
+msgid "Ukrainian"
+msgstr "ukrajinsky"
+
+msgid "Urdu"
+msgstr "Urdština"
+
+msgid "Vietnamese"
+msgstr "vietnamsky"
+
+msgid "Simplified Chinese"
+msgstr "čínsky (zjednodušeně)"
+
+msgid "Traditional Chinese"
+msgstr "čínsky (tradičně)"
+
+msgid "Messages"
+msgstr "Zprávy"
+
+msgid "Site Maps"
+msgstr "Mapy webu"
+
+msgid "Static Files"
+msgstr "Statické soubory"
+
+msgid "Syndication"
+msgstr "Syndikace"
+
+msgid "That page number is not an integer"
+msgstr "Číslo stránky není celé číslo."
+
+msgid "That page number is less than 1"
+msgstr "Číslo stránky je menší než 1"
+
+msgid "That page contains no results"
+msgstr "Stránka je bez výsledků"
+
+msgid "Enter a valid value."
+msgstr "Zadejte platnou hodnotu."
+
+msgid "Enter a valid URL."
+msgstr "Zadejte platnou adresu URL."
+
+msgid "Enter a valid integer."
+msgstr "Zadejte platné celé číslo."
+
+msgid "Enter a valid email address."
+msgstr "Zadejte platnou e-mailovou adresu."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Zadejte platný identifikátor složený pouze z písmen, čísel, podtržítek a "
+"pomlček."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Zadejte platný identifikátor složený pouze z písmen, čísel, podtržítek a "
+"pomlček typu Unicode."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Zadejte platnou adresu typu IPv4."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Zadejte platnou adresu typu IPv6."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Zadejte platnou adresu typu IPv4 nebo IPv6."
+
+msgid "Enter only digits separated by commas."
+msgstr "Zadejte pouze číslice oddělené čárkami."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Hodnota musí být %(limit_value)s (nyní je %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Hodnota musí být menší nebo rovna %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Hodnota musí být větší nebo rovna %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Tato hodnota má mít nejméně %(limit_value)d znak (nyní má %(show_value)d)."
+msgstr[1] ""
+"Tato hodnota má mít nejméně %(limit_value)d znaky (nyní má %(show_value)d)."
+msgstr[2] ""
+"Tato hodnota má mít nejméně %(limit_value)d znaků (nyní má %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Tato hodnota má mít nejvýše %(limit_value)d znak (nyní má %(show_value)d)."
+msgstr[1] ""
+"Tato hodnota má mít nejvýše %(limit_value)d znaky (nyní má %(show_value)d)."
+msgstr[2] ""
+"Tato hodnota má mít nejvýše %(limit_value)d znaků (nyní má %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslici."
+msgstr[1] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslice."
+msgstr[2] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslic."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Ujistěte se, že pole neobsahuje více než %(max)s desetinné místo."
+msgstr[1] "Ujistěte se, že pole neobsahuje více než %(max)s desetinná místa."
+msgstr[2] "Ujistěte se, že pole neobsahuje více než %(max)s desetinných míst."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Ujistěte se, že hodnota neobsahuje více než %(max)s místo před desetinnou "
+"čárkou (tečkou)."
+msgstr[1] ""
+"Ujistěte se, že hodnota neobsahuje více než %(max)s místa před desetinnou "
+"čárkou (tečkou)."
+msgstr[2] ""
+"Ujistěte se, že hodnota neobsahuje více než %(max)s míst před desetinnou "
+"čárkou (tečkou)."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Přípona souboru '%(extension)s' není povolena. Povolené jsou tyto: "
+"'%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "Nulové znaky nejsou povoleny."
+
+msgid "and"
+msgstr "a"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+"Položka %(model_name)s s touto kombinací hodnot v polích %(field_labels)s "
+"již existuje."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Hodnota %(value)r není platná možnost."
+
+msgid "This field cannot be null."
+msgstr "Pole nemůže být null."
+
+msgid "This field cannot be blank."
+msgstr "Pole nemůže být prázdné."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr ""
+"Položka %(model_name)s s touto hodnotou v poli %(field_label)s již existuje."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"Pole %(field_label)s musí být unikátní testem %(lookup_type)s pro pole "
+"%(date_field_label)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Pole typu: %(field_type)s"
+
+msgid "Integer"
+msgstr "Celé číslo"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "Hodnota '%(value)s' musí být celé číslo."
+
+msgid "Big (8 byte) integer"
+msgstr "Velké číslo (8 bajtů)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "Hodnota '%(value)s' musí být buď True nebo False."
+
+msgid "Boolean (Either True or False)"
+msgstr "Pravdivost (buď Ano (True), nebo Ne (False))"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Řetězec (max. %(max_length)s znaků)"
+
+msgid "Comma-separated integers"
+msgstr "Celá čísla oddělená čárkou"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr "Hodnota '%(value)s' není platné datum. Musí být ve tvaru RRRR-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Ačkoli hodnota '%(value)s' je ve správném tvaru (RRRR-MM-DD), jde o neplatné "
+"datum."
+
+msgid "Date (without time)"
+msgstr "Datum (bez času)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Hodnota '%(value)s' je v neplatném tvaru, který má být RRRR-MM-DD HH:MM[:SS[."
+"uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Ačkoli hodnota '%(value)s' je ve správném tvaru (RRRR-MM-DD HH:MM[:SS[."
+"uuuuuu]][TZ]), jde o neplatné datum a čas."
+
+msgid "Date (with time)"
+msgstr "Datum (s časem)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "Hodnota '%(value)s' musí být desítkové číslo."
+
+msgid "Decimal number"
+msgstr "Desetinné číslo"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"Hodnota '%(value)s' je v neplatném tvaru, který má být [DD] [HH:[MM:]]ss[."
+"uuuuuu]."
+
+msgid "Duration"
+msgstr "Doba trvání"
+
+msgid "Email address"
+msgstr "E-mailová adresa"
+
+msgid "File path"
+msgstr "Cesta k souboru"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "Hodnota '%(value)s' musí být reálné číslo."
+
+msgid "Floating point number"
+msgstr "Číslo s pohyblivou řádovou čárkou"
+
+msgid "IPv4 address"
+msgstr "Adresa IPv4"
+
+msgid "IP address"
+msgstr "Adresa IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Hodnota '%(value)s' musí být buď None, True nebo False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))"
+
+msgid "Positive integer"
+msgstr "Kladné celé číslo"
+
+msgid "Positive small integer"
+msgstr "Kladné malé celé číslo"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Identifikátor (nejvýše %(max_length)s znaků)"
+
+msgid "Small integer"
+msgstr "Malé celé číslo"
+
+msgid "Text"
+msgstr "Text"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Hodnota '%(value)s' je v neplatném tvaru, který má být HH:MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Ačkoli hodnota '%(value)s' je ve správném tvaru (HH:MM[:ss[.uuuuuu]]), jde o "
+"neplatný čas."
+
+msgid "Time"
+msgstr "Čas"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Přímá binární data"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "\"%(value)s\" není platná hodnota typu UUID."
+
+msgid "File"
+msgstr "Soubor"
+
+msgid "Image"
+msgstr "Obrázek"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+"Položka typu %(model)s s hodnotou %(field)s rovnou %(value)r neexistuje."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Cizí klíč (typ určen pomocí souvisejícího pole)"
+
+msgid "One-to-one relationship"
+msgstr "Vazba jedna-jedna"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "Vazba z %(from)s do %(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "Vazby z %(from)s do %(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Vazba mnoho-mnoho"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?!"
+
+msgid "This field is required."
+msgstr "Toto pole je třeba vyplnit."
+
+msgid "Enter a whole number."
+msgstr "Zadejte celé číslo."
+
+msgid "Enter a number."
+msgstr "Zadejte číslo."
+
+msgid "Enter a valid date."
+msgstr "Zadejte platné datum."
+
+msgid "Enter a valid time."
+msgstr "Zadejte platný čas."
+
+msgid "Enter a valid date/time."
+msgstr "Zadejte platné datum a čas."
+
+msgid "Enter a valid duration."
+msgstr "Zadejte platnou délku trvání."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře."
+
+msgid "No file was submitted."
+msgstr "Žádný soubor nebyl odeslán."
+
+msgid "The submitted file is empty."
+msgstr "Odeslaný soubor je prázdný."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Tento název souboru má mít nejvýše %(max)d znak (nyní má %(length)d)."
+msgstr[1] ""
+"Tento název souboru má mít nejvýše %(max)d znaky (nyní má %(length)d)."
+msgstr[2] ""
+"Tento název souboru má mít nejvýše %(max)d znaků (nyní má %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Musíte vybrat cestu k souboru nebo vymazat výběr, ne obojí."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Nahrajte platný obrázek. Odeslaný soubor buď nebyl obrázek nebo byl poškozen."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Vyberte platnou možnost, \"%(value)s\" není k dispozici."
+
+msgid "Enter a list of values."
+msgstr "Zadejte seznam hodnot."
+
+msgid "Enter a complete value."
+msgstr "Zadejte úplnou hodnotu."
+
+msgid "Enter a valid UUID."
+msgstr "Zadejte platné UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Skryté pole %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Data objektu ManagementForm chybí nebo byla pozměněna."
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Odešlete %d nebo méně formulářů."
+msgstr[1] "Odešlete %d nebo méně formulářů."
+msgstr[2] "Odešlete %d nebo méně formulářů."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Odešlete %d nebo více formulářů."
+msgstr[1] "Odešlete %d nebo více formulářů."
+msgstr[2] "Odešlete %d nebo více formulářů."
+
+msgid "Order"
+msgstr "Pořadí"
+
+msgid "Delete"
+msgstr "Odstranit"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Opravte duplicitní data v poli %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Opravte duplicitní data v poli %(field)s, které musí být unikátní."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Opravte duplicitní data v poli %(field_name)s, které musí být unikátní "
+"testem %(lookup)s pole %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Odstraňte duplicitní hodnoty níže."
+
+msgid "The inline value did not match the parent instance."
+msgstr "Hodnota typu inline neodpovídá rodičovské položce."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Vyberte platnou možnost. Tato není k dispozici."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" není platná hodnota."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"Hodnotu %(datetime)s nelze interpretovat v časové zóně %(current_timezone)s; "
+"může to být nejednoznačné nebo nemusí existovat."
+
+msgid "Clear"
+msgstr "Zrušit"
+
+msgid "Currently"
+msgstr "Aktuálně"
+
+msgid "Change"
+msgstr "Změnit"
+
+msgid "Unknown"
+msgstr "Neznámé"
+
+msgid "Yes"
+msgstr "Ano"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "yes,no,maybe"
+msgstr "ano, ne, možná"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajty"
+msgstr[2] "%(size)d bajtů"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "odp."
+
+msgid "a.m."
+msgstr "dop."
+
+msgid "PM"
+msgstr "odp."
+
+msgid "AM"
+msgstr "dop."
+
+msgid "midnight"
+msgstr "půlnoc"
+
+msgid "noon"
+msgstr "poledne"
+
+msgid "Monday"
+msgstr "pondělí"
+
+msgid "Tuesday"
+msgstr "úterý"
+
+msgid "Wednesday"
+msgstr "středa"
+
+msgid "Thursday"
+msgstr "čtvrtek"
+
+msgid "Friday"
+msgstr "pátek"
+
+msgid "Saturday"
+msgstr "sobota"
+
+msgid "Sunday"
+msgstr "neděle"
+
+msgid "Mon"
+msgstr "po"
+
+msgid "Tue"
+msgstr "út"
+
+msgid "Wed"
+msgstr "st"
+
+msgid "Thu"
+msgstr "čt"
+
+msgid "Fri"
+msgstr "pá"
+
+msgid "Sat"
+msgstr "so"
+
+msgid "Sun"
+msgstr "ne"
+
+msgid "January"
+msgstr "leden"
+
+msgid "February"
+msgstr "únor"
+
+msgid "March"
+msgstr "březen"
+
+msgid "April"
+msgstr "duben"
+
+msgid "May"
+msgstr "květen"
+
+msgid "June"
+msgstr "červen"
+
+msgid "July"
+msgstr "červenec"
+
+msgid "August"
+msgstr "srpen"
+
+msgid "September"
+msgstr "září"
+
+msgid "October"
+msgstr "říjen"
+
+msgid "November"
+msgstr "listopad"
+
+msgid "December"
+msgstr "prosinec"
+
+msgid "jan"
+msgstr "led"
+
+msgid "feb"
+msgstr "úno"
+
+msgid "mar"
+msgstr "bře"
+
+msgid "apr"
+msgstr "dub"
+
+msgid "may"
+msgstr "kvě"
+
+msgid "jun"
+msgstr "čen"
+
+msgid "jul"
+msgstr "čec"
+
+msgid "aug"
+msgstr "srp"
+
+msgid "sep"
+msgstr "zář"
+
+msgid "oct"
+msgstr "říj"
+
+msgid "nov"
+msgstr "lis"
+
+msgid "dec"
+msgstr "pro"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Led."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Úno."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Bře."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Dub."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Kvě."
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Čer."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Čec."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Srp."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Zář."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Říj."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Lis."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Pro."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "ledna"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "února"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "března"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "dubna"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "května"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "června"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "července"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "srpna"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "září"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "října"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "listopadu"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "prosince"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Toto není platná adresa typu IPv6."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "nebo"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d rok"
+msgstr[1] "%d roky"
+msgstr[2] "%d let"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d měsíc"
+msgstr[1] "%d měsíce"
+msgstr[2] "%d měsíců"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d týden"
+msgstr[1] "%d týdny"
+msgstr[2] "%d týdnů"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d den"
+msgstr[1] "%d dny"
+msgstr[2] "%d dní"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hodina"
+msgstr[1] "%d hodiny"
+msgstr[2] "%d hodin"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuta"
+msgstr[1] "%d minuty"
+msgstr[2] "%d minut"
+
+msgid "0 minutes"
+msgstr "0 minut"
+
+msgid "Forbidden"
+msgstr "Nepřístupné (Forbidden)"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Selhalo ověření typu CSRF. Požadavek byl zadržen."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Tato zpráva se zobrazuje, protože tento web na protokolu HTTPS požaduje "
+"záhlaví Referer od vašeho webového prohlížeče. Záhlaví je požadováno z "
+"bezpečnostních důvodů, aby se zajistilo, že vašeho prohlížeče se nezmocnil "
+"někdo další."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Pokud má váš prohlížeč záhlaví Referer vypnuté, žádáme vás o jeho zapnutí, "
+"alespoň pro tento web nebo pro spojení typu HTTPS nebo pro požadavky typu "
+"\"stejný původ\" (same origin)."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Pokud používáte značku nebo "
+"záhlaví 'Referrer-Policy: no-referrer', odeberte je. Ochrana typu CSRF "
+"vyžaduje, aby záhlaví zajišťovalo striktní hlídání refereru. Pokud je pro "
+"vás soukromí důležité, použije k odkazům na cizí weby alternativní možnosti "
+"jako například ."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Tato zpráva se zobrazuje, protože tento web při odesílání formulářů požaduje "
+"v souboru cookie údaj CSRF, a to z bezpečnostních důvodů, aby se zajistilo, "
+"že se vašeho prohlížeče nezmocnil někdo další."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Pokud má váš prohlížeč soubory cookie vypnuté, žádáme vás o jejich zapnutí, "
+"alespoň pro tento web nebo pro požadavky typu \"stejný původ\" (same origin)."
+
+msgid "More information is available with DEBUG=True."
+msgstr "V případě zapnutí volby DEBUG=True bude k dispozici více informací."
+
+msgid "No year specified"
+msgstr "Nebyl specifikován rok"
+
+msgid "Date out of range"
+msgstr "Datum je mimo rozsah"
+
+msgid "No month specified"
+msgstr "Nebyl specifikován měsíc"
+
+msgid "No day specified"
+msgstr "Nebyl specifikován den"
+
+msgid "No week specified"
+msgstr "Nebyl specifikován týden"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "%(verbose_name_plural)s nejsou k dispozici"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"%(verbose_name_plural)s s budoucím datem nejsou k dipozici protoze "
+"%(class_name)s.allow_future je False"
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Datum '%(datestr)s' neodpovídá formátu '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Nepodařilo se nalézt žádný objekt %(verbose_name)s"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Požadavek na stránku nemohl být konvertován na číslo, ani není 'last'"
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Neplatná stránka (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "List je prázdný a '%(class_name)s.allow_empty' je nastaveno na False"
+
+msgid "Directory indexes are not allowed here."
+msgstr "Indexy adresářů zde nejsou povoleny."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" neexistuje"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Index adresáře %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: Webový framework pro perfekcionisty, kteří mají termín"
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Zobrazit poznámky k vydání frameworku Django "
+"%(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Instalace proběhla úspěšně, gratulujeme!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Tuto zprávu vidíte, protože máte v nastavení Djanga zapnutý vývojový režim "
+"DEBUG=True a zatím nemáte "
+"nastavena žádná URL."
+
+msgid "Django Documentation"
+msgstr "Dokumentace frameworku Django"
+
+msgid "Topics, references, & how-to's"
+msgstr "Témata, odkazy & how-to"
+
+msgid "Tutorial: A Polling App"
+msgstr "Tutoriál: Hlasovací aplikace"
+
+msgid "Get started with Django"
+msgstr "Začínáme s frameworkem Django"
+
+msgid "Django Community"
+msgstr "Komunita kolem frameworku Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "Propojte se, získejte pomoc, podílejte se"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..ee5156f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..93a61f1
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/formats.py
new file mode 100644
index 0000000..ba4e3a1
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cs/formats.py
@@ -0,0 +1,42 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j. E Y'
+TIME_FORMAT = 'G:i'
+DATETIME_FORMAT = 'j. E Y G:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j. F'
+SHORT_DATE_FORMAT = 'd.m.Y'
+SHORT_DATETIME_FORMAT = 'd.m.Y G:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d.%m.%Y', '%d.%m.%y', # '05.01.2006', '05.01.06'
+ '%d. %m. %Y', '%d. %m. %y', # '5. 1. 2006', '5. 1. 06'
+ # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006'
+]
+# Kept ISO formats as one is in first position
+TIME_INPUT_FORMATS = [
+ '%H:%M:%S', # '04:30:59'
+ '%H.%M', # '04.30'
+ '%H:%M', # '04:30'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d.%m.%Y %H:%M:%S', # '05.01.2006 04:30:59'
+ '%d.%m.%Y %H:%M:%S.%f', # '05.01.2006 04:30:59.000200'
+ '%d.%m.%Y %H.%M', # '05.01.2006 04.30'
+ '%d.%m.%Y %H:%M', # '05.01.2006 04:30'
+ '%d.%m.%Y', # '05.01.2006'
+ '%d. %m. %Y %H:%M:%S', # '05. 01. 2006 04:30:59'
+ '%d. %m. %Y %H:%M:%S.%f', # '05. 01. 2006 04:30:59.000200'
+ '%d. %m. %Y %H.%M', # '05. 01. 2006 04.30'
+ '%d. %m. %Y %H:%M', # '05. 01. 2006 04:30'
+ '%d. %m. %Y', # '05. 01. 2006'
+ '%Y-%m-%d %H.%M', # '2006-01-05 04.30'
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..3cbe280
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po
new file mode 100644
index 0000000..38c1534
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po
@@ -0,0 +1,1274 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel , 2011
+# Maredudd ap Gwyndaf , 2012,2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: cy\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != "
+"11) ? 2 : 3;\n"
+
+msgid "Afrikaans"
+msgstr "Affricaneg"
+
+msgid "Arabic"
+msgstr "Arabeg"
+
+msgid "Asturian"
+msgstr "Astwrieg"
+
+msgid "Azerbaijani"
+msgstr "Azerbaijanaidd"
+
+msgid "Bulgarian"
+msgstr "Bwlgareg"
+
+msgid "Belarusian"
+msgstr "Belarwseg"
+
+msgid "Bengali"
+msgstr "Bengaleg"
+
+msgid "Breton"
+msgstr "Llydaweg"
+
+msgid "Bosnian"
+msgstr "Bosnieg"
+
+msgid "Catalan"
+msgstr "Catalaneg"
+
+msgid "Czech"
+msgstr "Tsieceg"
+
+msgid "Welsh"
+msgstr "Cymraeg"
+
+msgid "Danish"
+msgstr "Daneg"
+
+msgid "German"
+msgstr "Almaeneg"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Groegedd"
+
+msgid "English"
+msgstr "Saesneg"
+
+msgid "Australian English"
+msgstr "Saesneg Awstralia"
+
+msgid "British English"
+msgstr "Saesneg Prydain"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Sbaeneg"
+
+msgid "Argentinian Spanish"
+msgstr "Sbaeneg Ariannin"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Sbaeneg Mecsico"
+
+msgid "Nicaraguan Spanish"
+msgstr "Sbaeneg Nicaragwa"
+
+msgid "Venezuelan Spanish"
+msgstr "Sbaeneg Feneswela"
+
+msgid "Estonian"
+msgstr "Estoneg"
+
+msgid "Basque"
+msgstr "Basgeg"
+
+msgid "Persian"
+msgstr "Persieg"
+
+msgid "Finnish"
+msgstr "Ffinneg"
+
+msgid "French"
+msgstr "Ffrangeg"
+
+msgid "Frisian"
+msgstr "Ffrisieg"
+
+msgid "Irish"
+msgstr "Gwyddeleg"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Galisieg"
+
+msgid "Hebrew"
+msgstr "Hebraeg"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croasieg"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Hwngareg"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indoneseg"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandeg"
+
+msgid "Italian"
+msgstr "Eidaleg"
+
+msgid "Japanese"
+msgstr "Siapanëeg"
+
+msgid "Georgian"
+msgstr "Georgeg"
+
+msgid "Kazakh"
+msgstr "Casacstanaidd"
+
+msgid "Khmer"
+msgstr "Chmereg"
+
+msgid "Kannada"
+msgstr "Canadeg"
+
+msgid "Korean"
+msgstr "Corëeg"
+
+msgid "Luxembourgish"
+msgstr "Lwcsembergeg"
+
+msgid "Lithuanian"
+msgstr "Lithwaneg"
+
+msgid "Latvian"
+msgstr "Latfieg"
+
+msgid "Macedonian"
+msgstr "Macedoneg"
+
+msgid "Malayalam"
+msgstr "Malaialam"
+
+msgid "Mongolian"
+msgstr "Mongoleg"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "Byrmaneg"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Nepaleg"
+
+msgid "Dutch"
+msgstr "Iseldireg"
+
+msgid "Norwegian Nynorsk"
+msgstr "Ninorsk Norwyeg"
+
+msgid "Ossetic"
+msgstr "Osetieg"
+
+msgid "Punjabi"
+msgstr "Pwnjabi"
+
+msgid "Polish"
+msgstr "Pwyleg"
+
+msgid "Portuguese"
+msgstr "Portiwgaleg"
+
+msgid "Brazilian Portuguese"
+msgstr "Portiwgaleg Brasil"
+
+msgid "Romanian"
+msgstr "Romaneg"
+
+msgid "Russian"
+msgstr "Rwsieg"
+
+msgid "Slovak"
+msgstr "Slofaceg"
+
+msgid "Slovenian"
+msgstr "Slofeneg"
+
+msgid "Albanian"
+msgstr "Albaneg"
+
+msgid "Serbian"
+msgstr "Serbeg"
+
+msgid "Serbian Latin"
+msgstr "Lladin Serbiaidd"
+
+msgid "Swedish"
+msgstr "Swedeg"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telwgw"
+
+msgid "Thai"
+msgstr "Tai"
+
+msgid "Turkish"
+msgstr "Twrceg"
+
+msgid "Tatar"
+msgstr "Tatareg"
+
+msgid "Udmurt"
+msgstr "Wdmwrteg"
+
+msgid "Ukrainian"
+msgstr "Wcreineg"
+
+msgid "Urdu"
+msgstr "Wrdw"
+
+msgid "Vietnamese"
+msgstr "Fietnameg"
+
+msgid "Simplified Chinese"
+msgstr "Tsieinëeg Syml"
+
+msgid "Traditional Chinese"
+msgstr "Tseinëeg Traddodiadol"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr "Mapiau Safle"
+
+msgid "Static Files"
+msgstr "Ffeiliau Statig"
+
+msgid "Syndication"
+msgstr "Syndicetiad"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Rhowch werth dilys."
+
+msgid "Enter a valid URL."
+msgstr "Rhowch URL dilys."
+
+msgid "Enter a valid integer."
+msgstr "Rhowch gyfanrif dilys."
+
+msgid "Enter a valid email address."
+msgstr "Rhowch gyfeiriad ebost dilys."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Rhowch 'falwen' dilys yn cynnwys llythrennau, rhifau, tanlinellau neu "
+"cysylltnodau."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Rhowch gyfeiriad IPv4 dilys."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Rhowch gyfeiriad IPv6 dilys."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Rhowch gyfeiriad IPv4 neu IPv6 dilys."
+
+msgid "Enter only digits separated by commas."
+msgstr "Rhowch ddigidau wedi'i gwahanu gan gomas yn unig."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Sicrhewch taw y gwerth yw %(limit_value)s (%(show_value)s yw ar hyn o bryd)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Sicrhewch fod y gwerth hwn yn fwy neu'n llai na %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Sicrhewch fod y gwerth yn fwy na neu'n gyfartal â %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+msgstr[1] ""
+"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+msgstr[2] ""
+"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+msgstr[3] ""
+"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+msgstr[1] ""
+"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+msgstr[2] ""
+"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+msgstr[3] ""
+"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Sicrhewch nad oes mwy nag %(max)s digid i gyd."
+msgstr[1] "Sicrhewch nad oes mwy na %(max)s ddigid i gyd."
+msgstr[2] "Sicrhewch nad oes mwy na %(max)s digid i gyd."
+msgstr[3] "Sicrhewch nad oes mwy na %(max)s digid i gyd."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Sicrhewch nad oes mwy nag %(max)s lle degol."
+msgstr[1] "Sicrhewch nad oes mwy na %(max)s le degol."
+msgstr[2] "Sicrhewch nad oes mwy na %(max)s lle degol."
+msgstr[3] "Sicrhewch nad oes mwy na %(max)s lle degol."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "Sicrhewch nad oes mwy nag %(max)s digid cyn y pwynt degol."
+msgstr[1] "Sicrhewch nad oes mwy na %(max)s ddigid cyn y pwynt degol."
+msgstr[2] "Sicrhewch nad oes mwy na %(max)s digid cyn y pwynt degol."
+msgstr[3] "Sicrhewch nad oes mwy na %(max)s digid cyn y pwynt degol."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "a"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "Mae %(model_name)s gyda'r %(field_labels)s hyn yn bodoli'n barod."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Nid yw gwerth %(value)r yn ddewis dilys."
+
+msgid "This field cannot be null."
+msgstr "Ni all y maes hwn fod yn 'null'."
+
+msgid "This field cannot be blank."
+msgstr "Ni all y maes hwn fod yn wag."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Mae %(model_name)s gyda'r %(field_label)s hwn yn bodoli'n barod."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Maes o fath: %(field_type)s"
+
+msgid "Integer"
+msgstr "cyfanrif"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "Rhaid i'r gwerth '%(value)s' fod yn gyfanrif."
+
+msgid "Big (8 byte) integer"
+msgstr "Cyfanrif mawr (8 beit)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "Rhaid i werth '%(value)s' for unai'n True neu False."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boleaidd (Unai True neu False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (hyd at %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Cyfanrifau wedi'u gwahanu gan gomas"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"Mae gan werth '%(value)s' fformat dyddiad annilys. Rhaid iddo fod yn y "
+"fformat BBBB-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Mae'r gwerth '%(value)s' yn y fformat cywir (BBBB-MM-DD) ond mae'r dyddiad "
+"yn annilys"
+
+msgid "Date (without time)"
+msgstr "Dyddiad (heb amser)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Mae '%(value)s' mewn fformat annilys. Rhaid iddo fod yn y fformat BBBB-MM-DD "
+"AA:MM[:ee[.uuuuuu]][CA]"
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Mae '%(value)s' yn y fformat cywir (BBBB-MM-DD AA:MM[:ee[.uuuuuu]][CA]) on "
+"mae'n ddyddiad/amser annilys."
+
+msgid "Date (with time)"
+msgstr "Dyddiad (gydag amser)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "Rhaid i '%(value)s' fod yn ddegolyn."
+
+msgid "Decimal number"
+msgstr "Rhif degol"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Cyfeiriad ebost"
+
+msgid "File path"
+msgstr "Llwybr ffeil"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "Rhaid i '%(value)s' fod yn rif pwynt arnawf."
+
+msgid "Floating point number"
+msgstr "Rhif pwynt symudol"
+
+msgid "IPv4 address"
+msgstr "Cyfeiriad IPv4"
+
+msgid "IP address"
+msgstr "cyfeiriad IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Rhaid i '%(value)s' gael y gwerth None, True neu False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boleaidd (Naill ai True, False neu None)"
+
+msgid "Positive integer"
+msgstr "Cyfanrif positif"
+
+msgid "Positive small integer"
+msgstr "Cyfanrif bach positif"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Malwen (hyd at %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Cyfanrif bach"
+
+msgid "Text"
+msgstr "Testun"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Mae gan y gwerth '%(value)s' fformat annilys. Rhaid iddo fod yn y fformat AA:"
+"MM[:ee[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Mae'r gwerth '%(value)s' yn y fformat cywir AA:MM[:ee[.uuuuuu]] ond mae'r "
+"amser yn annilys."
+
+msgid "Time"
+msgstr "Amser"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Data deuol crai"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "Ffeil"
+
+msgid "Image"
+msgstr "Delwedd"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Allwedd Estron (math yn ddibynol ar y maes cysylltiedig)"
+
+msgid "One-to-one relationship"
+msgstr "Perthynas un-i-un"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Perthynas llawer-i-lawer"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Mae angen y maes hwn."
+
+msgid "Enter a whole number."
+msgstr "Rhowch cyfanrif."
+
+msgid "Enter a number."
+msgstr "Rhowch rif."
+
+msgid "Enter a valid date."
+msgstr "Rhif ddyddiad dilys."
+
+msgid "Enter a valid time."
+msgstr "Rhowch amser dilys."
+
+msgid "Enter a valid date/time."
+msgstr "Rhowch ddyddiad/amser dilys."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ni anfonwyd ffeil. Gwiriwch math yr amgodiad ar y ffurflen."
+
+msgid "No file was submitted."
+msgstr "Ni anfonwyd ffeil."
+
+msgid "The submitted file is empty."
+msgstr "Mae'r ffeil yn wag."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)."
+msgstr[1] ""
+"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)."
+msgstr[2] ""
+"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)."
+msgstr[3] ""
+"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Nail ai cyflwynwych ffeil neu dewisiwch y blwch gwiriad, ond nid y ddau."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Llwythwch ddelwedd dilys. Doedd y ddelwedd a lwythwyd ddim yn ddelwedd "
+"dilys, neu roedd yn ddelwedd llygredig."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Dewiswch ddewisiad dilys. Nid yw %(value)s yn un o'r dewisiadau sydd ar gael."
+
+msgid "Enter a list of values."
+msgstr "Rhowch restr o werthoedd."
+
+msgid "Enter a complete value."
+msgstr "Rhowch werth cyflawn."
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Maes cudd %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Mae data ManagementForm ar goll neu mae rhywun wedi ymyrryd ynddo"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Cyflwynwch %d neu lai o ffurflenni."
+msgstr[1] "Cyflwynwch %d neu lai o ffurflenni."
+msgstr[2] "Cyflwynwch %d neu lai o ffurflenni."
+msgstr[3] "Cyflwynwch %d neu lai o ffurflenni."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Cyflwynwch %d neu fwy o ffurflenni."
+msgstr[1] "Cyflwynwch %d neu fwy o ffurflenni."
+msgstr[2] "Cyflwynwch %d neu fwy o ffurflenni."
+msgstr[3] "Cyflwynwch %d neu fwy o ffurflenni."
+
+msgid "Order"
+msgstr "Trefn"
+
+msgid "Delete"
+msgstr "Dileu"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Cywirwch y data dyblyg ar gyfer %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Cywirwch y data dyblyg ar gyfer %(field)s, sydd yn gorfod bod yn unigryw."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Cywirwch y data dyblyg ar gyfer %(field_name)s sydd yn gorfod bod yn unigryw "
+"ar gyfer %(lookup)s yn %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Cywirwch y gwerthoedd dyblyg isod."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Dewiswch ddewisiad dilys. Nid yw'r dewisiad yn un o'r dewisiadau sydd ar "
+"gael."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"Ni ellir dehongli %(datetime)s yn y gylchfa amser %(current_timezone)s; "
+"mae'n amwys neu ddim yn bodoli."
+
+msgid "Clear"
+msgstr "Clirio"
+
+msgid "Currently"
+msgstr "Ar hyn o bryd"
+
+msgid "Change"
+msgstr "Newid"
+
+msgid "Unknown"
+msgstr "Anhysbys"
+
+msgid "Yes"
+msgstr "Ie"
+
+msgid "No"
+msgstr "Na"
+
+msgid "yes,no,maybe"
+msgstr "ie,na,efallai"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d beit"
+msgstr[1] "%(size)d beit"
+msgstr[2] "%(size)d beit"
+msgstr[3] "%(size)d beit"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "y.h."
+
+msgid "a.m."
+msgstr "y.b."
+
+msgid "PM"
+msgstr "YH"
+
+msgid "AM"
+msgstr "YB"
+
+msgid "midnight"
+msgstr "canol nos"
+
+msgid "noon"
+msgstr "canol dydd"
+
+msgid "Monday"
+msgstr "Dydd Llun"
+
+msgid "Tuesday"
+msgstr "Dydd Mawrth"
+
+msgid "Wednesday"
+msgstr "Dydd Mercher"
+
+msgid "Thursday"
+msgstr "Dydd Iau"
+
+msgid "Friday"
+msgstr "Dydd Gwener"
+
+msgid "Saturday"
+msgstr "Dydd Sadwrn"
+
+msgid "Sunday"
+msgstr "Dydd Sul"
+
+msgid "Mon"
+msgstr "Llu"
+
+msgid "Tue"
+msgstr "Maw"
+
+msgid "Wed"
+msgstr "Mer"
+
+msgid "Thu"
+msgstr "Iau"
+
+msgid "Fri"
+msgstr "Gwe"
+
+msgid "Sat"
+msgstr "Sad"
+
+msgid "Sun"
+msgstr "Sul"
+
+msgid "January"
+msgstr "Ionawr"
+
+msgid "February"
+msgstr "Chwefror"
+
+msgid "March"
+msgstr "Mawrth"
+
+msgid "April"
+msgstr "Ebrill"
+
+msgid "May"
+msgstr "Mai"
+
+msgid "June"
+msgstr "Mehefin"
+
+msgid "July"
+msgstr "Gorffenaf"
+
+msgid "August"
+msgstr "Awst"
+
+msgid "September"
+msgstr "Medi"
+
+msgid "October"
+msgstr "Hydref"
+
+msgid "November"
+msgstr "Tachwedd"
+
+msgid "December"
+msgstr "Rhagfyr"
+
+msgid "jan"
+msgstr "ion"
+
+msgid "feb"
+msgstr "chw"
+
+msgid "mar"
+msgstr "maw"
+
+msgid "apr"
+msgstr "ebr"
+
+msgid "may"
+msgstr "mai"
+
+msgid "jun"
+msgstr "meh"
+
+msgid "jul"
+msgstr "gor"
+
+msgid "aug"
+msgstr "aws"
+
+msgid "sep"
+msgstr "med"
+
+msgid "oct"
+msgstr "hyd"
+
+msgid "nov"
+msgstr "tach"
+
+msgid "dec"
+msgstr "rhag"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ion."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Chwe."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Mawrth"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Ebrill"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mai"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Meh."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Gorff."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Awst"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Medi"
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Hydr."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Tach."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Rhag."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Ionawr"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Chwefror"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Mawrth"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Ebrill"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mai"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Mehefin"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Gorffenaf"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Awst"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Medi"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Hydref"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Tachwedd"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Rhagfyr"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Nid yw hwn yn gyfeiriad IPv6 dilys."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "neu"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ","
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d blwyddyn"
+msgstr[1] "%d flynedd"
+msgstr[2] "%d blwyddyn"
+msgstr[3] "%d blwyddyn"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mis"
+msgstr[1] "%d fis"
+msgstr[2] "%d mis"
+msgstr[3] "%d mis"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d wythnos"
+msgstr[1] "%d wythnos"
+msgstr[2] "%d wythnos"
+msgstr[3] "%d wythnos"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d diwrnod"
+msgstr[1] "%d ddiwrnod"
+msgstr[2] "%d diwrnod"
+msgstr[3] "%d diwrnod"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d awr"
+msgstr[1] "%d awr"
+msgstr[2] "%d awr"
+msgstr[3] "%d awr"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d munud"
+msgstr[1] "%d funud"
+msgstr[2] "%d munud"
+msgstr[3] "%d munud"
+
+msgid "0 minutes"
+msgstr "0 munud"
+
+msgid "Forbidden"
+msgstr "Gwaharddedig"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Gwirio CSRF wedi methu. Ataliwyd y cais."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Rydych yn gweld y neges hwn can fod y safle HTTPS hwn angen 'Referer header' "
+"i gael ei anfon gan ei porwr, ond ni anfonwyd un. Mae angen y pennyn hwn ar "
+"mwyn diogelwch, i sicrhau na herwgipiwyd eich porwr gan trydydd parti."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Os ydych wedi analluogi pennynau 'Referer' yn eich porwr yn galluogwch nhw, "
+"oleiaf ar gyfer y safle hwn neu ar gyfer cysylltiadau HTTPS neu ar gyfer "
+"ceisiadau 'same-origin'."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Dangosir y neges hwn oherwydd bod angen cwci CSRF ar y safle hwn pan yn "
+"anfon ffurflenni. Mae angen y cwci ar gyfer diogelwch er mwyn sicrhau nad "
+"oes trydydd parti yn herwgipio eich porwr."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Os ydych wedi analluogi cwcis, galluogwch nhw, oleiaf i'r safle hwn neu "
+"ceisiadau 'same-origin'."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Mae mwy o wybodaeth ar gael gyda DEBUG=True"
+
+msgid "No year specified"
+msgstr "Dim blwyddyn wedi’i bennu"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Dim mis wedi’i bennu"
+
+msgid "No day specified"
+msgstr "Dim diwrnod wedi’i bennu"
+
+msgid "No week specified"
+msgstr "Dim wythnos wedi’i bennu"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Dim %(verbose_name_plural)s ar gael"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"%(verbose_name_plural)s i'r dyfodol ddim ar gael oherwydd mae %(class_name)s."
+"allow_future yn 'False'. "
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Rhoddwyd y fformat '%(format)s' i'r llynyn dyddiad annilys '%(datestr)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Ni ganfuwyd %(verbose_name)s yn cydweddu â'r ymholiad"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Nid yw'r dudalen yn 'last', ac ni ellir ei drosi i int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Tudalen annilys (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Rhestr wag a '%(class_name)s.allow_empty' yn False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Ni ganiateir mynegai cyfeiriaduron yma."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "Nid yw \"%(path)s\" yn bodoli"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Mynegai %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..d1def0c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..9029ef5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/formats.py
new file mode 100644
index 0000000..031a40f
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/cy/formats.py
@@ -0,0 +1,35 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F Y' # '25 Hydref 2006'
+TIME_FORMAT = 'P' # '2:30 y.b.'
+DATETIME_FORMAT = 'j F Y, P' # '25 Hydref 2006, 2:30 y.b.'
+YEAR_MONTH_FORMAT = 'F Y' # 'Hydref 2006'
+MONTH_DAY_FORMAT = 'j F' # '25 Hydref'
+SHORT_DATE_FORMAT = 'd/m/Y' # '25/10/2006'
+SHORT_DATETIME_FORMAT = 'd/m/Y P' # '25/10/2006 2:30 y.b.'
+FIRST_DAY_OF_WEEK = 1 # 'Dydd Llun'
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06'
+]
+DATETIME_INPUT_FORMATS = [
+ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
+ '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
+ '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
+ '%Y-%m-%d', # '2006-10-25'
+ '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59'
+ '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200'
+ '%d/%m/%Y %H:%M', # '25/10/2006 14:30'
+ '%d/%m/%Y', # '25/10/2006'
+ '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59'
+ '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200'
+ '%d/%m/%y %H:%M', # '25/10/06 14:30'
+ '%d/%m/%y', # '25/10/06'
+]
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..13b833e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.po
new file mode 100644
index 0000000..6e64df1
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.po
@@ -0,0 +1,1250 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Christian Joergensen , 2012
+# Danni Randeris , 2014
+# Erik Wognsen , 2013-2017
+# Finn Gruwier Larsen, 2011
+# Jannis Leidel , 2011
+# jonaskoelker , 2012
+# Mads Chr. Olesen , 2013
+# valberg , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-21 20:41+0000\n"
+"Last-Translator: Erik Wognsen \n"
+"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "afrikaans"
+
+msgid "Arabic"
+msgstr "arabisk"
+
+msgid "Asturian"
+msgstr "Asturisk"
+
+msgid "Azerbaijani"
+msgstr "azerbaidjansk"
+
+msgid "Bulgarian"
+msgstr "bulgarsk"
+
+msgid "Belarusian"
+msgstr "hviderussisk"
+
+msgid "Bengali"
+msgstr "bengalsk"
+
+msgid "Breton"
+msgstr "bretonsk"
+
+msgid "Bosnian"
+msgstr "bosnisk"
+
+msgid "Catalan"
+msgstr "catalansk"
+
+msgid "Czech"
+msgstr "tjekkisk"
+
+msgid "Welsh"
+msgstr "walisisk"
+
+msgid "Danish"
+msgstr "dansk"
+
+msgid "German"
+msgstr "tysk"
+
+msgid "Lower Sorbian"
+msgstr "nedresorbisk"
+
+msgid "Greek"
+msgstr "græsk"
+
+msgid "English"
+msgstr "engelsk"
+
+msgid "Australian English"
+msgstr "australsk engelsk"
+
+msgid "British English"
+msgstr "britisk engelsk"
+
+msgid "Esperanto"
+msgstr "esperanto"
+
+msgid "Spanish"
+msgstr "spansk"
+
+msgid "Argentinian Spanish"
+msgstr "argentinsk spansk"
+
+msgid "Colombian Spanish"
+msgstr "colombiansk spansk"
+
+msgid "Mexican Spanish"
+msgstr "mexikansk spansk"
+
+msgid "Nicaraguan Spanish"
+msgstr "nicaraguansk spansk"
+
+msgid "Venezuelan Spanish"
+msgstr "venezuelansk spansk"
+
+msgid "Estonian"
+msgstr "estisk"
+
+msgid "Basque"
+msgstr "baskisk"
+
+msgid "Persian"
+msgstr "persisk"
+
+msgid "Finnish"
+msgstr "finsk"
+
+msgid "French"
+msgstr "fransk"
+
+msgid "Frisian"
+msgstr "frisisk"
+
+msgid "Irish"
+msgstr "irsk"
+
+msgid "Scottish Gaelic"
+msgstr "skotsk gælisk"
+
+msgid "Galician"
+msgstr "galicisk"
+
+msgid "Hebrew"
+msgstr "hebraisk"
+
+msgid "Hindi"
+msgstr "hindi"
+
+msgid "Croatian"
+msgstr "kroatisk"
+
+msgid "Upper Sorbian"
+msgstr "øvresorbisk"
+
+msgid "Hungarian"
+msgstr "ungarsk"
+
+msgid "Interlingua"
+msgstr "interlingua"
+
+msgid "Indonesian"
+msgstr "indonesisk"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "islandsk"
+
+msgid "Italian"
+msgstr "italiensk"
+
+msgid "Japanese"
+msgstr "japansk"
+
+msgid "Georgian"
+msgstr "georgisk"
+
+msgid "Kazakh"
+msgstr "kasakhisk"
+
+msgid "Khmer"
+msgstr "khmer"
+
+msgid "Kannada"
+msgstr "kannada"
+
+msgid "Korean"
+msgstr "koreansk"
+
+msgid "Luxembourgish"
+msgstr "luxembourgisk"
+
+msgid "Lithuanian"
+msgstr "litauisk"
+
+msgid "Latvian"
+msgstr "lettisk"
+
+msgid "Macedonian"
+msgstr "makedonsk"
+
+msgid "Malayalam"
+msgstr "malaysisk"
+
+msgid "Mongolian"
+msgstr "mongolsk"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "burmesisk"
+
+msgid "Norwegian Bokmål"
+msgstr "norsk bokmål"
+
+msgid "Nepali"
+msgstr "nepalesisk"
+
+msgid "Dutch"
+msgstr "hollandsk"
+
+msgid "Norwegian Nynorsk"
+msgstr "norsk nynorsk"
+
+msgid "Ossetic"
+msgstr "ossetisk"
+
+msgid "Punjabi"
+msgstr "punjabi"
+
+msgid "Polish"
+msgstr "polsk"
+
+msgid "Portuguese"
+msgstr "portugisisk"
+
+msgid "Brazilian Portuguese"
+msgstr "brasiliansk portugisisk"
+
+msgid "Romanian"
+msgstr "rumænsk"
+
+msgid "Russian"
+msgstr "russisk"
+
+msgid "Slovak"
+msgstr "slovakisk"
+
+msgid "Slovenian"
+msgstr "slovensk"
+
+msgid "Albanian"
+msgstr "albansk"
+
+msgid "Serbian"
+msgstr "serbisk"
+
+msgid "Serbian Latin"
+msgstr "serbisk (latin)"
+
+msgid "Swedish"
+msgstr "svensk"
+
+msgid "Swahili"
+msgstr "swahili"
+
+msgid "Tamil"
+msgstr "tamil"
+
+msgid "Telugu"
+msgstr "telugu"
+
+msgid "Thai"
+msgstr "thai"
+
+msgid "Turkish"
+msgstr "tyrkisk"
+
+msgid "Tatar"
+msgstr "tatarisk"
+
+msgid "Udmurt"
+msgstr "udmurtisk"
+
+msgid "Ukrainian"
+msgstr "ukrainsk"
+
+msgid "Urdu"
+msgstr "urdu"
+
+msgid "Vietnamese"
+msgstr "vietnamesisk"
+
+msgid "Simplified Chinese"
+msgstr "forenklet kinesisk"
+
+msgid "Traditional Chinese"
+msgstr "traditionelt kinesisk"
+
+msgid "Messages"
+msgstr "Meddelelser"
+
+msgid "Site Maps"
+msgstr "Site Maps"
+
+msgid "Static Files"
+msgstr "Static Files"
+
+msgid "Syndication"
+msgstr "Syndication"
+
+msgid "That page number is not an integer"
+msgstr "Det sidetal er ikke et heltal"
+
+msgid "That page number is less than 1"
+msgstr "Det sidetal er mindre end 1"
+
+msgid "That page contains no results"
+msgstr "Den side indeholder ingen resultater"
+
+msgid "Enter a valid value."
+msgstr "Indtast en gyldig værdi."
+
+msgid "Enter a valid URL."
+msgstr "Indtast en gyldig URL."
+
+msgid "Enter a valid integer."
+msgstr "Indtast et gyldigt heltal."
+
+msgid "Enter a valid email address."
+msgstr "Indtast en gyldig e-mail-adresse."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Indtast en \"slug\" bestående af bogstaver, cifre, understreger og "
+"bindestreger."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Indtast en \"slug\" bestående af bogstaver, cifre, understreger og "
+"bindestreger."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Indtast en gyldig IPv4-adresse."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Indtast en gyldig IPv6-adresse."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Indtast en gyldig IPv4- eller IPv6-adresse."
+
+msgid "Enter only digits separated by commas."
+msgstr "Indtast kun cifre adskilt af kommaer."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Denne værdi skal være %(limit_value)s (den er %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Denne værdi skal være mindre end eller lig %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Denne værdi skal være større end eller lig %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Denne værdi skal have mindst %(limit_value)d tegn (den har %(show_value)d)."
+msgstr[1] ""
+"Denne værdi skal have mindst %(limit_value)d tegn (den har %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Denne værdi må højst have %(limit_value)d tegn (den har %(show_value)d)."
+msgstr[1] ""
+"Denne værdi må højst have %(limit_value)d tegn (den har %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Der må maksimalt være %(max)s ciffer i alt."
+msgstr[1] "Der må maksimalt være %(max)s cifre i alt."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Der må maksimalt være %(max)s decimal."
+msgstr[1] "Der må maksimalt være %(max)s decimaler."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "Der må maksimalt være %(max)s ciffer før kommaet."
+msgstr[1] "Der må maksimalt være %(max)s cifre før kommaet."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Filendelse '%(extension)s' er ikke tilladt. Tilladte filendelser er: "
+"'%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "Null-tegn er ikke tilladte."
+
+msgid "and"
+msgstr "og"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s med dette %(field_labels)s eksisterer allerede."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Værdien %(value)r er ikke et gyldigt valg."
+
+msgid "This field cannot be null."
+msgstr "Dette felt kan ikke være null."
+
+msgid "This field cannot be blank."
+msgstr "Dette felt kan ikke være tomt."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s med dette %(field_label)s eksisterer allerede."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s skal være unik for %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Felt af type: %(field_type)s"
+
+msgid "Integer"
+msgstr "Heltal"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s'-værdien skal være et heltal."
+
+msgid "Big (8 byte) integer"
+msgstr "Stort heltal (8 byte)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s'-værdien skal være enten True eller False."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolsk (enten True eller False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Streng (op til %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Kommaseparerede heltal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s'-værdien har et ugyldigt datoformat. Den skal være i formatet "
+"ÅÅÅÅ-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"'%(value)s'-værdien har det korrekte format (ÅÅÅÅ-MM-DD) men er en ugyldig "
+"dato."
+
+msgid "Date (without time)"
+msgstr "Dato (uden tid)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"'%(value)s'-værdien har et ugyldigt format. Den skal være i formatet ÅÅÅÅ-MM-"
+"DD TT:MM[:ss[.uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"'%(value)s'-værdien har det korrekte format (ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]"
+"[TZ]) men er en ugyldig dato/tid."
+
+msgid "Date (with time)"
+msgstr "Dato (med tid)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "'%(value)s'-værdien skal være et decimaltal."
+
+msgid "Decimal number"
+msgstr "Decimaltal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"'%(value)s' værdien har et ugyldigt format. Den skal være i formatet [DD] "
+"[HH:[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Varighed"
+
+msgid "Email address"
+msgstr "E-mail-adresse"
+
+msgid "File path"
+msgstr "Sti"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "'%(value)s'-værdien skal være en float (et kommatal)."
+
+msgid "Floating point number"
+msgstr "Flydende-komma-tal"
+
+msgid "IPv4 address"
+msgstr "IPv4-adresse"
+
+msgid "IP address"
+msgstr "IP-adresse"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "'%(value)s'-værdien skal være enten None, True eller False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolsk (True, False eller None)"
+
+msgid "Positive integer"
+msgstr "Positivt heltal"
+
+msgid "Positive small integer"
+msgstr "Positivt lille heltal"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "\"Slug\" (op til %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Lille heltal"
+
+msgid "Text"
+msgstr "Tekst"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"'%(value)s'-værdien har et ugyldigt format. Den skal være i formatet TT:MM[:"
+"ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"'%(value)s'-værdien har det korrekte format (TT:MM[:ss[.uuuuuu]]) men er et "
+"ugyldigt tidspunkt."
+
+msgid "Time"
+msgstr "Tid"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Rå binære data"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' er ikke et gyldigt UUID."
+
+msgid "File"
+msgstr "Fil"
+
+msgid "Image"
+msgstr "Billede"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "%(model)s instans med %(field)s %(value)r findes ikke."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Fremmednøgle (type bestemt af relateret felt)"
+
+msgid "One-to-one relationship"
+msgstr "En-til-en-relation"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "%(from)s-%(to)s-relation"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "%(from)s-%(to)s-relationer"
+
+msgid "Many-to-many relationship"
+msgstr "Mange-til-mange-relation"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Dette felt er påkrævet."
+
+msgid "Enter a whole number."
+msgstr "Indtast et heltal."
+
+msgid "Enter a number."
+msgstr "Indtast et tal."
+
+msgid "Enter a valid date."
+msgstr "Indtast en gyldig dato."
+
+msgid "Enter a valid time."
+msgstr "Indtast en gyldig tid."
+
+msgid "Enter a valid date/time."
+msgstr "Indtast gyldig dato/tid."
+
+msgid "Enter a valid duration."
+msgstr "Indtast en gyldig varighed."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ingen fil blev indsendt. Kontroller kodningstypen i formularen."
+
+msgid "No file was submitted."
+msgstr "Ingen fil blev indsendt."
+
+msgid "The submitted file is empty."
+msgstr "Den indsendte fil er tom."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] "Dette filnavn må højst have %(max)d tegn (det har %(length)d)."
+msgstr[1] "Dette filnavn må højst have %(max)d tegn (det har %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Du skal enten indsende en fil eller afmarkere afkrydsningsfeltet, ikke begge "
+"dele."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Indsend en billedfil. Filen, du indsendte, var enten ikke et billede eller "
+"en defekt billedfil."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Marker en gyldig valgmulighed. %(value)s er ikke en af de tilgængelige "
+"valgmuligheder."
+
+msgid "Enter a list of values."
+msgstr "Indtast en liste af værdier."
+
+msgid "Enter a complete value."
+msgstr "Indtast en komplet værdi."
+
+msgid "Enter a valid UUID."
+msgstr "Indtast et gyldigt UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Skjult felt %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "ManagementForm-data mangler eller er blevet manipuleret"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Send venligst %d eller færre formularer."
+msgstr[1] "Send venligst %d eller færre formularer."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Send venligst %d eller flere formularer."
+msgstr[1] "Send venligst %d eller flere formularer."
+
+msgid "Order"
+msgstr "Rækkefølge"
+
+msgid "Delete"
+msgstr "Slet"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Ret venligst duplikerede data for %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Ret venligst de duplikerede data for %(field)s, som skal være unik."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Ret venligst de duplikerede data for %(field_name)s, som skal være unik for "
+"%(lookup)s i %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Ret venligst de duplikerede data herunder."
+
+msgid "The inline value did not match the parent instance."
+msgstr "Den indlejrede værdi passede ikke med forældreinstansen."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Marker en gyldig valgmulighed. Det valg, du har foretaget, er ikke blandt de "
+"tilgængelige valgmuligheder."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" er ikke en gyldig værdi."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s kunne ikke fortolkes i tidszonen %(current_timezone)s; den kan "
+"være tvetydig eller den eksisterer måske ikke."
+
+msgid "Clear"
+msgstr "Afmarkér"
+
+msgid "Currently"
+msgstr "Aktuelt"
+
+msgid "Change"
+msgstr "Ret"
+
+msgid "Unknown"
+msgstr "Ukendt"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "yes,no,maybe"
+msgstr "ja,nej,måske"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "midnat"
+
+msgid "noon"
+msgstr "middag"
+
+msgid "Monday"
+msgstr "mandag"
+
+msgid "Tuesday"
+msgstr "tirsdag"
+
+msgid "Wednesday"
+msgstr "onsdag"
+
+msgid "Thursday"
+msgstr "torsdag"
+
+msgid "Friday"
+msgstr "fredag"
+
+msgid "Saturday"
+msgstr "lørdag"
+
+msgid "Sunday"
+msgstr "søndag"
+
+msgid "Mon"
+msgstr "man"
+
+msgid "Tue"
+msgstr "tir"
+
+msgid "Wed"
+msgstr "ons"
+
+msgid "Thu"
+msgstr "tor"
+
+msgid "Fri"
+msgstr "fre"
+
+msgid "Sat"
+msgstr "lør"
+
+msgid "Sun"
+msgstr "søn"
+
+msgid "January"
+msgstr "januar"
+
+msgid "February"
+msgstr "februar"
+
+msgid "March"
+msgstr "marts"
+
+msgid "April"
+msgstr "april"
+
+msgid "May"
+msgstr "maj"
+
+msgid "June"
+msgstr "juni"
+
+msgid "July"
+msgstr "juli"
+
+msgid "August"
+msgstr "august"
+
+msgid "September"
+msgstr "september"
+
+msgid "October"
+msgstr "oktober"
+
+msgid "November"
+msgstr "november"
+
+msgid "December"
+msgstr "december"
+
+msgid "jan"
+msgstr "jan"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "maj"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "aug"
+
+msgid "sep"
+msgstr "sept"
+
+msgid "oct"
+msgstr "okt"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dec"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "marts"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "april"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "maj"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "juni"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "juli"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "aug."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "okt."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "dec."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "januar"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "februar"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "marts"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "april"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "maj"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "juni"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "juli"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "august"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "september"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "oktober"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "november"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "december"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Dette er ikke en gyldig IPv6-adresse."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "eller"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d år"
+msgstr[1] "%d år"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d måned"
+msgstr[1] "%d måneder"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d uge"
+msgstr[1] "%d uger"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dag"
+msgstr[1] "%d dage"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d time"
+msgstr[1] "%d timer"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minutter"
+
+msgid "0 minutes"
+msgstr "0 minutter"
+
+msgid "Forbidden"
+msgstr "Forbudt"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF-verifikationen mislykkedes. Forespørgslen blev afbrudt."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Du ser denne besked fordi denne HTTPS-webside påkræver at din browser sender "
+"en 'Referer header', men den blev ikke sendt. Denne header er påkrævet af "
+"sikkerhedsmæssige grunde for at sikre at din browser ikke bliver kapret af "
+"tredjepart."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Hvis du har opsat din browser til ikke at sende 'Referer' headere, beder vi "
+"dig slå dem til igen, i hvert fald for denne webside, eller for HTTPS-"
+"forbindelser, eller for 'same-origin'-forespørgsler."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Hvis du bruger tagget eller "
+"inkluderer headeren 'Referrer-Policy: no-referrer', så fjern dem venligst. "
+"CSRF-beskyttelsen afhænger af at 'Referer'-headeren udfører stringent "
+"referer-kontrol. Hvis du er bekymret om privatliv, så brug alternativer så "
+"som for links til tredjepartswebsider."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Du ser denne besked fordi denne webside kræver en CSRF-cookie, når du sender "
+"formularer. Denne cookie er påkrævet af sikkerhedsmæssige grunde for at "
+"sikre at din browser ikke bliver kapret af tredjepart."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Hvis du har slået cookies fra i din browser, beder vi dig slå dem til igen, "
+"i hvert fald for denne webside, eller for 'same-origin'-forespørgsler."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Mere information er tilgængeligt med DEBUG=True."
+
+msgid "No year specified"
+msgstr "Intet år specificeret"
+
+msgid "Date out of range"
+msgstr "Dato uden for rækkevidde"
+
+msgid "No month specified"
+msgstr "Ingen måned specificeret"
+
+msgid "No day specified"
+msgstr "Ingen dag specificeret"
+
+msgid "No week specified"
+msgstr "Ingen uge specificeret"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Ingen %(verbose_name_plural)s til rådighed"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Fremtidige %(verbose_name_plural)s ikke tilgængelige, fordi %(class_name)s ."
+"allow_future er falsk."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Ugyldig datostreng ' %(datestr)s ' givet format ' %(format)s '"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Ingen %(verbose_name)s fundet matcher forespørgslen"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Side er ikke 'sidste', kan heller ikke konverteres til en int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Ugyldig side (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Tom liste og ' %(class_name)s .allow_empty' er falsk."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Mappeindekser er ikke tilladte her"
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\" %(path)s\" eksisterer ikke"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Indeks for %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: Webframework'et for perfektionister med deadlines."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Vis udgivelsesnoter for Django %(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Installationen virkede! Tillykke!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Du ser denne side fordi du har DEBUG=True i din settings-fil og ikke har opsat nogen URL'er."
+
+msgid "Django Documentation"
+msgstr "Django-dokumentation"
+
+msgid "Topics, references, & how-to's"
+msgstr "Emner, referencer & how-to's"
+
+msgid "Tutorial: A Polling App"
+msgstr "Gennemgang: En afstemnings-app"
+
+msgid "Get started with Django"
+msgstr "Kom i gang med Django"
+
+msgid "Django Community"
+msgstr "Django-fællesskabet"
+
+msgid "Connect, get help, or contribute"
+msgstr "Forbind, få hjælp eller bidrag"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..012bd5b
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..dbe0034
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/formats.py
new file mode 100644
index 0000000..3af2158
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/da/formats.py
@@ -0,0 +1,26 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j. F Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = 'j. F Y H:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j. F'
+SHORT_DATE_FORMAT = 'd.m.Y'
+SHORT_DATETIME_FORMAT = 'd.m.Y H:i'
+FIRST_DAY_OF_WEEK = 1
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d.%m.%Y', # '25.10.2006'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59'
+ '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200'
+ '%d.%m.%Y %H:%M', # '25.10.2006 14:30'
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a51de63
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..38f5921
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,1271 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# André Hagenbruch, 2011-2012
+# Florian Apolloner , 2011
+# Daniel Roschka , 2016
+# Jannis, 2011,2013
+# Jannis Leidel , 2013-2017
+# Jannis, 2016
+# Markus Holtermann , 2013,2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-27 16:21+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+msgid "Arabic"
+msgstr "Arabisch"
+
+msgid "Asturian"
+msgstr "Asturisch"
+
+msgid "Azerbaijani"
+msgstr "Aserbaidschanisch"
+
+msgid "Bulgarian"
+msgstr "Bulgarisch"
+
+msgid "Belarusian"
+msgstr "Weißrussisch"
+
+msgid "Bengali"
+msgstr "Bengali"
+
+msgid "Breton"
+msgstr "Bretonisch"
+
+msgid "Bosnian"
+msgstr "Bosnisch"
+
+msgid "Catalan"
+msgstr "Katalanisch"
+
+msgid "Czech"
+msgstr "Tschechisch"
+
+msgid "Welsh"
+msgstr "Walisisch"
+
+msgid "Danish"
+msgstr "Dänisch"
+
+msgid "German"
+msgstr "Deutsch"
+
+msgid "Lower Sorbian"
+msgstr "Niedersorbisch"
+
+msgid "Greek"
+msgstr "Griechisch"
+
+msgid "English"
+msgstr "Englisch"
+
+msgid "Australian English"
+msgstr "Australisches Englisch"
+
+msgid "British English"
+msgstr "Britisches Englisch"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Spanisch"
+
+msgid "Argentinian Spanish"
+msgstr "Argentinisches Spanisch"
+
+msgid "Colombian Spanish"
+msgstr "Kolumbianisches Spanisch"
+
+msgid "Mexican Spanish"
+msgstr "Mexikanisches Spanisch"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nicaraguanisches Spanisch"
+
+msgid "Venezuelan Spanish"
+msgstr "Venezolanisches Spanisch"
+
+msgid "Estonian"
+msgstr "Estnisch"
+
+msgid "Basque"
+msgstr "Baskisch"
+
+msgid "Persian"
+msgstr "Persisch"
+
+msgid "Finnish"
+msgstr "Finnisch"
+
+msgid "French"
+msgstr "Französisch"
+
+msgid "Frisian"
+msgstr "Friesisch"
+
+msgid "Irish"
+msgstr "Irisch"
+
+msgid "Scottish Gaelic"
+msgstr "Schottisch-Gälisch"
+
+msgid "Galician"
+msgstr "Galicisch"
+
+msgid "Hebrew"
+msgstr "Hebräisch"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Kroatisch"
+
+msgid "Upper Sorbian"
+msgstr "Obersorbisch"
+
+msgid "Hungarian"
+msgstr "Ungarisch"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesisch"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Isländisch"
+
+msgid "Italian"
+msgstr "Italienisch"
+
+msgid "Japanese"
+msgstr "Japanisch"
+
+msgid "Georgian"
+msgstr "Georgisch"
+
+msgid "Kazakh"
+msgstr "Kasachisch"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Koreanisch"
+
+msgid "Luxembourgish"
+msgstr "Luxemburgisch"
+
+msgid "Lithuanian"
+msgstr "Litauisch"
+
+msgid "Latvian"
+msgstr "Lettisch"
+
+msgid "Macedonian"
+msgstr "Mazedonisch"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongolisch"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "Birmanisch"
+
+msgid "Norwegian Bokmål"
+msgstr "Norwegisch (Bokmål)"
+
+msgid "Nepali"
+msgstr "Nepali"
+
+msgid "Dutch"
+msgstr "Niederländisch"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norwegisch (Nynorsk)"
+
+msgid "Ossetic"
+msgstr "Ossetisch"
+
+msgid "Punjabi"
+msgstr "Panjabi"
+
+msgid "Polish"
+msgstr "Polnisch"
+
+msgid "Portuguese"
+msgstr "Portugiesisch"
+
+msgid "Brazilian Portuguese"
+msgstr "Brasilianisches Portugiesisch"
+
+msgid "Romanian"
+msgstr "Rumänisch"
+
+msgid "Russian"
+msgstr "Russisch"
+
+msgid "Slovak"
+msgstr "Slowakisch"
+
+msgid "Slovenian"
+msgstr "Slowenisch"
+
+msgid "Albanian"
+msgstr "Albanisch"
+
+msgid "Serbian"
+msgstr "Serbisch"
+
+msgid "Serbian Latin"
+msgstr "Serbisch (Latein)"
+
+msgid "Swedish"
+msgstr "Schwedisch"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "Tamilisch"
+
+msgid "Telugu"
+msgstr "Telugisch"
+
+msgid "Thai"
+msgstr "Thailändisch"
+
+msgid "Turkish"
+msgstr "Türkisch"
+
+msgid "Tatar"
+msgstr "Tatarisch"
+
+msgid "Udmurt"
+msgstr "Udmurtisch"
+
+msgid "Ukrainian"
+msgstr "Ukrainisch"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamesisch"
+
+msgid "Simplified Chinese"
+msgstr "Vereinfachtes Chinesisch"
+
+msgid "Traditional Chinese"
+msgstr "Traditionelles Chinesisch"
+
+msgid "Messages"
+msgstr "Mitteilungen"
+
+msgid "Site Maps"
+msgstr "Sitemaps"
+
+msgid "Static Files"
+msgstr "Statische Dateien"
+
+msgid "Syndication"
+msgstr "Syndication"
+
+msgid "That page number is not an integer"
+msgstr "Diese Seitennummer ist keine Ganzzahl"
+
+msgid "That page number is less than 1"
+msgstr "Diese Seitennummer ist kleiner als 1"
+
+msgid "That page contains no results"
+msgstr "Diese Seite enthält keine Ergebnisse"
+
+msgid "Enter a valid value."
+msgstr "Bitte einen gültigen Wert eingeben."
+
+msgid "Enter a valid URL."
+msgstr "Bitte eine gültige Adresse eingeben."
+
+msgid "Enter a valid integer."
+msgstr "Bitte eine gültige Ganzzahl eingeben."
+
+msgid "Enter a valid email address."
+msgstr "Bitte gültige E-Mail-Adresse eingeben."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Bitte ein gültiges Kürzel eingeben, bestehend aus Buchstaben, Ziffern, "
+"Unter- und Bindestrichen."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Bitte ein gültiges Kürzel eingeben, bestehend aus Buchstaben (Unicode), "
+"Ziffern, Unter- und Bindestrichen."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Bitte eine gültige IPv4-Adresse eingeben."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Bitte eine gültige IPv6-Adresse eingeben."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Bitte eine gültige IPv4- oder IPv6-Adresse eingeben"
+
+msgid "Enter only digits separated by commas."
+msgstr "Bitte nur durch Komma getrennte Ziffern eingeben."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Bitte sicherstellen, dass der Wert %(limit_value)s ist. (Er ist "
+"%(show_value)s)"
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Bitte sicherstellen, dass der Wert aus mindestens %(limit_value)d Zeichen "
+"besteht. (Er besteht aus %(show_value)d Zeichen)."
+msgstr[1] ""
+"Bitte sicherstellen, dass der Wert aus mindestens %(limit_value)d Zeichen "
+"besteht. (Er besteht aus %(show_value)d Zeichen)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Bitte sicherstellen, dass der Wert aus höchstens %(limit_value)d Zeichen "
+"besteht. (Er besteht aus %(show_value)d Zeichen)."
+msgstr[1] ""
+"Bitte sicherstellen, dass der Wert aus höchstens %(limit_value)d Zeichen "
+"besteht. (Er besteht aus %(show_value)d Zeichen)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffer enthält."
+msgstr[1] ""
+"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffern enthält."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+"Bitte sicherstellen, dass der Wert höchstens %(max)s Dezimalstelle enthält."
+msgstr[1] ""
+"Bitte sicherstellen, dass der Wert höchstens %(max)s Dezimalstellen enthält."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffer vor dem Komma "
+"enthält."
+msgstr[1] ""
+"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffern vor dem Komma "
+"enthält."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Dateiendung „%(extension)s“ ist nicht erlaubt. Erlaubte Dateiendungen: sind: "
+"„%(allowed_extensions)s“."
+
+msgid "Null characters are not allowed."
+msgstr "Nullzeichen sind nicht erlaubt."
+
+msgid "and"
+msgstr "und"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s mit diesem %(field_labels)s existiert bereits."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Wert %(value)r ist keine gültige Option."
+
+msgid "This field cannot be null."
+msgstr "Dieses Feld darf nicht null sein."
+
+msgid "This field cannot be blank."
+msgstr "Dieses Feld darf nicht leer sein."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s mit diesem %(field_label)s existiert bereits."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s muss für %(date_field_label)s %(lookup_type)s eindeutig sein."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Feldtyp: %(field_type)s"
+
+msgid "Integer"
+msgstr "Ganzzahl"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "„%(value)s“ Wert muss eine Ganzzahl sein."
+
+msgid "Big (8 byte) integer"
+msgstr "Große Ganzzahl (8 Byte)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "„%(value)s“ Wert muss entweder True oder False sein."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolescher Wert (True oder False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)"
+
+msgid "Comma-separated integers"
+msgstr "Kommaseparierte Liste von Ganzzahlen"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"„%(value)s“ Wert hat ein ungültiges Datumsformat. Es muss YYYY-MM-DD "
+"entsprechen."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"„%(value)s“ hat das korrekte Format (YYYY-MM-DD) aber ein ungültiges Datum."
+
+msgid "Date (without time)"
+msgstr "Datum (ohne Uhrzeit)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"„%(value)s“ Wert hat ein ungültiges Format. Es muss YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] entsprechen."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"„%(value)s“ Wert hat das korrekte Format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) aber eine ungültige Zeit-/Datumsangabe."
+
+msgid "Date (with time)"
+msgstr "Datum (mit Uhrzeit)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "„%(value)s“ Wert muss eine Dezimalzahl sein."
+
+msgid "Decimal number"
+msgstr "Dezimalzahl"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"„%(value)s“ Wert hat ein ungültiges Format. Es muss der Form [DD] [HH:"
+"[MM:]]ss[.uuuuuu] entsprechen."
+
+msgid "Duration"
+msgstr "Zeitspanne"
+
+msgid "Email address"
+msgstr "E-Mail-Adresse"
+
+msgid "File path"
+msgstr "Dateipfad"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "„%(value)s“ Wert muss eine Fließkommazahl sein."
+
+msgid "Floating point number"
+msgstr "Gleitkommazahl"
+
+msgid "IPv4 address"
+msgstr "IPv4-Adresse"
+
+msgid "IP address"
+msgstr "IP-Adresse"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "„%(value)s“ Wert muss entweder None, True oder False sein."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolescher Wert (True, False oder None)"
+
+msgid "Positive integer"
+msgstr "Positive Ganzzahl"
+
+msgid "Positive small integer"
+msgstr "Positive kleine Ganzzahl"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Kürzel (bis zu %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Kleine Ganzzahl"
+
+msgid "Text"
+msgstr "Text"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"„%(value)s“ Wert hat ein ungültiges Format. Es muss HH:MM[:ss[.uuuuuu]] "
+"entsprechen."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"„%(value)s“ Wert hat das korrekte Format (HH:MM[:ss[.uuuuuu]]) aber ist eine "
+"ungültige Zeitangabe."
+
+msgid "Time"
+msgstr "Zeit"
+
+msgid "URL"
+msgstr "Adresse (URL)"
+
+msgid "Raw binary data"
+msgstr "Binärdaten"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "Wert „%(value)s“ ist keine gültige UUID."
+
+msgid "File"
+msgstr "Datei"
+
+msgid "Image"
+msgstr "Bild"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "Objekt vom Typ %(model)s mit %(field)s %(value)r existiert nicht."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Fremdschlüssel (Typ definiert durch verknüpftes Feld)"
+
+msgid "One-to-one relationship"
+msgstr "1:1-Beziehung"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "%(from)s-%(to)s-Beziehung"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "%(from)s-%(to)s-Beziehungen"
+
+msgid "Many-to-many relationship"
+msgstr "n:m-Beziehung"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Dieses Feld ist zwingend erforderlich."
+
+msgid "Enter a whole number."
+msgstr "Bitte eine ganze Zahl eingeben."
+
+msgid "Enter a number."
+msgstr "Bitte eine Zahl eingeben."
+
+msgid "Enter a valid date."
+msgstr "Bitte ein gültiges Datum eingeben."
+
+msgid "Enter a valid time."
+msgstr "Bitte eine gültige Uhrzeit eingeben."
+
+msgid "Enter a valid date/time."
+msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben."
+
+msgid "Enter a valid duration."
+msgstr "Bitte eine gültige Zeitspanne eingeben."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Es wurde keine Datei übertragen. Überprüfen Sie das Encoding des Formulars."
+
+msgid "No file was submitted."
+msgstr "Es wurde keine Datei übertragen."
+
+msgid "The submitted file is empty."
+msgstr "Die übertragene Datei ist leer."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Bitte sicherstellen, dass der Dateiname aus höchstens %(max)d Zeichen "
+"besteht. (Er besteht aus %(length)d Zeichen)."
+msgstr[1] ""
+"Bitte sicherstellen, dass der Dateiname aus höchstens %(max)d Zeichen "
+"besteht. (Er besteht aus %(length)d Zeichen)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Bitte wählen Sie entweder eine Datei aus oder wählen Sie \"Löschen\", nicht "
+"beides."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Bitte ein gültiges Bild hochladen. Die hochgeladene Datei ist kein Bild oder "
+"ist defekt."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl."
+
+msgid "Enter a list of values."
+msgstr "Bitte eine Liste mit Werten eingeben."
+
+msgid "Enter a complete value."
+msgstr "Bitte einen vollständigen Wert eingeben."
+
+msgid "Enter a valid UUID."
+msgstr "Bitte eine gültige UUID eingeben."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Verstecktes Feld %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "ManagementForm-Daten fehlen oder wurden manipuliert."
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Bitte höchstens %d Formular abschicken."
+msgstr[1] "Bitte höchstens %d Formulare abschicken."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Bitte %d oder mehr Formulare abschicken."
+msgstr[1] "Bitte %d oder mehr Formulare abschicken."
+
+msgid "Order"
+msgstr "Reihenfolge"
+
+msgid "Delete"
+msgstr "Löschen"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Bitte die doppelten Daten für %(field)s korrigieren."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Bitte die doppelten Daten für %(field)s korrigieren, das eindeutig sein muss."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Bitte die doppelten Daten für %(field_name)s korrigieren, da es für "
+"%(lookup)s in %(date_field)s eindeutig sein muss."
+
+msgid "Please correct the duplicate values below."
+msgstr "Bitte die unten aufgeführten doppelten Werte korrigieren."
+
+msgid "The inline value did not match the parent instance."
+msgstr "Der Inline-Wert passt nicht zur übergeordneten Instanz."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Bitte eine gültige Auswahl treffen. Dies ist keine gültige Auswahl."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "„%(pk)s“ ist kein gültiger Wert."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s konnte mit der Zeitzone %(current_timezone)s nicht eindeutig "
+"interpretiert werden, da es doppeldeutig oder eventuell inkorrekt ist."
+
+msgid "Clear"
+msgstr "Zurücksetzen"
+
+msgid "Currently"
+msgstr "Derzeit"
+
+msgid "Change"
+msgstr "Ändern"
+
+msgid "Unknown"
+msgstr "Unbekannt"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nein"
+
+msgid "yes,no,maybe"
+msgstr "Ja,Nein,Vielleicht"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d Byte"
+msgstr[1] "%(size)d Bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "nachm."
+
+msgid "a.m."
+msgstr "vorm."
+
+msgid "PM"
+msgstr "nachm."
+
+msgid "AM"
+msgstr "vorm."
+
+msgid "midnight"
+msgstr "Mitternacht"
+
+msgid "noon"
+msgstr "Mittag"
+
+msgid "Monday"
+msgstr "Montag"
+
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgid "Friday"
+msgstr "Freitag"
+
+msgid "Saturday"
+msgstr "Samstag"
+
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgid "Mon"
+msgstr "Mo"
+
+msgid "Tue"
+msgstr "Di"
+
+msgid "Wed"
+msgstr "Mi"
+
+msgid "Thu"
+msgstr "Do"
+
+msgid "Fri"
+msgstr "Fr"
+
+msgid "Sat"
+msgstr "Sa"
+
+msgid "Sun"
+msgstr "So"
+
+msgid "January"
+msgstr "Januar"
+
+msgid "February"
+msgstr "Februar"
+
+msgid "March"
+msgstr "März"
+
+msgid "April"
+msgstr "April"
+
+msgid "May"
+msgstr "Mai"
+
+msgid "June"
+msgstr "Juni"
+
+msgid "July"
+msgstr "Juli"
+
+msgid "August"
+msgstr "August"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "Oktober"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "Dezember"
+
+msgid "jan"
+msgstr "Jan"
+
+msgid "feb"
+msgstr "Feb"
+
+msgid "mar"
+msgstr "Mär"
+
+msgid "apr"
+msgstr "Apr"
+
+msgid "may"
+msgstr "Mai"
+
+msgid "jun"
+msgstr "Jun"
+
+msgid "jul"
+msgstr "Jul"
+
+msgid "aug"
+msgstr "Aug"
+
+msgid "sep"
+msgstr "Sep"
+
+msgid "oct"
+msgstr "Okt"
+
+msgid "nov"
+msgstr "Nov"
+
+msgid "dec"
+msgstr "Dez"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "März"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mai"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Juni"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Juli"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Aug."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Okt."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dez."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Januar"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Februar"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "März"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mai"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Juni"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Juli"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "August"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "September"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Oktober"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "November"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Dezember"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Dies ist keine gültige IPv6-Adresse."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "oder"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d Jahr"
+msgstr[1] "%d Jahre"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d Monat"
+msgstr[1] "%d Monate"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d Woche"
+msgstr[1] "%d Wochen"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d Tag"
+msgstr[1] "%d Tage"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d Stunde"
+msgstr[1] "%d Stunden"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d Minute"
+msgstr[1] "%d Minuten"
+
+msgid "0 minutes"
+msgstr "0 Minuten"
+
+msgid "Forbidden"
+msgstr "Verboten"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF-Verifizierung fehlgeschlagen. Anfrage abgebrochen."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Sie sehen diese Fehlermeldung da diese HTTPS-Seite einen „Referer“-Header "
+"von Ihrem Webbrowser erwartet, aber keinen erhalten hat. Dieser Header ist "
+"aus Sicherheitsgründen notwendig, um sicherzustellen, dass Ihr Webbrowser "
+"nicht von Dritten missbraucht wird."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Falls Sie Ihren Webbrowser so konfiguriert haben, dass „Referer“-Header "
+"nicht gesendet werden, müssen Sie diese Funktion mindestens für diese Seite, "
+"für sichere HTTPS-Verbindungen oder für „Same-Origin“-Verbindungen "
+"reaktivieren."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Wenn der Tag „“ oder der "
+"„Referrer-Policy: no-referrer“-Header verwendet wird, entfernen Sie sie "
+"bitte. Der „Referer“-Header wird zur korrekten CSRF-Verifizierung benötigt. "
+"Falls es datenschutzrechtliche Gründe gibt, benutzen Sie bitte Alternativen "
+"wie „“ für Links zu Drittseiten."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Sie sehen Diese Nachricht, da diese Seite einen CSRF-Cookie beim Verarbeiten "
+"von Formulardaten benötigt. Dieses Cookie ist aus Sicherheitsgründen "
+"notwendig, um sicherzustellen, dass Ihr Webbrowser nicht von Dritten "
+"missbraucht wird."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Falls Sie Cookies in Ihren Webbrowser deaktiviert haben, müssen Sie sie "
+"mindestens für diese Seite oder für „Same-Origin“-Verbindungen reaktivieren."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Mehr Information ist verfügbar mit DEBUG=True."
+
+msgid "No year specified"
+msgstr "Kein Jahr angegeben"
+
+msgid "Date out of range"
+msgstr "Datum außerhalb des zulässigen Bereichs"
+
+msgid "No month specified"
+msgstr "Kein Monat angegeben"
+
+msgid "No day specified"
+msgstr "Kein Tag angegeben"
+
+msgid "No week specified"
+msgstr "Keine Woche angegeben"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Keine %(verbose_name_plural)s verfügbar"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"In der Zukunft liegende %(verbose_name_plural)s sind nicht verfügbar, da "
+"%(class_name)s.allow_future auf False gesetzt ist."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Ungültiges Datum „%(datestr)s“ für das Format „%(format)s“"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Konnte keine %(verbose_name)s mit diesen Parametern finden."
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"Weder ist dies die letzte Seite („last“) noch konnte sie in einen "
+"ganzzahligen Wert umgewandelt werden."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Ungültige Seite (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Leere Liste und „%(class_name)s.allow_empty“ ist False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Dateilisten sind untersagt."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "„%(path)s“ ist nicht vorhanden"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Verzeichnis %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: Das Webframework für Perfektionisten mit Termindruck."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Versionshinweise für Django %(version)s "
+"anzeigen"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Die Installation war erfolgreich. Herzlichen Glückwunsch!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Diese Seite ist sichtbar weil in der Settings-Datei DEBUG = True steht und die URLs noch nicht konfiguriert "
+"sind."
+
+msgid "Django Documentation"
+msgstr "Django-Dokumentation"
+
+msgid "Topics, references, & how-to's"
+msgstr "Themen, Referenz, & Kurzanleitungen"
+
+msgid "Tutorial: A Polling App"
+msgstr "Tutorial: Eine Umfrage-App"
+
+msgid "Get started with Django"
+msgstr "Los geht's mit Django"
+
+msgid "Django Community"
+msgstr "Django-Community"
+
+msgid "Connect, get help, or contribute"
+msgstr "Nimm Kontakt auf, erhalte Hilfe oder arbeite an Django mit"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..19d74e8
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..6afed1c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/formats.py
new file mode 100644
index 0000000..d47f57a
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de/formats.py
@@ -0,0 +1,28 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j. F Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = 'j. F Y H:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j. F'
+SHORT_DATE_FORMAT = 'd.m.Y'
+SHORT_DATETIME_FORMAT = 'd.m.Y H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06'
+ # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59'
+ '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200'
+ '%d.%m.%Y %H:%M', # '25.10.2006 14:30'
+ '%d.%m.%Y', # '25.10.2006'
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..563500e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..065e8e8
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/formats.py
new file mode 100644
index 0000000..e09f9ff
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/de_CH/formats.py
@@ -0,0 +1,34 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j. F Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = 'j. F Y H:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j. F'
+SHORT_DATE_FORMAT = 'd.m.Y'
+SHORT_DATETIME_FORMAT = 'd.m.Y H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06'
+ # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59'
+ '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200'
+ '%d.%m.%Y %H:%M', # '25.10.2006 14:30'
+ '%d.%m.%Y', # '25.10.2006'
+]
+
+# these are the separators for non-monetary numbers. For monetary numbers,
+# the DECIMAL_SEPARATOR is a . (decimal point) and the THOUSAND_SEPARATOR is a
+# ' (single quote).
+# For details, please refer to http://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de
+# (in German) and the documentation
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..8c96081
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po
new file mode 100644
index 0000000..fb8c175
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po
@@ -0,0 +1,1302 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Michael Wolf , 2016-2017
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-17 21:09+0000\n"
+"Last-Translator: Michael Wolf \n"
+"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/"
+"language/dsb/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: dsb\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaanšćina"
+
+msgid "Arabic"
+msgstr "Arabšćina"
+
+msgid "Asturian"
+msgstr "Asturišćina"
+
+msgid "Azerbaijani"
+msgstr "Azerbajdžanišćina"
+
+msgid "Bulgarian"
+msgstr "Bulgaršćina"
+
+msgid "Belarusian"
+msgstr "Běłorušćina"
+
+msgid "Bengali"
+msgstr "Bengalšćina"
+
+msgid "Breton"
+msgstr "Bretońšćina"
+
+msgid "Bosnian"
+msgstr "Bosnišćina"
+
+msgid "Catalan"
+msgstr "Katalańšćina"
+
+msgid "Czech"
+msgstr "Češćina"
+
+msgid "Welsh"
+msgstr "Kymrišćina"
+
+msgid "Danish"
+msgstr "Dańšćina"
+
+msgid "German"
+msgstr "Nimšćina"
+
+msgid "Lower Sorbian"
+msgstr "Dolnoserbšćina"
+
+msgid "Greek"
+msgstr "Grichišćina"
+
+msgid "English"
+msgstr "Engelšćina"
+
+msgid "Australian English"
+msgstr "Awstralska engelšćina"
+
+msgid "British English"
+msgstr "Britiska engelšćina"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Špańšćina"
+
+msgid "Argentinian Spanish"
+msgstr "Argentinska špańšćina"
+
+msgid "Colombian Spanish"
+msgstr "Kolumbiska špańšćina"
+
+msgid "Mexican Spanish"
+msgstr "Mexikańska špańšćina"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nikaraguaska špańšćina"
+
+msgid "Venezuelan Spanish"
+msgstr "Venezolaniska špańšćina"
+
+msgid "Estonian"
+msgstr "Estnišćina"
+
+msgid "Basque"
+msgstr "Baskišćina"
+
+msgid "Persian"
+msgstr "Persišćina"
+
+msgid "Finnish"
+msgstr "Finšćina"
+
+msgid "French"
+msgstr "Francojšćina"
+
+msgid "Frisian"
+msgstr "Frizišćina"
+
+msgid "Irish"
+msgstr "Iršćina"
+
+msgid "Scottish Gaelic"
+msgstr "Šotiska gelišćina"
+
+msgid "Galician"
+msgstr "Galicišćina"
+
+msgid "Hebrew"
+msgstr "Hebrejšćina"
+
+msgid "Hindi"
+msgstr "Hindišćina"
+
+msgid "Croatian"
+msgstr "Chorwatšćina"
+
+msgid "Upper Sorbian"
+msgstr "Górnoserbšćina"
+
+msgid "Hungarian"
+msgstr "Hungoršćina"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonešćina"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandšćina"
+
+msgid "Italian"
+msgstr "Italšćina"
+
+msgid "Japanese"
+msgstr "Japańšćina"
+
+msgid "Georgian"
+msgstr "Georgišćina"
+
+msgid "Kazakh"
+msgstr "Kazachšćina"
+
+msgid "Khmer"
+msgstr "Rěc Khmerow"
+
+msgid "Kannada"
+msgstr "Kannadišćina"
+
+msgid "Korean"
+msgstr "Korejańšćina"
+
+msgid "Luxembourgish"
+msgstr "Luxemburgšćina"
+
+msgid "Lithuanian"
+msgstr "Litawšćina"
+
+msgid "Latvian"
+msgstr "Letišćina"
+
+msgid "Macedonian"
+msgstr "Makedońšćina"
+
+msgid "Malayalam"
+msgstr "Malajalam"
+
+msgid "Mongolian"
+msgstr "Mongolšćina"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "Myanmaršćina"
+
+msgid "Norwegian Bokmål"
+msgstr "Norwegski Bokmål"
+
+msgid "Nepali"
+msgstr "Nepalšćina"
+
+msgid "Dutch"
+msgstr "¨Nižozemšćina"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norwegski Nynorsk"
+
+msgid "Ossetic"
+msgstr "Osetšćina"
+
+msgid "Punjabi"
+msgstr "Pundžabi"
+
+msgid "Polish"
+msgstr "Pólšćina"
+
+msgid "Portuguese"
+msgstr "Portugišćina"
+
+msgid "Brazilian Portuguese"
+msgstr "Brazilska portugišćina"
+
+msgid "Romanian"
+msgstr "Rumunšćina"
+
+msgid "Russian"
+msgstr "Rušćina"
+
+msgid "Slovak"
+msgstr "Słowakšćina"
+
+msgid "Slovenian"
+msgstr "Słowjeńšćina"
+
+msgid "Albanian"
+msgstr "Albanšćina"
+
+msgid "Serbian"
+msgstr "Serbišćina"
+
+msgid "Serbian Latin"
+msgstr "Serbišćina, łatyńska"
+
+msgid "Swedish"
+msgstr "Šwedšćina"
+
+msgid "Swahili"
+msgstr "Suahelšćina"
+
+msgid "Tamil"
+msgstr "Tamilšćina"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Thaišćina"
+
+msgid "Turkish"
+msgstr "Turkojšćina"
+
+msgid "Tatar"
+msgstr "Tataršćina"
+
+msgid "Udmurt"
+msgstr "Udmurtšćina"
+
+msgid "Ukrainian"
+msgstr "Ukrainšćina"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamšćina"
+
+msgid "Simplified Chinese"
+msgstr "Zjadnorjona chinšćina"
+
+msgid "Traditional Chinese"
+msgstr "Tradicionelna chinšćina"
+
+msgid "Messages"
+msgstr "Powěsći"
+
+msgid "Site Maps"
+msgstr "Wopśimjeśowy pśeglěd sedła"
+
+msgid "Static Files"
+msgstr "Statiske dataje"
+
+msgid "Syndication"
+msgstr "Syndikacija"
+
+msgid "That page number is not an integer"
+msgstr "Toś ten numer boka njejo ceła licba"
+
+msgid "That page number is less than 1"
+msgstr "Numer boka jo mjeńšy ako 1"
+
+msgid "That page contains no results"
+msgstr "Toś ten bok njewopśimujo wuslědki"
+
+msgid "Enter a valid value."
+msgstr "Zapódajśo płaśiwu gódnotu."
+
+msgid "Enter a valid URL."
+msgstr "Zapódajśo płaśiwy URL."
+
+msgid "Enter a valid integer."
+msgstr "Zapódajśo płaśiwu cełu licbu."
+
+msgid "Enter a valid email address."
+msgstr "Zapódajśo płaśiwu e-mailowu adresu."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Zapódajśo płaśiwe 'adresowe mě', kótarež jano wopśimujo pismiki, licby, "
+"pódsmužki abo wězawki."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Zapódajśo płaśiwe 'adresowe mě', kótarež jano wopśimujo unicodowe pismiki, "
+"licby, pódmužki abo wězawki."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Zapódajśo płaśiwu IPv4-adresu."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Zapódajśo płaśiwu IPv6-adresu."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Zapódajśo płaśiwu IPv4- abo IPv6-adresu."
+
+msgid "Enter only digits separated by commas."
+msgstr "Zapódajśo jano cyfry źělone pśez komy."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Zawěsććo toś tu gódnotu jo %(limit_value)s (jo %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+"Zawěsććo, až toś ta gódnota jo mjeńša ako abo to samske ako %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Zawěsććo, až toś ta gódnota jo wětša ako abo to samske ako %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuško (ma "
+"%(show_value)d)."
+msgstr[1] ""
+"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamušce (ma "
+"%(show_value)d)."
+msgstr[2] ""
+"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuška (ma "
+"%(show_value)d)."
+msgstr[3] ""
+"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuškow (ma "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuško (ma "
+"%(show_value)d)."
+msgstr[1] ""
+"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamušce (ma "
+"%(show_value)d)."
+msgstr[2] ""
+"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuška (ma "
+"%(show_value)d)."
+msgstr[3] ""
+"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuškow (ma "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s cyfry dogromady."
+msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s cyfrowu dogromady."
+msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow dogromady."
+msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow dogromady."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s decimalnego městna."
+msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s decimalneju městnowu."
+msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s decimalnych městnow."
+msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s decimalnych městnow."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s cyfry pśed decimalneju komu."
+msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s cyfrowu pśed decimalneju komu."
+msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow pśed decimalneju komu."
+msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow pśed decimalneju komu."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Datajowy sufiks ' %(extension)s' njejo dowólony. Dowólone sufikse su: ' "
+"%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "Znamuška nul njejsu dowólone."
+
+msgid "and"
+msgstr "a"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s z toś tym %(field_labels)s južo eksistěrujo."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Gódnota %(value)r njejo płaśiwa wóleńska móžnosć."
+
+msgid "This field cannot be null."
+msgstr "Toś to pólo njamóžo nul byś."
+
+msgid "This field cannot be blank."
+msgstr "Toś to pólo njamóžo prozne byś."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s z toś tym %(field_label)s južo eksistěrujo."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s musy za %(date_field_label)s %(lookup_type)s jadnorazowy byś."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Typ póla: %(field_type)s"
+
+msgid "Integer"
+msgstr "Integer"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "Gódnota '%(value)s' musy ceła licba byś."
+
+msgid "Big (8 byte) integer"
+msgstr "Big (8 bajtow) integer"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "Gódnota '%(value)s musy pak True pak False byś."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (pak True pak False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Znamuškowy rjeśazk (až %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Pśez komu źělone cełe licby"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"Gódnota '%(value)s' ma njepłaśiwy datumowy format. Musy we formaśe DD.MM."
+"YYYY byś."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Gódnota '%(value)s' ma korektny format (DD.MM.YYYY), ale jo njepłaśiwy datum."
+
+msgid "Date (without time)"
+msgstr "Datum (bźez casa)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Gódnota '%(value)s' ma njepłaśiwy format. Musy w formaśe DD.MM.YYYY HH:MM[:"
+"ss[.uuuuuu]][TZ] byś."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Gódnota '%(value)s' ma korektny format (DD.MM.YYYY HH:MM[:ss[.uuuuuu]][TZ]), "
+"ale jo njepłaśiwy datum/cas."
+
+msgid "Date (with time)"
+msgstr "Datum (z casom)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "Gódnota '%(value)s' musy decimalna licba byś."
+
+msgid "Decimal number"
+msgstr "Decimalna licba"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"Gódnota '%(value)s ma njepłaśiwy format. Musy we formaśe [DD] [HH:[MM:]]ss[."
+"uuuuuu] byś."
+
+msgid "Duration"
+msgstr "Traśe"
+
+msgid "Email address"
+msgstr "E-mailowa adresa"
+
+msgid "File path"
+msgstr "Datajowa sćažka"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "Gódnota '%(value)s' musy typ float měś."
+
+msgid "Floating point number"
+msgstr "Licba běžeceje komy"
+
+msgid "IPv4 address"
+msgstr "IPv4-adresa"
+
+msgid "IP address"
+msgstr "IP-adresa"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Gódnota '%(value)s' musy pak None, True pak False byś."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (pak True, False pak None)"
+
+msgid "Positive integer"
+msgstr "Pozitiwna ceła licba"
+
+msgid "Positive small integer"
+msgstr "Pozitiwna mała ceła licba"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Adresowe mě (až %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Mała ceła licba"
+
+msgid "Text"
+msgstr "Tekst"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Gódnota '%(value)s' ma njepłaśiwy format. Musy w formaśe HH:MM[:ss[."
+"uuuuuu]] byś."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Gódnota '%(value)s' ma korektny format (HH:MM[:ss[.uuuuuu]]), ale jo "
+"njepłaśiwy cas."
+
+msgid "Time"
+msgstr "Cas"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Gropne binarne daty"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' njejo płaśiwy UUID."
+
+msgid "File"
+msgstr "Dataja"
+
+msgid "Image"
+msgstr "Woraz"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "Instanca %(model)s z %(field)s %(value)r njeeksistěrujo."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Cuzy kluc (typ póstaja se pśez wótpowědne pólo)"
+
+msgid "One-to-one relationship"
+msgstr "Póśěg jaden jaden"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "Póśěg %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "Póśěgi %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Póśěg wjele wjele"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Toś to pólo jo trěbne."
+
+msgid "Enter a whole number."
+msgstr "Zapódajśo cełu licbu."
+
+msgid "Enter a number."
+msgstr "Zapódajśo licbu."
+
+msgid "Enter a valid date."
+msgstr "Zapódajśo płaśiwy datum."
+
+msgid "Enter a valid time."
+msgstr "Zapódajśo płaśiwy cas."
+
+msgid "Enter a valid date/time."
+msgstr "Zapódajśo płaśiwy datum/cas."
+
+msgid "Enter a valid duration."
+msgstr "Zapódaśe płaśiwe traśe."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Dataja njejo se wótpósłała. Pśeglědujśo koděrowański typ na formularje. "
+
+msgid "No file was submitted."
+msgstr "Žedna dataja jo se wótpósłała."
+
+msgid "The submitted file is empty."
+msgstr "Wótpósłana dataja jo prozna."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuško (ma "
+"%(length)d)."
+msgstr[1] ""
+"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamušce (ma "
+"%(length)d)."
+msgstr[2] ""
+"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuška (ma "
+"%(length)d)."
+msgstr[3] ""
+"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuškow (ma "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Pšosym pak wótpósćelśo dataju pak stajśo kokulku do kontrolnego kašćika, "
+"njecyńśo wobej."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Nagrajśo płaśiwy wobraz. Dataja, kótaruž sćo nagrał, pak njejo wobraz był "
+"pak jo wobškóźony wobraz."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Wubjeŕśo płaśiwu wóleńsku móžnosć. %(value)s njejo jadna z k dispoziciji "
+"stojecych wóleńskich móžnosćow."
+
+msgid "Enter a list of values."
+msgstr "Zapódajśo lisćinu gódnotow."
+
+msgid "Enter a complete value."
+msgstr "Zapódajśo dopołnu gódnotu."
+
+msgid "Enter a valid UUID."
+msgstr "Zapódajśo płaśiwy UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Schowane pólo %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Daty ManagementForm feluju abo su sfalšowane"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Pšosym wótposćelśo %d formular."
+msgstr[1] "Pšosym wótposćelśo %d formulara abo mjenjej."
+msgstr[2] "Pšosym wótposćelśo %d formulary abo mjenjej."
+msgstr[3] "Pšosym wótposćelśo %d formularow abo mjenjej."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Pšosym wótposćelśo %d formular abo wěcej."
+msgstr[1] "Pšosym wótposćelśo %d formulara abo wěcej."
+msgstr[2] "Pšosym wótposćelśo %d formulary abo wěcej."
+msgstr[3] "Pšosym wótposćelśo %d formularow abo wěcej."
+
+msgid "Order"
+msgstr "Rěd"
+
+msgid "Delete"
+msgstr "Lašowaś"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Pšosym korigěrujśo dwójne daty za %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Pšosym korigěrujśo dwójne daty za %(field)s, kótarež muse jadnorazowe byś."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Pšosym korigěrujśo dwójne daty za %(field_name)s, kótarež muse za %(lookup)s "
+"w %(date_field)s jadnorazowe byś."
+
+msgid "Please correct the duplicate values below."
+msgstr "Pšosym korigěrujśo slědujuce dwójne gódnoty."
+
+msgid "The inline value did not match the parent instance."
+msgstr "Gódnota inline nadrědowanej instance njewótpowědujo."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Wubjeŕśo płaśiwu wóleńsku móžnosć. Toś ta wóleńska móžnosć njejo žedna z "
+"wóleńskich móžnosćow."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" njejo płaśiwa gódnota."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s njedajo se w casowej conje %(current_timezone)s "
+"interpretěrowaś; jo dwójozmysłowy abo snaź njeeksistěrujo."
+
+msgid "Clear"
+msgstr "Lašowaś"
+
+msgid "Currently"
+msgstr "Tuchylu"
+
+msgid "Change"
+msgstr "Změniś"
+
+msgid "Unknown"
+msgstr "Njeznaty"
+
+msgid "Yes"
+msgstr "Jo"
+
+msgid "No"
+msgstr "Ně"
+
+msgid "yes,no,maybe"
+msgstr "jo,ně,snaź"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajta"
+msgstr[2] "%(size)d bajty"
+msgstr[3] "%(size)d bajtow"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "wótpołdnja"
+
+msgid "a.m."
+msgstr "dopołdnja"
+
+msgid "PM"
+msgstr "wótpołdnja"
+
+msgid "AM"
+msgstr "dopołdnja"
+
+msgid "midnight"
+msgstr "połnoc"
+
+msgid "noon"
+msgstr "połdnjo"
+
+msgid "Monday"
+msgstr "Pónjeźele"
+
+msgid "Tuesday"
+msgstr "Wałtora"
+
+msgid "Wednesday"
+msgstr "Srjoda"
+
+msgid "Thursday"
+msgstr "Stwórtk"
+
+msgid "Friday"
+msgstr "Pětk"
+
+msgid "Saturday"
+msgstr "Sobota"
+
+msgid "Sunday"
+msgstr "Njeźela"
+
+msgid "Mon"
+msgstr "Pón"
+
+msgid "Tue"
+msgstr "Wał"
+
+msgid "Wed"
+msgstr "Srj"
+
+msgid "Thu"
+msgstr "Stw"
+
+msgid "Fri"
+msgstr "Pět"
+
+msgid "Sat"
+msgstr "Sob"
+
+msgid "Sun"
+msgstr "Nje"
+
+msgid "January"
+msgstr "Januar"
+
+msgid "February"
+msgstr "Februar"
+
+msgid "March"
+msgstr "Měrc"
+
+msgid "April"
+msgstr "Apryl"
+
+msgid "May"
+msgstr "Maj"
+
+msgid "June"
+msgstr "Junij"
+
+msgid "July"
+msgstr "Julij"
+
+msgid "August"
+msgstr "Awgust"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "Oktober"
+
+msgid "November"
+msgstr "Nowember"
+
+msgid "December"
+msgstr "December"
+
+msgid "jan"
+msgstr "jan"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "měr"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "maj"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "awg"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "okt"
+
+msgid "nov"
+msgstr "now"
+
+msgid "dec"
+msgstr "dec"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Měrc"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Apryl"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Maj"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Junij"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Julij"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Awg."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Okt."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Now."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dec."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Januar"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Februar"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Měrc"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Apryl"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Maj"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junij"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julij"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Awgust"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "September"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Oktober"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Nowember"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "December"
+
+msgid "This is not a valid IPv6 address."
+msgstr "To njejo płaśiwa IPv6-adresa."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "abo"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d lěto"
+msgstr[1] "%d lěśe"
+msgstr[2] "%d lěta"
+msgstr[3] "%d lět"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mjasec"
+msgstr[1] "%d mjaseca"
+msgstr[2] "%d mjasece"
+msgstr[3] "%d mjasecow"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d tyźeń"
+msgstr[1] "%d tyéznja"
+msgstr[2] "%d tyźenje"
+msgstr[3] "%d tyźenjow"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d źeń"
+msgstr[1] "%d dnja"
+msgstr[2] "%d dny"
+msgstr[3] "%d dnjow"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d góźina"
+msgstr[1] "%d góźinje"
+msgstr[2] "%d góźiny"
+msgstr[3] "%d góźin"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuta"
+msgstr[1] "%d minuśe"
+msgstr[2] "%d minuty"
+msgstr[3] "%d minutow"
+
+msgid "0 minutes"
+msgstr "0 minutow"
+
+msgid "Forbidden"
+msgstr "Zakazany"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF-pśeglědanje njejo se raźiło. Napšašowanje jo se pśetergnuło."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Wiźiśo toś tu powěźeńku, dokulaž toś to HTTPS-sedło trjeba głowu 'Referer', "
+"aby se pśez waš webwobglědowak słało, ale žedna njejo se pósłała. Toś ta "
+"głowa jo trěbna z pśicynow wěstoty, aby so zawěsćiło, až waš wobglědowak "
+"njekaprujo se wót tśeśich."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Jolic sćo swój wobglědowak tak konfigurěrował, aby se głowy 'Referer' "
+"znjemóžnili, zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło, za "
+"HTTPS-zwiski abo za napšašowanja 'same-origin'."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Jolic woznamjenje wužywaśo "
+"abo głowu 'Referrer-Policy: no-referrer' zapśimujośo, wótwónoźćo je. CSRF-"
+"šćit pomina se głowu 'Referer', aby striktnu kontrolu referera pśewjasć. "
+"Jolic se wó swóju priwatnosć staraśo, wužywajśo alternatiwy ako za wótkazy k sedłam tśeśich."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Wiźiśo toś tu powěźeńku, dokulaž toś to HTTPS-sedło trjeba CSRF-cookie, aby "
+"formulary wótpósłało. Toś ten cookie jo trěbna z pśicynow wěstoty, aby so "
+"zawěsćiło, až waš wobglědowak njekaprujo se wót tśeśich."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Jolic sćo swój wobglědowak tak konfigurěrował, aby cookieje znjemóžnili, "
+"zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło abo za napšašowanja "
+"'same-origin'."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Dalšne informacije su k dispoziciji z DEBUG=True."
+
+msgid "No year specified"
+msgstr "Žedno lěto pódane"
+
+msgid "Date out of range"
+msgstr "Datum zwenka wobcerka"
+
+msgid "No month specified"
+msgstr "Žeden mjasec pódany"
+
+msgid "No day specified"
+msgstr "Žeden źeń pódany"
+
+msgid "No week specified"
+msgstr "Žeden tyźeń pódany"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Žedne %(verbose_name_plural)s k dispoziciji"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Pśichodne %(verbose_name_plural)s njejo k dispoziciji, dokulaž "
+"%(class_name)s.allow_future jo False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Njepłaśiwy '%(format)s' za datumowy znamuškowy rjeśazk '%(datestr)s' pódany"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Žedno %(verbose_name)s namakane, kótarež wótpowědujo napšašowanjeju."
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Bok njejo 'last', ani njedajo se do 'int' konwertěrowaś."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Njepłaśiwy bok (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Prozna lisćina a '%(class_name)s.allow_empty' jo False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Zapisowe indekse njejsu how dowólone."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" njeeksistěrujo"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Indeks %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django? Web-framework za perfekcionisty z terminami."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Wersijowe informacije za Django %(version)s "
+"pokazaś"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Instalacija jo była wuspěšna! Gratulacija!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Wiźiśo toś ten bok, dokulaž DEBUG=True jo w swójej dataji nastajenjow a njejsćo konfigurěrował "
+"URL."
+
+msgid "Django Documentation"
+msgstr "Dokumentacija Django"
+
+msgid "Topics, references, & how-to's"
+msgstr "Temy, reference a rozpokazanja"
+
+msgid "Tutorial: A Polling App"
+msgstr "Rozpokazanje: Napšašowańske nałoženje"
+
+msgid "Get started with Django"
+msgstr "Prědne kšace z Django"
+
+msgid "Django Community"
+msgstr "Zgromaźeństwo Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "Zwězajśo, wobsarajśo se pomoc abo źěłajśo sobu"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a80a720
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4d0cea0
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.po
@@ -0,0 +1,1272 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Apostolis Bessas , 2013
+# Dimitris Glezos , 2011,2013,2017
+# Giannis Meletakis , 2015
+# Jannis Leidel , 2011
+# Nick Mavrakis , 2017
+# Nikolas Demiridis , 2014
+# Nick Mavrakis , 2016
+# Pãnoș , 2014
+# Pãnoș , 2016
+# Serafeim Papastefanos , 2016
+# Stavros Korokithakis , 2014,2016
+# Yorgos Pagles , 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-25 01:42+0000\n"
+"Last-Translator: Dimitris Glezos \n"
+"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Αφρικάνς"
+
+msgid "Arabic"
+msgstr "Αραβικά"
+
+msgid "Asturian"
+msgstr "Αστούριας"
+
+msgid "Azerbaijani"
+msgstr "Γλώσσα Αζερμπαϊτζάν"
+
+msgid "Bulgarian"
+msgstr "Βουλγαρικά"
+
+msgid "Belarusian"
+msgstr "Λευκορώσικα"
+
+msgid "Bengali"
+msgstr "Μπενγκάλι"
+
+msgid "Breton"
+msgstr "Βρετονικά"
+
+msgid "Bosnian"
+msgstr "Βοσνιακά"
+
+msgid "Catalan"
+msgstr "Καταλανικά"
+
+msgid "Czech"
+msgstr "Τσέχικα"
+
+msgid "Welsh"
+msgstr "Ουαλικά"
+
+msgid "Danish"
+msgstr "Δανέζικα"
+
+msgid "German"
+msgstr "Γερμανικά"
+
+msgid "Lower Sorbian"
+msgstr "Κάτω Σορβικά"
+
+msgid "Greek"
+msgstr "Ελληνικά"
+
+msgid "English"
+msgstr "Αγγλικά"
+
+msgid "Australian English"
+msgstr "Αγγλικά Αυστραλίας"
+
+msgid "British English"
+msgstr "Αγγλικά Βρετανίας"
+
+msgid "Esperanto"
+msgstr "Εσπεράντο"
+
+msgid "Spanish"
+msgstr "Ισπανικά"
+
+msgid "Argentinian Spanish"
+msgstr "Ισπανικά Αργεντινής"
+
+msgid "Colombian Spanish"
+msgstr "Ισπανικά Κολομβίας"
+
+msgid "Mexican Spanish"
+msgstr "Μεξικανική διάλεκτος Ισπανικών"
+
+msgid "Nicaraguan Spanish"
+msgstr "Ισπανικά Νικαράγουας "
+
+msgid "Venezuelan Spanish"
+msgstr "Ισπανικά Βενεζουέλας"
+
+msgid "Estonian"
+msgstr "Εσθονικά"
+
+msgid "Basque"
+msgstr "Βάσκικα"
+
+msgid "Persian"
+msgstr "Περσικά"
+
+msgid "Finnish"
+msgstr "Φινλανδικά"
+
+msgid "French"
+msgstr "Γαλλικά"
+
+msgid "Frisian"
+msgstr "Frisian"
+
+msgid "Irish"
+msgstr "Ιρλανδικά"
+
+msgid "Scottish Gaelic"
+msgstr "Σκωτσέζικα Γαελικά"
+
+msgid "Galician"
+msgstr "Γαελικά"
+
+msgid "Hebrew"
+msgstr "Εβραϊκά"
+
+msgid "Hindi"
+msgstr "Ινδικά"
+
+msgid "Croatian"
+msgstr "Κροατικά"
+
+msgid "Upper Sorbian"
+msgstr "Άνω Σορβικά"
+
+msgid "Hungarian"
+msgstr "Ουγγρικά"
+
+msgid "Interlingua"
+msgstr "Ιντερλίνγκουα"
+
+msgid "Indonesian"
+msgstr "Ινδονησιακά"
+
+msgid "Ido"
+msgstr "Ίντο"
+
+msgid "Icelandic"
+msgstr "Ισλανδικά"
+
+msgid "Italian"
+msgstr "Ιταλικά"
+
+msgid "Japanese"
+msgstr "Γιαπωνέζικα"
+
+msgid "Georgian"
+msgstr "Γεωργιανά"
+
+msgid "Kazakh"
+msgstr "Καζακστά"
+
+msgid "Khmer"
+msgstr "Χμερ"
+
+msgid "Kannada"
+msgstr "Κανάντα"
+
+msgid "Korean"
+msgstr "Κορεάτικα"
+
+msgid "Luxembourgish"
+msgstr "Λουξεμβουργιανά"
+
+msgid "Lithuanian"
+msgstr "Λιθουανικά"
+
+msgid "Latvian"
+msgstr "Λεττονικά"
+
+msgid "Macedonian"
+msgstr "Μακεδονικά"
+
+msgid "Malayalam"
+msgstr "Μαλαγιαλάμ"
+
+msgid "Mongolian"
+msgstr "Μογγολικά"
+
+msgid "Marathi"
+msgstr "Μαράθι"
+
+msgid "Burmese"
+msgstr "Βιρμανικά"
+
+msgid "Norwegian Bokmål"
+msgstr "Νορβηγικά Μποκμάλ"
+
+msgid "Nepali"
+msgstr "Νεπαλέζικα"
+
+msgid "Dutch"
+msgstr "Ολλανδικά"
+
+msgid "Norwegian Nynorsk"
+msgstr "Νορβηγική διάλεκτος Nynorsk - Νεονορβηγική"
+
+msgid "Ossetic"
+msgstr "Οσσετικά"
+
+msgid "Punjabi"
+msgstr "Πουντζάμπι"
+
+msgid "Polish"
+msgstr "Πολωνικά"
+
+msgid "Portuguese"
+msgstr "Πορτογαλικά"
+
+msgid "Brazilian Portuguese"
+msgstr "Πορτογαλικά - διάλεκτος Βραζιλίας"
+
+msgid "Romanian"
+msgstr "Ρουμανικά"
+
+msgid "Russian"
+msgstr "Ρωσικά"
+
+msgid "Slovak"
+msgstr "Σλοβακικά"
+
+msgid "Slovenian"
+msgstr "Σλοβενικά"
+
+msgid "Albanian"
+msgstr "Αλβανικά"
+
+msgid "Serbian"
+msgstr "Σερβικά"
+
+msgid "Serbian Latin"
+msgstr "Σέρβικα Λατινικά"
+
+msgid "Swedish"
+msgstr "Σουηδικά"
+
+msgid "Swahili"
+msgstr "Σουαχίλι"
+
+msgid "Tamil"
+msgstr "Διάλεκτος Ταμίλ"
+
+msgid "Telugu"
+msgstr "Τελούγκου"
+
+msgid "Thai"
+msgstr "Ταϊλάνδης"
+
+msgid "Turkish"
+msgstr "Τουρκικά"
+
+msgid "Tatar"
+msgstr "Ταταρικά"
+
+msgid "Udmurt"
+msgstr "Ουντμουρτικά"
+
+msgid "Ukrainian"
+msgstr "Ουκρανικά"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Βιετναμέζικα"
+
+msgid "Simplified Chinese"
+msgstr "Απλοποιημένα Κινέζικα"
+
+msgid "Traditional Chinese"
+msgstr "Παραδοσιακά Κινέζικα"
+
+msgid "Messages"
+msgstr "Μηνύματα"
+
+msgid "Site Maps"
+msgstr "Χάρτες Ιστότοπου"
+
+msgid "Static Files"
+msgstr "Στατικά Αρχεία"
+
+msgid "Syndication"
+msgstr "Syndication"
+
+msgid "That page number is not an integer"
+msgstr "Ο αριθμός αυτής της σελίδας δεν είναι ακέραιος"
+
+msgid "That page number is less than 1"
+msgstr "Ο αριθμός αυτής της σελίδας είναι μικρότερος του 1"
+
+msgid "That page contains no results"
+msgstr "Η σελίδα αυτή δεν περιέχει αποτελέσματα"
+
+msgid "Enter a valid value."
+msgstr "Εισάγετε μια έγκυρη τιμή."
+
+msgid "Enter a valid URL."
+msgstr "Εισάγετε ένα έγκυρο URL."
+
+msgid "Enter a valid integer."
+msgstr "Εισάγετε έναν έγκυρο ακέραιο."
+
+msgid "Enter a valid email address."
+msgstr "Εισάγετε μια έγκυρη διεύθυνση ηλ. ταχυδρομείου."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Εισάγετε ένα έγκυρο 'slug' αποτελούμενο από γράμματα, αριθμούς, παύλες ή "
+"κάτω παύλες."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Ένα έγκυρο 'slug' αποτελείται από Unicode γράμματα, αριθμούς, παύλες ή κάτω "
+"παύλες."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Εισάγετε μια έγκυρη IPv4 διεύθυνση."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Εισάγετε μία έγκυρη IPv6 διεύθυνση"
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Εισάγετε μία έγκυρη IPv4 ή IPv6 διεύθυνση"
+
+msgid "Enter only digits separated by commas."
+msgstr "Εισάγετε μόνο ψηφία χωρισμένα με κόμματα."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Βεβαιωθείτε ότι η τιμή είναι %(limit_value)s (η τιμή που καταχωρήσατε είναι "
+"%(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Βεβαιωθείτε ότι η τιμή είναι μικρότερη ή ίση από %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Βεβαιωθείτε ότι η τιμή είναι μεγαλύτερη ή ίση από %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Βεβαιωθείται πως η τιμή αυτή έχει τουλάχιστον %(limit_value)d χαρακτήρες "
+"(έχει %(show_value)d)."
+msgstr[1] ""
+"Βεβαιωθείτε πως η τιμή έχει τουλάχιστον %(limit_value)d χαρακτήρες (έχει "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Βεβαιωθείται πως η τιμή αυτή έχει τοπολύ %(limit_value)d χαρακτήρες (έχει "
+"%(show_value)d)."
+msgstr[1] ""
+"Βεβαιωθείτε πως η τιμή έχει το πολύ %(limit_value)d χαρακτήρες (έχει "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+"Σιγουρευτείτε οτι τα σύνολο των ψηφίων δεν είναι παραπάνω από %(max)s"
+msgstr[1] ""
+"Σιγουρευτείτε οτι τα σύνολο των ψηφίων δεν είναι παραπάνω από %(max)s"
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Σιγουρευτείτε ότι το δεκαδικό ψηφίο δεν είναι παραπάνω από %(max)s."
+msgstr[1] "Σιγουρευτείτε ότι τα δεκαδικά ψηφία δεν είναι παραπάνω από %(max)s."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Βεβαιωθείτε ότι δεν υπάρχουν πάνω από %(max)s ψηφία πριν την υποδιαστολή."
+msgstr[1] ""
+"Βεβαιωθείτε ότι δεν υπάρχουν πάνω από %(max)s ψηφία πριν την υποδιαστολή."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Η επέκταση '%(extension)s' του αρχείου δεν επιτρέπεται. Οι επιτρεπόμενες "
+"επεκτάσεις είναι: '%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "Δεν επιτρέπονται null (μηδενικοί) χαρακτήρες"
+
+msgid "and"
+msgstr "και"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s με αυτή την %(field_labels)s υπάρχει ήδη."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Η τιμή %(value)r δεν είναι έγκυρη επιλογή."
+
+msgid "This field cannot be null."
+msgstr "Το πεδίο αυτό δεν μπορεί να είναι μηδενικό (null)."
+
+msgid "This field cannot be blank."
+msgstr "Το πεδίο αυτό δεν μπορεί να είναι κενό."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s με αυτό το %(field_label)s υπάρχει ήδη."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s πρέπει να είναι μοναδική για %(date_field_label)s "
+"%(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Πεδίο τύπου: %(field_type)s"
+
+msgid "Integer"
+msgstr "Ακέραιος"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "Η τιμή '%(value)s' πρέπει να είναι ακέραιος."
+
+msgid "Big (8 byte) integer"
+msgstr "Μεγάλος ακέραιος - big integer (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "Η τιμή '%(value)s' πρέπει να είναι είτε True ή False."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Είτε Αληθές ή Ψευδές)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Συμβολοσειρά (μέχρι %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Ακέραιοι χωρισμένοι με κόμματα"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή ημερομηνίας. Η ημερομηνία "
+"θα πρέπει να είναι στην μορφή YYYY-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Η τιμή '%(value)s' είναι στην σωστή μορφή (YYYY-MM-DD) αλλά είναι μια "
+"λανθασμένη ημερομηνία."
+
+msgid "Date (without time)"
+msgstr "Ημερομηνία (χωρίς την ώρα)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή. Η ημερομηνία/ώρα θα πρέπει "
+"να είναι στην μορφή YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]"
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Η τιμή '%(value)s' έχει τη σωστή μορφή (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) "
+"αλλά δεν αντιστοιχεί σε σωστή ημερομηνία και ώρα."
+
+msgid "Date (with time)"
+msgstr "Ημερομηνία (με ώρα)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "Η τιμή '%(value)s' πρέπει να είναι ακέραιος."
+
+msgid "Decimal number"
+msgstr "Δεκαδικός αριθμός"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής [DD] [HH:"
+"[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Διάρκεια"
+
+msgid "Email address"
+msgstr "Ηλεκτρονική διεύθυνση"
+
+msgid "File path"
+msgstr "Τοποθεσία αρχείου"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "Η '%(value)s' τιμή πρέπει να είναι δεκαδικός."
+
+msgid "Floating point number"
+msgstr "Αριθμός κινητής υποδιαστολής"
+
+msgid "IPv4 address"
+msgstr "Διεύθυνση IPv4"
+
+msgid "IP address"
+msgstr "IP διεύθυνση"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Η '%(value)s' τιμή πρέπει είναι είτε None, True ή False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Αληθές, Ψευδές, ή τίποτα)"
+
+msgid "Positive integer"
+msgstr "Θετικός ακέραιος"
+
+msgid "Positive small integer"
+msgstr "Θετικός μικρός ακέραιος"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (μέχρι %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Μικρός ακέραιος"
+
+msgid "Text"
+msgstr "Κείμενο"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής HH:MM[:"
+"ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Η τιμή '%(value)s' έχει τη σωστή μορφή (HH:MM[:ss[.uuuuuu]]) αλλά δεν "
+"αντιστοιχή σε σωστή ώρα."
+
+msgid "Time"
+msgstr "Ώρα"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Δυαδικά δεδομένα"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' δεν είναι ένα έγκυρο UUID."
+
+msgid "File"
+msgstr "Αρχείο"
+
+msgid "Image"
+msgstr "Εικόνα"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+"Το μοντέλο %(model)s με την τιμή %(value)r του πεδίου %(field)s δεν υπάρχει."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Foreign Key (ο τύπος καθορίζεται από το πεδίο του συσχετισμού)"
+
+msgid "One-to-one relationship"
+msgstr "Σχέση ένα-προς-ένα"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "σχέση %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "σχέσεις %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Σχέση πολλά-προς-πολλά"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Αυτό το πεδίο είναι απαραίτητο."
+
+msgid "Enter a whole number."
+msgstr "Εισάγετε έναν ακέραιο αριθμό."
+
+msgid "Enter a number."
+msgstr "Εισάγετε έναν αριθμό."
+
+msgid "Enter a valid date."
+msgstr "Εισάγετε μια έγκυρη ημερομηνία."
+
+msgid "Enter a valid time."
+msgstr "Εισάγετε μια έγκυρη ώρα."
+
+msgid "Enter a valid date/time."
+msgstr "Εισάγετε μια έγκυρη ημερομηνία/ώρα."
+
+msgid "Enter a valid duration."
+msgstr "Εισάγετε μια έγκυρη διάρκεια."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Δεν έχει υποβληθεί κάποιο αρχείο. Ελέγξτε τον τύπο κωδικοποίησης στη φόρμα."
+
+msgid "No file was submitted."
+msgstr "Δεν υποβλήθηκε κάποιο αρχείο."
+
+msgid "The submitted file is empty."
+msgstr "Το αρχείο που υποβλήθηκε είναι κενό."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Βεβαιωθείται πως το όνομα του αρχείου έχει το πολύ %(max)d χαρακτήρα (το "
+"παρόν έχει %(length)d)."
+msgstr[1] ""
+"Βεβαιωθείται πως το όνομα του αρχείου έχει το πολύ %(max)d χαρακτήρα (το "
+"παρόν έχει %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Βεβαιωθείτε ότι είτε έχετε επιλέξει ένα αρχείο για αποστολή είτε έχετε "
+"επιλέξει την εκκαθάριση του πεδίου. Δεν είναι δυνατή η επιλογή και των δύο "
+"ταυτοχρόνως."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Βεβαιωθείτε ότι το αρχείο που έχετε επιλέξει για αποστολή είναι αρχείο "
+"εικόνας. Το τρέχον είτε δεν ήταν εικόνα είτε έχει υποστεί φθορά."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Βεβαιωθείτε ότι έχετε επιλέξει μία έγκυρη επιλογή. Η τιμή %(value)s δεν "
+"είναι διαθέσιμη προς επιλογή."
+
+msgid "Enter a list of values."
+msgstr "Εισάγετε μια λίστα τιμών."
+
+msgid "Enter a complete value."
+msgstr "Εισάγετε μια πλήρης τιμή"
+
+msgid "Enter a valid UUID."
+msgstr "Εισάγετε μια έγκυρη UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Κρυφό πεδίο %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Τα δεδομένα του ManagementForm λείπουν ή έχουν αλλοιωθεί"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Παρακαλώ υποβάλλετε %d ή λιγότερες φόρμες."
+msgstr[1] "Παρακαλώ υποβάλλετε %d ή λιγότερες φόρμες."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Παρακαλώ υποβάλλετε %d ή περισσότερες φόρμες."
+msgstr[1] "Παρακαλώ υποβάλλετε %d ή περισσότερες φόρμες."
+
+msgid "Order"
+msgstr "Ταξινόμηση"
+
+msgid "Delete"
+msgstr "Διαγραφή"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Στο %(field)s έχετε ξαναεισάγει τα ίδια δεδομένα."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Στο %(field)s έχετε ξαναεισάγει τα ίδια δεδομένα. Θα πρέπει να εμφανίζονται "
+"μία φορά. "
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Στο %(field_name)s έχετε ξαναεισάγει τα ίδια δεδομένα. Θα πρέπει να "
+"εμφανίζονται μία φορά για το %(lookup)s στο %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Έχετε ξαναεισάγει την ίδια τιμη. Βεβαιωθείτε ότι είναι μοναδική."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Επιλέξτε μια έγκυρη επιλογή. Η επιλογή αυτή δεν είναι μία από τις διαθέσιμες "
+"επιλογές."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "Το \"%(pk)s\" δεν είναι έγκυρη τιμή."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"Η ημερομηνία %(datetime)s δεν μπόρεσε να μετατραπεί στην ζώνη ώρας "
+"%(current_timezone)s; ίσως να είναι ασαφής ή να μην υπάρχει."
+
+msgid "Clear"
+msgstr "Εκκαθάριση"
+
+msgid "Currently"
+msgstr "Τώρα"
+
+msgid "Change"
+msgstr "Επεξεργασία"
+
+msgid "Unknown"
+msgstr "Άγνωστο"
+
+msgid "Yes"
+msgstr "Ναι"
+
+msgid "No"
+msgstr "Όχι"
+
+msgid "yes,no,maybe"
+msgstr "ναι,όχι,ίσως"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bytes"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "μμ."
+
+msgid "a.m."
+msgstr "πμ."
+
+msgid "PM"
+msgstr "ΜΜ"
+
+msgid "AM"
+msgstr "ΠΜ"
+
+msgid "midnight"
+msgstr "μεσάνυχτα"
+
+msgid "noon"
+msgstr "μεσημέρι"
+
+msgid "Monday"
+msgstr "Δευτέρα"
+
+msgid "Tuesday"
+msgstr "Τρίτη"
+
+msgid "Wednesday"
+msgstr "Τετάρτη"
+
+msgid "Thursday"
+msgstr "Πέμπτη"
+
+msgid "Friday"
+msgstr "Παρασκευή"
+
+msgid "Saturday"
+msgstr "Σάββατο"
+
+msgid "Sunday"
+msgstr "Κυριακή"
+
+msgid "Mon"
+msgstr "Δευ"
+
+msgid "Tue"
+msgstr "Τρί"
+
+msgid "Wed"
+msgstr "Τετ"
+
+msgid "Thu"
+msgstr "Πέμ"
+
+msgid "Fri"
+msgstr "Παρ"
+
+msgid "Sat"
+msgstr "Σαβ"
+
+msgid "Sun"
+msgstr "Κυρ"
+
+msgid "January"
+msgstr "Ιανουάριος"
+
+msgid "February"
+msgstr "Φεβρουάριος"
+
+msgid "March"
+msgstr "Μάρτιος"
+
+msgid "April"
+msgstr "Απρίλιος"
+
+msgid "May"
+msgstr "Μάιος"
+
+msgid "June"
+msgstr "Ιούνιος"
+
+msgid "July"
+msgstr "Ιούλιος"
+
+msgid "August"
+msgstr "Αύγουστος"
+
+msgid "September"
+msgstr "Σεπτέμβριος"
+
+msgid "October"
+msgstr "Οκτώβριος"
+
+msgid "November"
+msgstr "Νοέμβριος"
+
+msgid "December"
+msgstr "Δεκέμβριος"
+
+msgid "jan"
+msgstr "Ιαν"
+
+msgid "feb"
+msgstr "Φεβ"
+
+msgid "mar"
+msgstr "Μάρ"
+
+msgid "apr"
+msgstr "Απρ"
+
+msgid "may"
+msgstr "Μάι"
+
+msgid "jun"
+msgstr "Ιούν"
+
+msgid "jul"
+msgstr "Ιούλ"
+
+msgid "aug"
+msgstr "Αύγ"
+
+msgid "sep"
+msgstr "Σεπ"
+
+msgid "oct"
+msgstr "Οκτ"
+
+msgid "nov"
+msgstr "Νοέ"
+
+msgid "dec"
+msgstr "Δεκ"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ιαν."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Φεβ."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Μάρτιος"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Απρίλ."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Μάιος"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Ιούν."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Ιούλ."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Αύγ."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Σεπτ."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Οκτ."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Νοέμ."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Δεκ."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Ιανουαρίου"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Φεβρουαρίου"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Μαρτίου"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Απριλίου"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Μαΐου"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Ιουνίου"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Ιουλίου"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Αυγούστου"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Σεπτεμβρίου"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Οκτωβρίου"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Νοεμβρίου"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Δεκεμβρίου"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Αυτή δεν είναι έγκυρη διεύθυνση IPv6."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "ή"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d χρόνος"
+msgstr[1] "%d χρόνια"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d μήνας"
+msgstr[1] "%d μήνες"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d βδομάδα"
+msgstr[1] "%d βδομάδες"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d μέρα"
+msgstr[1] "%d μέρες"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ώρα"
+msgstr[1] "%d ώρες"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d λεπτό"
+msgstr[1] "%d λεπτά"
+
+msgid "0 minutes"
+msgstr "0 λεπτά"
+
+msgid "Forbidden"
+msgstr "Απαγορευμένο"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Η πιστοποίηση CSRF απέτυχε. Το αίτημα ματαιώθηκε."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Βλέπετε αυτό το μήνυμα επειδή αυτή η HTTPS σελίδα απαιτεί από τον Web "
+"browser σας να σταλεί ένας 'Referer header', όμως τίποτα δεν στάλθηκε. Αυτός "
+"ο header είναι απαραίτητος για λόγους ασφαλείας, για να εξασφαλιστεί ότι ο "
+"browser δεν έχει γίνει hijacked από τρίτους."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Αν οι 'Referer' headers είναι απενεργοποιημένοι στον browser σας από εσάς, "
+"παρακαλούμε να τους ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για "
+"τις συνδέσεις HTTPS ή για τα 'same-origin' requests."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Βλέπετε αυτό το μήνυμα επειδή αυτή η σελίδα απαιτεί ένα CSRF cookie, όταν "
+"κατατίθενται φόρμες. Αυτό το cookie είναι απαραίτητο για λόγους ασφαλείας, "
+"για να εξασφαλιστεί ότι ο browser δεν έχει γίνει hijacked από τρίτους."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Αν τα cookies είναι απενεργοποιημένα στον browser σας από εσάς, παρακαλούμε "
+"να τα ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για τα 'same-"
+"origin' requests."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Περισσότερες πληροφορίες είναι διαθέσιμες με DEBUG=True."
+
+msgid "No year specified"
+msgstr "Δεν έχει οριστεί χρονιά"
+
+msgid "Date out of range"
+msgstr "Ημερομηνία εκτός εύρους"
+
+msgid "No month specified"
+msgstr "Δεν έχει οριστεί μήνας"
+
+msgid "No day specified"
+msgstr "Δεν έχει οριστεί μέρα"
+
+msgid "No week specified"
+msgstr "Δεν έχει οριστεί εβδομάδα"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Δεν υπάρχουν διαθέσιμα %(verbose_name_plural)s"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Μελλοντικά %(verbose_name_plural)s δεν είναι διαθέσιμα διότι δεν έχει τεθεί "
+"το %(class_name)s.allow_future."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Λανθασμένη αναπαράσταση ημερομηνίας '%(datestr)s' για την επιλεγμένη μορφή "
+"'%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Δεν βρέθηκαν %(verbose_name)s που να ικανοποιούν την αναζήτηση."
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"Η σελίδα δεν έχει την τιμή 'last' υποδηλώνοντας την τελευταία σελίδα, ούτε "
+"μπορεί να μετατραπεί σε ακέραιο."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Άκυρη σελίδα (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Άδεια λίστα και το '%(class_name)s.allow_empty' είναι False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Τα ευρετήρια καταλόγων δεν επιτρέπονται εδώ."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "Το \"%(path)s\" δεν υπάρχει"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Ευρετήριο του %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: το Web framework για τελειομανείς με προθεσμίες."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Δείτε τις σημειώσεις κυκλοφορίας για το "
+"Django %(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Η εγκατάσταση δούλεψε με επιτυχία! Συγχαρητήρια!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr "Εγχειρίδιο Django"
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr "Εγχειρίδιο: Ένα App Ψηφοφορίας"
+
+msgid "Get started with Django"
+msgstr "Ξεκινήστε με το Django"
+
+msgid "Django Community"
+msgstr "Κοινότητα Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "Συνδεθείτε, λάβετε βοήθεια, ή συνεισφέρετε"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..70653f8
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..f60c216
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/formats.py
new file mode 100644
index 0000000..3db1ad4
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/el/formats.py
@@ -0,0 +1,35 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'd/m/Y'
+TIME_FORMAT = 'P'
+DATETIME_FORMAT = 'd/m/Y P'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y P'
+FIRST_DAY_OF_WEEK = 0 # Sunday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', '%Y-%m-%d', # '25/10/2006', '25/10/06', '2006-10-25',
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59'
+ '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200'
+ '%d/%m/%Y %H:%M', # '25/10/2006 14:30'
+ '%d/%m/%Y', # '25/10/2006'
+ '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59'
+ '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200'
+ '%d/%m/%y %H:%M', # '25/10/06 14:30'
+ '%d/%m/%y', # '25/10/06'
+ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
+ '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
+ '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
+ '%Y-%m-%d', # '2006-10-25'
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..0d4c976
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.po
new file mode 100644
index 0000000..5fa7e05
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.po
@@ -0,0 +1,1509 @@
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-12-01 21:10+0100\n"
+"PO-Revision-Date: 2010-05-13 15:35+0200\n"
+"Last-Translator: Django team\n"
+"Language-Team: English \n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: conf/global_settings.py:57
+msgid "Afrikaans"
+msgstr ""
+
+#: conf/global_settings.py:58
+msgid "Arabic"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Asturian"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Azerbaijani"
+msgstr ""
+
+#: conf/global_settings.py:61
+msgid "Bulgarian"
+msgstr ""
+
+#: conf/global_settings.py:62
+msgid "Belarusian"
+msgstr ""
+
+#: conf/global_settings.py:63
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:64
+msgid "Breton"
+msgstr ""
+
+#: conf/global_settings.py:65
+msgid "Bosnian"
+msgstr ""
+
+#: conf/global_settings.py:66
+msgid "Catalan"
+msgstr ""
+
+#: conf/global_settings.py:67
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:68
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:69
+msgid "Danish"
+msgstr ""
+
+#: conf/global_settings.py:70
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:71
+msgid "Lower Sorbian"
+msgstr ""
+
+#: conf/global_settings.py:72
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:73
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:74
+msgid "Australian English"
+msgstr ""
+
+#: conf/global_settings.py:75
+msgid "British English"
+msgstr ""
+
+#: conf/global_settings.py:76
+msgid "Esperanto"
+msgstr ""
+
+#: conf/global_settings.py:77
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:78
+msgid "Argentinian Spanish"
+msgstr ""
+
+#: conf/global_settings.py:79
+msgid "Colombian Spanish"
+msgstr ""
+
+#: conf/global_settings.py:80
+msgid "Mexican Spanish"
+msgstr ""
+
+#: conf/global_settings.py:81
+msgid "Nicaraguan Spanish"
+msgstr ""
+
+#: conf/global_settings.py:82
+msgid "Venezuelan Spanish"
+msgstr ""
+
+#: conf/global_settings.py:83
+msgid "Estonian"
+msgstr ""
+
+#: conf/global_settings.py:84
+msgid "Basque"
+msgstr ""
+
+#: conf/global_settings.py:85
+msgid "Persian"
+msgstr ""
+
+#: conf/global_settings.py:86
+msgid "Finnish"
+msgstr ""
+
+#: conf/global_settings.py:87
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:88
+msgid "Frisian"
+msgstr ""
+
+#: conf/global_settings.py:89
+msgid "Irish"
+msgstr ""
+
+#: conf/global_settings.py:90
+msgid "Scottish Gaelic"
+msgstr ""
+
+#: conf/global_settings.py:91
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:92
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:93
+msgid "Hindi"
+msgstr ""
+
+#: conf/global_settings.py:94
+msgid "Croatian"
+msgstr ""
+
+#: conf/global_settings.py:95
+msgid "Upper Sorbian"
+msgstr ""
+
+#: conf/global_settings.py:96
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:97
+msgid "Interlingua"
+msgstr ""
+
+#: conf/global_settings.py:98
+msgid "Indonesian"
+msgstr ""
+
+#: conf/global_settings.py:99
+msgid "Ido"
+msgstr ""
+
+#: conf/global_settings.py:100
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:101
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:102
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:103
+msgid "Georgian"
+msgstr ""
+
+#: conf/global_settings.py:104
+msgid "Kabyle"
+msgstr ""
+
+#: conf/global_settings.py:104
+msgid "Kazakh"
+msgstr ""
+
+#: conf/global_settings.py:105
+msgid "Khmer"
+msgstr ""
+
+#: conf/global_settings.py:106
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:107
+msgid "Korean"
+msgstr ""
+
+#: conf/global_settings.py:108
+msgid "Luxembourgish"
+msgstr ""
+
+#: conf/global_settings.py:109
+msgid "Lithuanian"
+msgstr ""
+
+#: conf/global_settings.py:110
+msgid "Latvian"
+msgstr ""
+
+#: conf/global_settings.py:111
+msgid "Macedonian"
+msgstr ""
+
+#: conf/global_settings.py:112
+msgid "Malayalam"
+msgstr ""
+
+#: conf/global_settings.py:113
+msgid "Mongolian"
+msgstr ""
+
+#: conf/global_settings.py:114
+msgid "Marathi"
+msgstr ""
+
+#: conf/global_settings.py:115
+msgid "Burmese"
+msgstr ""
+
+#: conf/global_settings.py:116
+msgid "Norwegian Bokmål"
+msgstr ""
+
+#: conf/global_settings.py:117
+msgid "Nepali"
+msgstr ""
+
+#: conf/global_settings.py:118
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:119
+msgid "Norwegian Nynorsk"
+msgstr ""
+
+#: conf/global_settings.py:120
+msgid "Ossetic"
+msgstr ""
+
+#: conf/global_settings.py:121
+msgid "Punjabi"
+msgstr ""
+
+#: conf/global_settings.py:122
+msgid "Polish"
+msgstr ""
+
+#: conf/global_settings.py:123
+msgid "Portuguese"
+msgstr ""
+
+#: conf/global_settings.py:124
+msgid "Brazilian Portuguese"
+msgstr ""
+
+#: conf/global_settings.py:125
+msgid "Romanian"
+msgstr ""
+
+#: conf/global_settings.py:126
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:127
+msgid "Slovak"
+msgstr ""
+
+#: conf/global_settings.py:128
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:129
+msgid "Albanian"
+msgstr ""
+
+#: conf/global_settings.py:130
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:131
+msgid "Serbian Latin"
+msgstr ""
+
+#: conf/global_settings.py:132
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:133
+msgid "Swahili"
+msgstr ""
+
+#: conf/global_settings.py:134
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:135
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:136
+msgid "Thai"
+msgstr ""
+
+#: conf/global_settings.py:137
+msgid "Turkish"
+msgstr ""
+
+#: conf/global_settings.py:138
+msgid "Tatar"
+msgstr ""
+
+#: conf/global_settings.py:139
+msgid "Udmurt"
+msgstr ""
+
+#: conf/global_settings.py:140
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:141
+msgid "Urdu"
+msgstr ""
+
+#: conf/global_settings.py:142
+msgid "Vietnamese"
+msgstr ""
+
+#: conf/global_settings.py:143
+msgid "Simplified Chinese"
+msgstr ""
+
+#: conf/global_settings.py:144
+msgid "Traditional Chinese"
+msgstr ""
+
+#: contrib/messages/apps.py:7
+msgid "Messages"
+msgstr ""
+
+#: contrib/sitemaps/apps.py:7
+msgid "Site Maps"
+msgstr ""
+
+#: contrib/staticfiles/apps.py:9
+msgid "Static Files"
+msgstr ""
+
+#: contrib/syndication/apps.py:7
+msgid "Syndication"
+msgstr ""
+
+#: core/paginator.py:40
+msgid "That page number is not an integer"
+msgstr ""
+
+#: core/paginator.py:42
+msgid "That page number is less than 1"
+msgstr ""
+
+#: core/paginator.py:47
+msgid "That page contains no results"
+msgstr ""
+
+#: core/validators.py:31
+msgid "Enter a valid value."
+msgstr ""
+
+#: core/validators.py:102 forms/fields.py:649
+msgid "Enter a valid URL."
+msgstr ""
+
+#: core/validators.py:154
+msgid "Enter a valid integer."
+msgstr ""
+
+#: core/validators.py:165
+msgid "Enter a valid email address."
+msgstr ""
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+#: core/validators.py:239
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+
+#: core/validators.py:246
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+#: core/validators.py:255 core/validators.py:275
+msgid "Enter a valid IPv4 address."
+msgstr ""
+
+#: core/validators.py:260 core/validators.py:276
+msgid "Enter a valid IPv6 address."
+msgstr ""
+
+#: core/validators.py:270 core/validators.py:274
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr ""
+
+#: core/validators.py:304
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:310
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+
+#: core/validators.py:341
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+
+#: core/validators.py:350
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+
+#: core/validators.py:360
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:375
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:395
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:400
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:405
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+#: core/validators.py:512
+msgid "Null characters are not allowed."
+msgstr ""
+
+#: db/models/base.py:1119 forms/models.py:753
+msgid "and"
+msgstr ""
+
+#: db/models/base.py:1121
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:105
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+#: db/models/fields/__init__.py:106
+msgid "This field cannot be null."
+msgstr ""
+
+#: db/models/fields/__init__.py:107
+msgid "This field cannot be blank."
+msgstr ""
+
+#: db/models/fields/__init__.py:108
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr ""
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#: db/models/fields/__init__.py:112
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:129
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr ""
+
+#: db/models/fields/__init__.py:882 db/models/fields/__init__.py:1782
+msgid "Integer"
+msgstr ""
+
+#: db/models/fields/__init__.py:886 db/models/fields/__init__.py:1780
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:959 db/models/fields/__init__.py:1851
+msgid "Big (8 byte) integer"
+msgstr ""
+
+#: db/models/fields/__init__.py:971
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:973
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: db/models/fields/__init__.py:1039
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr ""
+
+#: db/models/fields/__init__.py:1102
+msgid "Comma-separated integers"
+msgstr ""
+
+#: db/models/fields/__init__.py:1150
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#: db/models/fields/__init__.py:1152 db/models/fields/__init__.py:1294
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+#: db/models/fields/__init__.py:1155
+msgid "Date (without time)"
+msgstr ""
+
+#: db/models/fields/__init__.py:1292
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#: db/models/fields/__init__.py:1296
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+#: db/models/fields/__init__.py:1300
+msgid "Date (with time)"
+msgstr ""
+
+#: db/models/fields/__init__.py:1447
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+#: db/models/fields/__init__.py:1449
+msgid "Decimal number"
+msgstr ""
+
+#: db/models/fields/__init__.py:1601
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+#: db/models/fields/__init__.py:1604
+msgid "Duration"
+msgstr ""
+
+#: db/models/fields/__init__.py:1656
+msgid "Email address"
+msgstr ""
+
+#: db/models/fields/__init__.py:1680
+msgid "File path"
+msgstr ""
+
+#: db/models/fields/__init__.py:1746
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+#: db/models/fields/__init__.py:1748
+msgid "Floating point number"
+msgstr ""
+
+#: db/models/fields/__init__.py:1866
+msgid "IPv4 address"
+msgstr ""
+
+#: db/models/fields/__init__.py:1897
+msgid "IP address"
+msgstr ""
+
+#: db/models/fields/__init__.py:1978
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:1980
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: db/models/fields/__init__.py:2043
+msgid "Positive integer"
+msgstr ""
+
+#: db/models/fields/__init__.py:2055
+msgid "Positive small integer"
+msgstr ""
+
+#: db/models/fields/__init__.py:2068
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr ""
+
+#: db/models/fields/__init__.py:2098
+msgid "Small integer"
+msgstr ""
+
+#: db/models/fields/__init__.py:2105
+msgid "Text"
+msgstr ""
+
+#: db/models/fields/__init__.py:2133
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#: db/models/fields/__init__.py:2135
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+#: db/models/fields/__init__.py:2138
+msgid "Time"
+msgstr ""
+
+#: db/models/fields/__init__.py:2263
+msgid "URL"
+msgstr ""
+
+#: db/models/fields/__init__.py:2286
+msgid "Raw binary data"
+msgstr ""
+
+#: db/models/fields/__init__.py:2333
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+#: db/models/fields/files.py:221
+msgid "File"
+msgstr ""
+
+#: db/models/fields/files.py:359
+msgid "Image"
+msgstr ""
+
+#: db/models/fields/related.py:780
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+#: db/models/fields/related.py:782
+msgid "Foreign Key (type determined by related field)"
+msgstr ""
+
+#: db/models/fields/related.py:1001
+msgid "One-to-one relationship"
+msgstr ""
+
+#: db/models/fields/related.py:1051
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#: db/models/fields/related.py:1052
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+#: db/models/fields/related.py:1094
+msgid "Many-to-many relationship"
+msgstr ""
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the label
+#: forms/boundfield.py:171
+msgid ":?.!"
+msgstr ""
+
+#: forms/fields.py:53
+msgid "This field is required."
+msgstr ""
+
+#: forms/fields.py:245
+msgid "Enter a whole number."
+msgstr ""
+
+#: forms/fields.py:290 forms/fields.py:325
+msgid "Enter a number."
+msgstr ""
+
+#: forms/fields.py:396 forms/fields.py:1114
+msgid "Enter a valid date."
+msgstr ""
+
+#: forms/fields.py:420 forms/fields.py:1115
+msgid "Enter a valid time."
+msgstr ""
+
+#: forms/fields.py:442
+msgid "Enter a valid date/time."
+msgstr ""
+
+#: forms/fields.py:471
+msgid "Enter a valid duration."
+msgstr ""
+
+#: forms/fields.py:525
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: forms/fields.py:526
+msgid "No file was submitted."
+msgstr ""
+
+#: forms/fields.py:527
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/fields.py:529
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/fields.py:532
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+
+#: forms/fields.py:597
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: forms/fields.py:753 forms/fields.py:843 forms/models.py:1267
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+
+#: forms/fields.py:844 forms/fields.py:959 forms/models.py:1266
+msgid "Enter a list of values."
+msgstr ""
+
+#: forms/fields.py:960
+msgid "Enter a complete value."
+msgstr ""
+
+#: forms/fields.py:1173
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+#: forms/forms.py:86
+msgid ":"
+msgstr ""
+
+#: forms/forms.py:207
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+#: forms/formsets.py:91
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#: forms/formsets.py:338
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/formsets.py:345
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/formsets.py:371 forms/formsets.py:373
+msgid "Order"
+msgstr ""
+
+#: forms/formsets.py:375
+msgid "Delete"
+msgstr ""
+
+#: forms/models.py:748
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr ""
+
+#: forms/models.py:752
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+
+#: forms/models.py:758
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+
+#: forms/models.py:767
+msgid "Please correct the duplicate values below."
+msgstr ""
+
+#: forms/models.py:1094
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+#: forms/models.py:1155
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+
+#: forms/models.py:1269
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#: forms/utils.py:162
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+
+#: forms/widgets.py:391
+msgid "Clear"
+msgstr ""
+
+#: forms/widgets.py:392
+msgid "Currently"
+msgstr ""
+
+#: forms/widgets.py:393
+msgid "Change"
+msgstr ""
+
+#: forms/widgets.py:706
+msgid "Unknown"
+msgstr ""
+
+#: forms/widgets.py:707
+msgid "Yes"
+msgstr ""
+
+#: forms/widgets.py:708
+msgid "No"
+msgstr ""
+
+#: template/defaultfilters.py:782
+msgid "yes,no,maybe"
+msgstr ""
+
+#: template/defaultfilters.py:811 template/defaultfilters.py:828
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:830
+#, python-format
+msgid "%s KB"
+msgstr ""
+
+#: template/defaultfilters.py:832
+#, python-format
+msgid "%s MB"
+msgstr ""
+
+#: template/defaultfilters.py:834
+#, python-format
+msgid "%s GB"
+msgstr ""
+
+#: template/defaultfilters.py:836
+#, python-format
+msgid "%s TB"
+msgstr ""
+
+#: template/defaultfilters.py:838
+#, python-format
+msgid "%s PB"
+msgstr ""
+
+#: utils/dateformat.py:62
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:63
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:68
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:69
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:150
+msgid "midnight"
+msgstr ""
+
+#: utils/dateformat.py:152
+msgid "noon"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "January"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "February"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "March"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "April"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "May"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "June"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "July"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "August"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "September"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "October"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "November"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "December"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "may"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:31
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr ""
+
+#: utils/dates.py:32
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr ""
+
+#: utils/dates.py:33
+msgctxt "abbrev. month"
+msgid "March"
+msgstr ""
+
+#: utils/dates.py:34
+msgctxt "abbrev. month"
+msgid "April"
+msgstr ""
+
+#: utils/dates.py:35
+msgctxt "abbrev. month"
+msgid "May"
+msgstr ""
+
+#: utils/dates.py:36
+msgctxt "abbrev. month"
+msgid "June"
+msgstr ""
+
+#: utils/dates.py:37
+msgctxt "abbrev. month"
+msgid "July"
+msgstr ""
+
+#: utils/dates.py:38
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr ""
+
+#: utils/dates.py:39
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr ""
+
+#: utils/dates.py:40
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr ""
+
+#: utils/dates.py:41
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr ""
+
+#: utils/dates.py:42
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr ""
+
+#: utils/dates.py:45
+msgctxt "alt. month"
+msgid "January"
+msgstr ""
+
+#: utils/dates.py:46
+msgctxt "alt. month"
+msgid "February"
+msgstr ""
+
+#: utils/dates.py:47
+msgctxt "alt. month"
+msgid "March"
+msgstr ""
+
+#: utils/dates.py:48
+msgctxt "alt. month"
+msgid "April"
+msgstr ""
+
+#: utils/dates.py:49
+msgctxt "alt. month"
+msgid "May"
+msgstr ""
+
+#: utils/dates.py:50
+msgctxt "alt. month"
+msgid "June"
+msgstr ""
+
+#: utils/dates.py:51
+msgctxt "alt. month"
+msgid "July"
+msgstr ""
+
+#: utils/dates.py:52
+msgctxt "alt. month"
+msgid "August"
+msgstr ""
+
+#: utils/dates.py:53
+msgctxt "alt. month"
+msgid "September"
+msgstr ""
+
+#: utils/dates.py:54
+msgctxt "alt. month"
+msgid "October"
+msgstr ""
+
+#: utils/dates.py:55
+msgctxt "alt. month"
+msgid "November"
+msgstr ""
+
+#: utils/dates.py:56
+msgctxt "alt. month"
+msgid "December"
+msgstr ""
+
+#: utils/ipv6.py:8
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#: utils/text.py:70
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr ""
+
+#: utils/text.py:237
+msgid "or"
+msgstr ""
+
+#. Translators: This string is used as a separator between list elements
+#: utils/text.py:256 utils/timesince.py:69
+msgid ", "
+msgstr ""
+
+#: utils/timesince.py:9
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:10
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:11
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:12
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:58
+msgid "0 minutes"
+msgstr ""
+
+#: views/csrf.py:110
+msgid "Forbidden"
+msgstr ""
+
+#: views/csrf.py:111
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+#: views/csrf.py:115
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+#: views/csrf.py:120
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+#: views/csrf.py:124
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+#: views/csrf.py:132
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+#: views/csrf.py:137
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+#: views/csrf.py:142
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+#: views/generic/dates.py:41
+msgid "No year specified"
+msgstr ""
+
+#: views/generic/dates.py:61 views/generic/dates.py:111
+#: views/generic/dates.py:208
+msgid "Date out of range"
+msgstr ""
+
+#: views/generic/dates.py:90
+msgid "No month specified"
+msgstr ""
+
+#: views/generic/dates.py:142
+msgid "No day specified"
+msgstr ""
+
+#: views/generic/dates.py:188
+msgid "No week specified"
+msgstr ""
+
+#: views/generic/dates.py:338 views/generic/dates.py:367
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr ""
+
+#: views/generic/dates.py:585
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+
+#: views/generic/dates.py:619
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+
+#: views/generic/detail.py:53
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr ""
+
+#: views/generic/list.py:67
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+
+#: views/generic/list.py:72
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr ""
+
+#: views/generic/list.py:154
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr ""
+
+#: views/static.py:41
+msgid "Directory indexes are not allowed here."
+msgstr ""
+
+#: views/static.py:43
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr ""
+
+#: views/static.py:83
+#, python-format
+msgid "Index of %(directory)s"
+msgstr ""
+
+#: views/templates/default_urlconf.html:6
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#: views/templates/default_urlconf.html:370
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+#: views/templates/default_urlconf.html:392
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#: views/templates/default_urlconf.html:393
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+#: views/templates/default_urlconf.html:407
+msgid "Django Documentation"
+msgstr ""
+
+#: views/templates/default_urlconf.html:408
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+#: views/templates/default_urlconf.html:417
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+#: views/templates/default_urlconf.html:418
+msgid "Get started with Django"
+msgstr ""
+
+#: views/templates/default_urlconf.html:427
+msgid "Django Community"
+msgstr ""
+
+#: views/templates/default_urlconf.html:428
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..7c3d7cc
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..5c5c97d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/formats.py
new file mode 100644
index 0000000..dd226fc
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en/formats.py
@@ -0,0 +1,40 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'N j, Y'
+TIME_FORMAT = 'P'
+DATETIME_FORMAT = 'N j, Y, P'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'F j'
+SHORT_DATE_FORMAT = 'm/d/Y'
+SHORT_DATETIME_FORMAT = 'm/d/Y P'
+FIRST_DAY_OF_WEEK = 0 # Sunday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# Kept ISO formats as they are in first position
+DATE_INPUT_FORMATS = [
+ '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
+ # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
+ # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
+ # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
+ # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
+]
+DATETIME_INPUT_FORMATS = [
+ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
+ '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
+ '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
+ '%Y-%m-%d', # '2006-10-25'
+ '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
+ '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200'
+ '%m/%d/%Y %H:%M', # '10/25/2006 14:30'
+ '%m/%d/%Y', # '10/25/2006'
+ '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
+ '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200'
+ '%m/%d/%y %H:%M', # '10/25/06 14:30'
+ '%m/%d/%y', # '10/25/06'
+]
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..7fbbf94
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po
new file mode 100644
index 0000000..ce059c9
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po
@@ -0,0 +1,1205 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Tom Fifield , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: English (Australia) (http://www.transifex.com/django/django/"
+"language/en_AU/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_AU\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+msgid "Arabic"
+msgstr "Arabic"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "Azerbaijani"
+
+msgid "Bulgarian"
+msgstr "Bulgarian"
+
+msgid "Belarusian"
+msgstr "Belarusian"
+
+msgid "Bengali"
+msgstr "Bengali"
+
+msgid "Breton"
+msgstr "Breton"
+
+msgid "Bosnian"
+msgstr "Bosnian"
+
+msgid "Catalan"
+msgstr "Catalan"
+
+msgid "Czech"
+msgstr "Czech"
+
+msgid "Welsh"
+msgstr "Welsh"
+
+msgid "Danish"
+msgstr "Danish"
+
+msgid "German"
+msgstr "German"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Greek"
+
+msgid "English"
+msgstr "English"
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr "British English"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Spanish"
+
+msgid "Argentinian Spanish"
+msgstr "Argentinian Spanish"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Mexican Spanish"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nicaraguan Spanish"
+
+msgid "Venezuelan Spanish"
+msgstr "Venezuelan Spanish"
+
+msgid "Estonian"
+msgstr "Estonian"
+
+msgid "Basque"
+msgstr "Basque"
+
+msgid "Persian"
+msgstr "Persian"
+
+msgid "Finnish"
+msgstr "Finnish"
+
+msgid "French"
+msgstr "French"
+
+msgid "Frisian"
+msgstr "Frisian"
+
+msgid "Irish"
+msgstr "Irish"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Galician"
+
+msgid "Hebrew"
+msgstr "Hebrew"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croatian"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Hungarian"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesian"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "Icelandic"
+
+msgid "Italian"
+msgstr "Italian"
+
+msgid "Japanese"
+msgstr "Japanese"
+
+msgid "Georgian"
+msgstr "Georgian"
+
+msgid "Kazakh"
+msgstr "Kazakh"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Korean"
+
+msgid "Luxembourgish"
+msgstr "Luxembourgish"
+
+msgid "Lithuanian"
+msgstr "Lithuanian"
+
+msgid "Latvian"
+msgstr "Latvian"
+
+msgid "Macedonian"
+msgstr "Macedonian"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongolian"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr "Burmese"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Nepali"
+
+msgid "Dutch"
+msgstr "Dutch"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norwegian Nynorsk"
+
+msgid "Ossetic"
+msgstr "Ossetic"
+
+msgid "Punjabi"
+msgstr "Punjabi"
+
+msgid "Polish"
+msgstr "Polish"
+
+msgid "Portuguese"
+msgstr "Portuguese"
+
+msgid "Brazilian Portuguese"
+msgstr "Brazilian Portuguese"
+
+msgid "Romanian"
+msgstr "Romanian"
+
+msgid "Russian"
+msgstr "Russian"
+
+msgid "Slovak"
+msgstr "Slovak"
+
+msgid "Slovenian"
+msgstr "Slovenian"
+
+msgid "Albanian"
+msgstr "Albanian"
+
+msgid "Serbian"
+msgstr "Serbian"
+
+msgid "Serbian Latin"
+msgstr "Serbian Latin"
+
+msgid "Swedish"
+msgstr "Swedish"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Thai"
+
+msgid "Turkish"
+msgstr "Turkish"
+
+msgid "Tatar"
+msgstr "Tatar"
+
+msgid "Udmurt"
+msgstr "Udmurt"
+
+msgid "Ukrainian"
+msgstr "Ukrainian"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamese"
+
+msgid "Simplified Chinese"
+msgstr "Simplified Chinese"
+
+msgid "Traditional Chinese"
+msgstr "Traditional Chinese"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Enter a valid value."
+
+msgid "Enter a valid URL."
+msgstr "Enter a valid URL."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr "Enter a valid email address."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Enter a valid IPv4 address."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Enter a valid IPv6 address."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Enter a valid IPv4 or IPv6 address."
+
+msgid "Enter only digits separated by commas."
+msgstr "Enter only digits separated by commas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Ensure this value is less than or equal to %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Ensure this value is greater than or equal to %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgstr[1] ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgstr[1] ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Ensure that there are no more than %(max)s digit in total."
+msgstr[1] "Ensure that there are no more than %(max)s digits in total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Ensure that there are no more than %(max)s decimal place."
+msgstr[1] "Ensure that there are no more than %(max)s decimal places."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgstr[1] ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "and"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "This field cannot be null."
+
+msgid "This field cannot be blank."
+msgstr "This field cannot be blank."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s with this %(field_label)s already exists."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Field of type: %(field_type)s"
+
+msgid "Integer"
+msgstr "Integer"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Big (8 byte) integer"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Either True or False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (up to %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Comma-separated integers"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Date (without time)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Date (with time)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Decimal number"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Email address"
+
+msgid "File path"
+msgstr "File path"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Floating point number"
+
+msgid "IPv4 address"
+msgstr "IPv4 address"
+
+msgid "IP address"
+msgstr "IP address"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Either True, False or None)"
+
+msgid "Positive integer"
+msgstr "Positive integer"
+
+msgid "Positive small integer"
+msgstr "Positive small integer"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (up to %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Small integer"
+
+msgid "Text"
+msgstr "Text"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Time"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Raw binary data"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "File"
+
+msgid "Image"
+msgstr "Image"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Foreign Key (type determined by related field)"
+
+msgid "One-to-one relationship"
+msgstr "One-to-one relationship"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Many-to-many relationship"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "This field is required."
+
+msgid "Enter a whole number."
+msgstr "Enter a whole number."
+
+msgid "Enter a number."
+msgstr "Enter a number."
+
+msgid "Enter a valid date."
+msgstr "Enter a valid date."
+
+msgid "Enter a valid time."
+msgstr "Enter a valid time."
+
+msgid "Enter a valid date/time."
+msgstr "Enter a valid date/time."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "No file was submitted. Check the encoding type on the form."
+
+msgid "No file was submitted."
+msgstr "No file was submitted."
+
+msgid "The submitted file is empty."
+msgstr "The submitted file is empty."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgstr[1] ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Please either submit a file or check the clear checkbox, not both."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Select a valid choice. %(value)s is not one of the available choices."
+
+msgid "Enter a list of values."
+msgstr "Enter a list of values."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Hidden field %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Please submit %d or fewer forms."
+msgstr[1] "Please submit %d or fewer forms."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "Order"
+
+msgid "Delete"
+msgstr "Delete"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Please correct the duplicate data for %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Please correct the duplicate data for %(field)s, which must be unique."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Please correct the duplicate values below."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Select a valid choice. That choice is not one of the available choices."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+
+msgid "Clear"
+msgstr "Clear"
+
+msgid "Currently"
+msgstr "Currently"
+
+msgid "Change"
+msgstr "Change"
+
+msgid "Unknown"
+msgstr "Unknown"
+
+msgid "Yes"
+msgstr "Yes"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "yes,no,maybe"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "midnight"
+
+msgid "noon"
+msgstr "noon"
+
+msgid "Monday"
+msgstr "Monday"
+
+msgid "Tuesday"
+msgstr "Tuesday"
+
+msgid "Wednesday"
+msgstr "Wednesday"
+
+msgid "Thursday"
+msgstr "Thursday"
+
+msgid "Friday"
+msgstr "Friday"
+
+msgid "Saturday"
+msgstr "Saturday"
+
+msgid "Sunday"
+msgstr "Sunday"
+
+msgid "Mon"
+msgstr "Mon"
+
+msgid "Tue"
+msgstr "Tue"
+
+msgid "Wed"
+msgstr "Wed"
+
+msgid "Thu"
+msgstr "Thu"
+
+msgid "Fri"
+msgstr "Fri"
+
+msgid "Sat"
+msgstr "Sat"
+
+msgid "Sun"
+msgstr "Sun"
+
+msgid "January"
+msgstr "January"
+
+msgid "February"
+msgstr "February"
+
+msgid "March"
+msgstr "March"
+
+msgid "April"
+msgstr "April"
+
+msgid "May"
+msgstr "May"
+
+msgid "June"
+msgstr "June"
+
+msgid "July"
+msgstr "July"
+
+msgid "August"
+msgstr "August"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "October"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "December"
+
+msgid "jan"
+msgstr "jan"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "aug"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dec"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "March"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "May"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "June"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "July"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Aug."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dec."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "January"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "February"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "March"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "May"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "June"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "July"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "August"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "September"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "October"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "November"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "December"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "or"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d year"
+msgstr[1] "%d years"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d month"
+msgstr[1] "%d months"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d week"
+msgstr[1] "%d weeks"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d day"
+msgstr[1] "%d days"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hour"
+msgstr[1] "%d hours"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minute"
+msgstr[1] "%d minutes"
+
+msgid "0 minutes"
+msgstr "0 minutes"
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "No year specified"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "No month specified"
+
+msgid "No day specified"
+msgstr "No day specified"
+
+msgid "No week specified"
+msgstr "No week specified"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "No %(verbose_name_plural)s available"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Invalid date string '%(datestr)s' given format '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No %(verbose_name)s found matching the query"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Page is not 'last', nor can it be converted to an int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Invalid page (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Empty list and '%(class_name)s.allow_empty' is False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Directory indexes are not allowed here."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" does not exist"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Index of %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..6c67744
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..2494417
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/formats.py
new file mode 100644
index 0000000..378c183
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_AU/formats.py
@@ -0,0 +1,39 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j M Y' # '25 Oct 2006'
+TIME_FORMAT = 'P' # '2:30 p.m.'
+DATETIME_FORMAT = 'j M Y, P' # '25 Oct 2006, 2:30 p.m.'
+YEAR_MONTH_FORMAT = 'F Y' # 'October 2006'
+MONTH_DAY_FORMAT = 'j F' # '25 October'
+SHORT_DATE_FORMAT = 'd/m/Y' # '25/10/2006'
+SHORT_DATETIME_FORMAT = 'd/m/Y P' # '25/10/2006 2:30 p.m.'
+FIRST_DAY_OF_WEEK = 0 # Sunday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06'
+ # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
+ # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
+ # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
+ # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
+]
+DATETIME_INPUT_FORMATS = [
+ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
+ '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
+ '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
+ '%Y-%m-%d', # '2006-10-25'
+ '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59'
+ '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200'
+ '%d/%m/%Y %H:%M', # '25/10/2006 14:30'
+ '%d/%m/%Y', # '25/10/2006'
+ '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59'
+ '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200'
+ '%d/%m/%y %H:%M', # '25/10/06 14:30'
+ '%d/%m/%y', # '25/10/06'
+]
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..9c7be4c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po
new file mode 100644
index 0000000..3810698
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po
@@ -0,0 +1,1195 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel , 2011
+# jon_atkinson , 2011-2012
+# Ross Poulton , 2011-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/django/"
+"django/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr ""
+
+msgid "Arabic"
+msgstr "Arabic"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "Azerbaijani"
+
+msgid "Bulgarian"
+msgstr "Bulgarian"
+
+msgid "Belarusian"
+msgstr ""
+
+msgid "Bengali"
+msgstr "Bengali"
+
+msgid "Breton"
+msgstr ""
+
+msgid "Bosnian"
+msgstr "Bosnian"
+
+msgid "Catalan"
+msgstr "Catalan"
+
+msgid "Czech"
+msgstr "Czech"
+
+msgid "Welsh"
+msgstr "Welsh"
+
+msgid "Danish"
+msgstr "Danish"
+
+msgid "German"
+msgstr "German"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Greek"
+
+msgid "English"
+msgstr "English"
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr "British English"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Spanish"
+
+msgid "Argentinian Spanish"
+msgstr "Argentinian Spanish"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Mexican Spanish"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nicaraguan Spanish"
+
+msgid "Venezuelan Spanish"
+msgstr ""
+
+msgid "Estonian"
+msgstr "Estonian"
+
+msgid "Basque"
+msgstr "Basque"
+
+msgid "Persian"
+msgstr "Persian"
+
+msgid "Finnish"
+msgstr "Finnish"
+
+msgid "French"
+msgstr "French"
+
+msgid "Frisian"
+msgstr "Frisian"
+
+msgid "Irish"
+msgstr "Irish"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Galician"
+
+msgid "Hebrew"
+msgstr "Hebrew"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croatian"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Hungarian"
+
+msgid "Interlingua"
+msgstr ""
+
+msgid "Indonesian"
+msgstr "Indonesian"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "Icelandic"
+
+msgid "Italian"
+msgstr "Italian"
+
+msgid "Japanese"
+msgstr "Japanese"
+
+msgid "Georgian"
+msgstr "Georgian"
+
+msgid "Kazakh"
+msgstr "Kazakh"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Korean"
+
+msgid "Luxembourgish"
+msgstr ""
+
+msgid "Lithuanian"
+msgstr "Lithuanian"
+
+msgid "Latvian"
+msgstr "Latvian"
+
+msgid "Macedonian"
+msgstr "Macedonian"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongolian"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr ""
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Nepali"
+
+msgid "Dutch"
+msgstr "Dutch"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norwegian Nynorsk"
+
+msgid "Ossetic"
+msgstr ""
+
+msgid "Punjabi"
+msgstr "Punjabi"
+
+msgid "Polish"
+msgstr "Polish"
+
+msgid "Portuguese"
+msgstr "Portuguese"
+
+msgid "Brazilian Portuguese"
+msgstr "Brazilian Portuguese"
+
+msgid "Romanian"
+msgstr "Romanian"
+
+msgid "Russian"
+msgstr "Russian"
+
+msgid "Slovak"
+msgstr "Slovak"
+
+msgid "Slovenian"
+msgstr "Slovenian"
+
+msgid "Albanian"
+msgstr "Albanian"
+
+msgid "Serbian"
+msgstr "Serbian"
+
+msgid "Serbian Latin"
+msgstr "Serbian Latin"
+
+msgid "Swedish"
+msgstr "Swedish"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Thai"
+
+msgid "Turkish"
+msgstr "Turkish"
+
+msgid "Tatar"
+msgstr "Tatar"
+
+msgid "Udmurt"
+msgstr ""
+
+msgid "Ukrainian"
+msgstr "Ukrainian"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamese"
+
+msgid "Simplified Chinese"
+msgstr "Simplified Chinese"
+
+msgid "Traditional Chinese"
+msgstr "Traditional Chinese"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Enter a valid value."
+
+msgid "Enter a valid URL."
+msgstr "Enter a valid URL."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr ""
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Enter a valid IPv4 address."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Enter a valid IPv6 address."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Enter a valid IPv4 or IPv6 address."
+
+msgid "Enter only digits separated by commas."
+msgstr "Enter only digits separated by commas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Ensure this value is less than or equal to %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Ensure this value is greater than or equal to %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "and"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "This field cannot be null."
+
+msgid "This field cannot be blank."
+msgstr "This field cannot be blank."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s with this %(field_label)s already exists."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Field of type: %(field_type)s"
+
+msgid "Integer"
+msgstr "Integer"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Big (8 byte) integer"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Either True or False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (up to %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Comma-separated integers"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Date (without time)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Date (with time)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Decimal number"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Email address"
+
+msgid "File path"
+msgstr "File path"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Floating point number"
+
+msgid "IPv4 address"
+msgstr "IPv4 address"
+
+msgid "IP address"
+msgstr "IP address"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Either True, False or None)"
+
+msgid "Positive integer"
+msgstr "Positive integer"
+
+msgid "Positive small integer"
+msgstr "Positive small integer"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (up to %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Small integer"
+
+msgid "Text"
+msgstr "Text"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Time"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "File"
+
+msgid "Image"
+msgstr "Image"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Foreign Key (type determined by related field)"
+
+msgid "One-to-one relationship"
+msgstr "One-to-one relationship"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Many-to-many relationship"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ""
+
+msgid "This field is required."
+msgstr "This field is required."
+
+msgid "Enter a whole number."
+msgstr "Enter a whole number."
+
+msgid "Enter a number."
+msgstr "Enter a number."
+
+msgid "Enter a valid date."
+msgstr "Enter a valid date."
+
+msgid "Enter a valid time."
+msgstr "Enter a valid time."
+
+msgid "Enter a valid date/time."
+msgstr "Enter a valid date/time."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "No file was submitted. Check the encoding type on the form."
+
+msgid "No file was submitted."
+msgstr "No file was submitted."
+
+msgid "The submitted file is empty."
+msgstr "The submitted file is empty."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Please either submit a file or check the clear checkbox, not both."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Select a valid choice. %(value)s is not one of the available choices."
+
+msgid "Enter a list of values."
+msgstr "Enter a list of values."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ""
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "Order"
+
+msgid "Delete"
+msgstr "Delete"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Please correct the duplicate data for %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Please correct the duplicate data for %(field)s, which must be unique."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Please correct the duplicate values below."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Select a valid choice. That choice is not one of the available choices."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+
+msgid "Clear"
+msgstr "Clear"
+
+msgid "Currently"
+msgstr "Currently"
+
+msgid "Change"
+msgstr "Change"
+
+msgid "Unknown"
+msgstr "Unknown"
+
+msgid "Yes"
+msgstr "Yes"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "yes,no,maybe"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "midnight"
+
+msgid "noon"
+msgstr "noon"
+
+msgid "Monday"
+msgstr "Monday"
+
+msgid "Tuesday"
+msgstr "Tuesday"
+
+msgid "Wednesday"
+msgstr "Wednesday"
+
+msgid "Thursday"
+msgstr "Thursday"
+
+msgid "Friday"
+msgstr "Friday"
+
+msgid "Saturday"
+msgstr "Saturday"
+
+msgid "Sunday"
+msgstr "Sunday"
+
+msgid "Mon"
+msgstr "Mon"
+
+msgid "Tue"
+msgstr "Tue"
+
+msgid "Wed"
+msgstr "Wed"
+
+msgid "Thu"
+msgstr "Thu"
+
+msgid "Fri"
+msgstr "Fri"
+
+msgid "Sat"
+msgstr "Sat"
+
+msgid "Sun"
+msgstr "Sun"
+
+msgid "January"
+msgstr "January"
+
+msgid "February"
+msgstr "February"
+
+msgid "March"
+msgstr "March"
+
+msgid "April"
+msgstr "April"
+
+msgid "May"
+msgstr "May"
+
+msgid "June"
+msgstr "June"
+
+msgid "July"
+msgstr "July"
+
+msgid "August"
+msgstr "August"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "October"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "December"
+
+msgid "jan"
+msgstr "jan"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "aug"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dec"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "March"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "May"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "June"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "July"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Aug."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dec."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "January"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "February"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "March"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "April"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "May"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "June"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "July"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "August"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "September"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "October"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "November"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "December"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "or"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "0 minutes"
+msgstr ""
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "No year specified"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "No month specified"
+
+msgid "No day specified"
+msgstr "No day specified"
+
+msgid "No week specified"
+msgstr "No week specified"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "No %(verbose_name_plural)s available"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Invalid date string '%(datestr)s' given format '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No %(verbose_name)s found matching the query"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Page is not 'last', nor can it be converted to an int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr ""
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Empty list and '%(class_name)s.allow_empty' is False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Directory indexes are not allowed here."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" does not exist"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Index of %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..cdb2340
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..bc33e0b
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/formats.py
new file mode 100644
index 0000000..5f90688
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/en_GB/formats.py
@@ -0,0 +1,39 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j M Y' # '25 Oct 2006'
+TIME_FORMAT = 'P' # '2:30 p.m.'
+DATETIME_FORMAT = 'j M Y, P' # '25 Oct 2006, 2:30 p.m.'
+YEAR_MONTH_FORMAT = 'F Y' # 'October 2006'
+MONTH_DAY_FORMAT = 'j F' # '25 October'
+SHORT_DATE_FORMAT = 'd/m/Y' # '25/10/2006'
+SHORT_DATETIME_FORMAT = 'd/m/Y P' # '25/10/2006 2:30 p.m.'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06'
+ # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
+ # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
+ # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
+ # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
+]
+DATETIME_INPUT_FORMATS = [
+ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
+ '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
+ '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
+ '%Y-%m-%d', # '2006-10-25'
+ '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59'
+ '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200'
+ '%d/%m/%Y %H:%M', # '25/10/2006 14:30'
+ '%d/%m/%Y', # '25/10/2006'
+ '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59'
+ '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200'
+ '%d/%m/%y %H:%M', # '25/10/06 14:30'
+ '%d/%m/%y', # '25/10/06'
+]
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..5002214
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po
new file mode 100644
index 0000000..e54975b
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po
@@ -0,0 +1,1248 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Baptiste Darthenay , 2012-2013
+# Baptiste Darthenay , 2013-2017
+# batisteo , 2011
+# Dinu Gherman , 2011
+# kristjan , 2011
+# Nikolay Korotkiy , 2017
+# Adamo Mesha , 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Esperanto (http://www.transifex.com/django/django/language/"
+"eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikansa"
+
+msgid "Arabic"
+msgstr "Araba"
+
+msgid "Asturian"
+msgstr "Asturia"
+
+msgid "Azerbaijani"
+msgstr "Azerbajĝana"
+
+msgid "Bulgarian"
+msgstr "Bulgara"
+
+msgid "Belarusian"
+msgstr "Belorusa"
+
+msgid "Bengali"
+msgstr "Bengala"
+
+msgid "Breton"
+msgstr "Bretona"
+
+msgid "Bosnian"
+msgstr "Bosnia"
+
+msgid "Catalan"
+msgstr "Kataluna"
+
+msgid "Czech"
+msgstr "Ĉeĥa"
+
+msgid "Welsh"
+msgstr "Kimra"
+
+msgid "Danish"
+msgstr "Dana"
+
+msgid "German"
+msgstr "Germana"
+
+msgid "Lower Sorbian"
+msgstr "Malsuprasaroba"
+
+msgid "Greek"
+msgstr "Greka"
+
+msgid "English"
+msgstr "Angla"
+
+msgid "Australian English"
+msgstr "Angla (Aŭstralia)"
+
+msgid "British English"
+msgstr "Angla (Brita)"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Hispana"
+
+msgid "Argentinian Spanish"
+msgstr "Hispana (Argentinio)"
+
+msgid "Colombian Spanish"
+msgstr "Hispana (Kolombio)"
+
+msgid "Mexican Spanish"
+msgstr "Hispana (Meksiko)"
+
+msgid "Nicaraguan Spanish"
+msgstr "Hispana (Nikaragvo)"
+
+msgid "Venezuelan Spanish"
+msgstr "Hispana (Venezuelo)"
+
+msgid "Estonian"
+msgstr "Estona"
+
+msgid "Basque"
+msgstr "Eŭska"
+
+msgid "Persian"
+msgstr "Persa"
+
+msgid "Finnish"
+msgstr "Finna"
+
+msgid "French"
+msgstr "Franca"
+
+msgid "Frisian"
+msgstr "Frisa"
+
+msgid "Irish"
+msgstr "Irlanda"
+
+msgid "Scottish Gaelic"
+msgstr "Skota gaela"
+
+msgid "Galician"
+msgstr "Galega"
+
+msgid "Hebrew"
+msgstr "Hebrea"
+
+msgid "Hindi"
+msgstr "Hinda"
+
+msgid "Croatian"
+msgstr "Kroata"
+
+msgid "Upper Sorbian"
+msgstr "Suprasoraba"
+
+msgid "Hungarian"
+msgstr "Hungara"
+
+msgid "Interlingua"
+msgstr "Interlingvaa"
+
+msgid "Indonesian"
+msgstr "Indoneza"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islanda"
+
+msgid "Italian"
+msgstr "Itala"
+
+msgid "Japanese"
+msgstr "Japana"
+
+msgid "Georgian"
+msgstr "Kartvela"
+
+msgid "Kazakh"
+msgstr "Kazaĥa"
+
+msgid "Khmer"
+msgstr "Kmera"
+
+msgid "Kannada"
+msgstr "Kanara"
+
+msgid "Korean"
+msgstr "Korea"
+
+msgid "Luxembourgish"
+msgstr "Lukszemburga"
+
+msgid "Lithuanian"
+msgstr "Litova"
+
+msgid "Latvian"
+msgstr "Latva"
+
+msgid "Macedonian"
+msgstr "Makedona"
+
+msgid "Malayalam"
+msgstr "Malajala"
+
+msgid "Mongolian"
+msgstr "Mongola"
+
+msgid "Marathi"
+msgstr "Marata"
+
+msgid "Burmese"
+msgstr "Birma"
+
+msgid "Norwegian Bokmål"
+msgstr "Norvega Bbokmål"
+
+msgid "Nepali"
+msgstr "Nepala"
+
+msgid "Dutch"
+msgstr "Nederlanda"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norvega (nynorsk)"
+
+msgid "Ossetic"
+msgstr "Oseta"
+
+msgid "Punjabi"
+msgstr "Panĝaba"
+
+msgid "Polish"
+msgstr "Pola"
+
+msgid "Portuguese"
+msgstr "Portugala"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugala (Brazilo)"
+
+msgid "Romanian"
+msgstr "Rumana"
+
+msgid "Russian"
+msgstr "Rusa"
+
+msgid "Slovak"
+msgstr "Slovaka"
+
+msgid "Slovenian"
+msgstr "Slovena"
+
+msgid "Albanian"
+msgstr "Albana"
+
+msgid "Serbian"
+msgstr "Serba"
+
+msgid "Serbian Latin"
+msgstr "Serba (latina)"
+
+msgid "Swedish"
+msgstr "Sveda"
+
+msgid "Swahili"
+msgstr "Svahila"
+
+msgid "Tamil"
+msgstr "Tamila"
+
+msgid "Telugu"
+msgstr "Telugua"
+
+msgid "Thai"
+msgstr "Taja"
+
+msgid "Turkish"
+msgstr "Turka"
+
+msgid "Tatar"
+msgstr "Tatara"
+
+msgid "Udmurt"
+msgstr "Udmurta"
+
+msgid "Ukrainian"
+msgstr "Ukraina"
+
+msgid "Urdu"
+msgstr "Urdua"
+
+msgid "Vietnamese"
+msgstr "Vjetnama"
+
+msgid "Simplified Chinese"
+msgstr "Ĉina (simpligite)"
+
+msgid "Traditional Chinese"
+msgstr "Ĉina (tradicie)"
+
+msgid "Messages"
+msgstr "Mesaĝoj"
+
+msgid "Site Maps"
+msgstr "Retejaj mapoj"
+
+msgid "Static Files"
+msgstr "Statikaj dosieroj"
+
+msgid "Syndication"
+msgstr "Abonrilato"
+
+msgid "That page number is not an integer"
+msgstr "Tuo paĝnumero ne estas entjero"
+
+msgid "That page number is less than 1"
+msgstr "Tuo paĝnumero estas malpli ol 1"
+
+msgid "That page contains no results"
+msgstr "Tiu paĝo ne enhavas rezultojn"
+
+msgid "Enter a valid value."
+msgstr "Enigu validan valoron."
+
+msgid "Enter a valid URL."
+msgstr "Enigu validan adreson."
+
+msgid "Enter a valid integer."
+msgstr "Enigu validan entjero."
+
+msgid "Enter a valid email address."
+msgstr "Enigu validan retpoŝtan adreson."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Tiu kampo nur devas havi literojn, nombrojn, substrekojn aŭ streketojn."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Tiu kampo nur devas enhavi Unikodajn literojn, nombrojn, substrekojn aŭ "
+"streketojn."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Enigu validan IPv4-adreson."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Enigu validan IPv6-adreson."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Enigu validan IPv4 aŭ IPv6-adreson."
+
+msgid "Enter only digits separated by commas."
+msgstr "Enigu nur ciferojn apartigitajn per komoj."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Certigu ke ĉi tiu valoro estas %(limit_value)s (ĝi estas %(show_value)s). "
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Certigu ke ĉi tiu valoro estas malpli ol aŭ egala al %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Certigu ke ĉi tiu valoro estas pli ol aŭ egala al %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Certigu, ke tiu valuto havas %(limit_value)d karaktero (ĝi havas "
+"%(show_value)d)."
+msgstr[1] ""
+"Certigu, ke tiu valuto havas %(limit_value)d karakteroj (ĝi havas "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Certigu, ke tio valuto maksimume havas %(limit_value)d karakterojn (ĝi havas "
+"%(show_value)d)."
+msgstr[1] ""
+"Certigu, ke tio valuto maksimume havas %(limit_value)d karakterojn (ĝi havas "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Certigu ke ne estas pli ol %(max)s cifero entute."
+msgstr[1] "Certigu ke ne estas pli ol %(max)s ciferoj entute."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Certigu, ke ne estas pli ol %(max)s dekumaj lokoj."
+msgstr[1] "Certigu, ke ne estas pli ol %(max)s dekumaj lokoj."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "Certigu ke ne estas pli ol %(max)s ciferoj antaŭ la dekuma punkto."
+msgstr[1] "Certigu ke ne estas pli ol %(max)s ciferoj antaŭ la dekuma punkto."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"dosiersufikso '%(extension)s' ne estas permesita. Permesitaj dosiersufiksoj "
+"estas: '%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "kaj"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s kun tiuj %(field_labels)s jam ekzistas."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Valoro %(value)r ne estas valida elekto."
+
+msgid "This field cannot be null."
+msgstr "Tiu ĉi kampo ne povas esti senvalora (null)."
+
+msgid "This field cannot be blank."
+msgstr "Tiu ĉi kampo ne povas esti malplena."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s kun tiu %(field_label)s jam ekzistas."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s devas esti unika por %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Kampo de tipo: %(field_type)s"
+
+msgid "Integer"
+msgstr "Entjero"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' valoro devas esti entjero."
+
+msgid "Big (8 byte) integer"
+msgstr "Granda (8 bitoka) entjero"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s' valoro devas esti Vera aŭ Malvera"
+
+msgid "Boolean (Either True or False)"
+msgstr "Bulea (Vera aŭ Malvera)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Ĉeno (ĝis %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Kom-apartigitaj entjeroj"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' valoro ne havas validan datformaton. Ĝi devas esti kiel formato "
+"JJJJ-MM-TT."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"'%(value)s' valoro havas la ĝustan formaton (JJJJ-MM-TT), sed ne estas "
+"valida dato."
+
+msgid "Date (without time)"
+msgstr "Dato (sen horo)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"'%(value)s' valoro ne havas validan formaton. Ĝi devas esti kiel formato "
+"JJJJ-MM-TT HH:MM[:ss[.uuuuuu]][HZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"'%(value)s' valoro havas la ĝustan formaton (JJJJ-MM-TT HH:MM[:ss[.uuuuuu]]"
+"[HZ]), sed ne estas valida dato kaj horo."
+
+msgid "Date (with time)"
+msgstr "Dato (kun horo)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "'%(value)s' valoro devas esti dekuma nombro."
+
+msgid "Decimal number"
+msgstr "Dekuma nombro"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"'%(value)s' valoro ne havas validan formaton. Ĝi devas esti kiel formato "
+"[DD] [HH:[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Daŭro"
+
+msgid "Email address"
+msgstr "Retpoŝtadreso"
+
+msgid "File path"
+msgstr "Dosiervojo"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "'%(value)s' valoro devas esti glitkoma nombro."
+
+msgid "Floating point number"
+msgstr "Glitkoma nombro"
+
+msgid "IPv4 address"
+msgstr "IPv4-adreso"
+
+msgid "IP address"
+msgstr "IP-adreso"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "'%(value)s' valoro devas esti Neniu, Vera aŭ Malvera."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Buleo (Vera, Malvera aŭ Neniu)"
+
+msgid "Positive integer"
+msgstr "Pozitiva entjero"
+
+msgid "Positive small integer"
+msgstr "Pozitiva malgranda entjero"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Ĵetonvorto (ĝis %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Malgranda entjero"
+
+msgid "Text"
+msgstr "Teksto"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"'%(value)s' valoro ne havas validan formaton. Ĝi devas esti laŭ la formato "
+"HH:MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"'%(value)s' valoro havas ĝustan formaton (HH:MM[:ss[.uuuuuu]]), sed ne estas "
+"valida horo."
+
+msgid "Time"
+msgstr "Horo"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Kruda binara datumo"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' ne estas valida UUID."
+
+msgid "File"
+msgstr "Dosiero"
+
+msgid "Image"
+msgstr "Bildo"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "%(model)s kazo kun %(field)s %(value)r ne ekzistas."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Fremda ŝlosilo (tipo determinita per rilata kampo)"
+
+msgid "One-to-one relationship"
+msgstr "Unu-al-unu rilato"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "%(from)s-%(to)s rilato"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "%(from)s-%(to)s rilatoj"
+
+msgid "Many-to-many relationship"
+msgstr "Mult-al-multa rilato"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Ĉi tiu kampo estas deviga."
+
+msgid "Enter a whole number."
+msgstr "Enigu plenan nombron."
+
+msgid "Enter a number."
+msgstr "Enigu nombron."
+
+msgid "Enter a valid date."
+msgstr "Enigu validan daton."
+
+msgid "Enter a valid time."
+msgstr "Enigu validan horon."
+
+msgid "Enter a valid date/time."
+msgstr "Enigu validan daton/tempon."
+
+msgid "Enter a valid duration."
+msgstr "Enigu validan daŭron."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Neniu dosiero estis alŝutita. Kontrolu la kodoprezentan tipon en la "
+"formularo."
+
+msgid "No file was submitted."
+msgstr "Neniu dosiero estis alŝutita."
+
+msgid "The submitted file is empty."
+msgstr "La alŝutita dosiero estas malplena."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Certigu, ke tio dosiernomo maksimume havas %(max)d karakteron (ĝi havas "
+"%(length)d)."
+msgstr[1] ""
+"Certigu, ke tio dosiernomo maksimume havas %(max)d karakterojn (ĝi havas "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Bonvolu aŭ alŝuti dosieron, aŭ elekti la malplenan markobutonon, ne ambaŭ."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Alŝutu validan bildon. La alŝutita dosiero ne estas bildo, aŭ estas "
+"difektita bildo."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Elektu validan elekton. %(value)s ne estas el la eblaj elektoj."
+
+msgid "Enter a list of values."
+msgstr "Enigu liston de valoroj."
+
+msgid "Enter a complete value."
+msgstr "Enigu kompletan valoron."
+
+msgid "Enter a valid UUID."
+msgstr "Enigu validan UUID-n."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Kaŝita kampo %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "ManagementForm datumoj mankas, aŭ estas tuŝaĉitaj kun"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Bonvolu sendi %d aŭ malpli formularojn."
+msgstr[1] "Bonvolu sendi %d aŭ malpli formularojn."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Bonvolu sendi %d aŭ pli formularojn."
+msgstr[1] "Bonvolu sendi %d aŭ pli formularojn."
+
+msgid "Order"
+msgstr "Ordo"
+
+msgid "Delete"
+msgstr "Forigi"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Bonvolu ĝustigi la duoblan datumon por %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Bonvolu ĝustigi la duoblan datumon por %(field)s, kiu devas esti unika."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Bonvolu ĝustigi la duoblan datumon por %(field_name)s, kiu devas esti unika "
+"por la %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Bonvolu ĝustigi la duoblan valoron sube."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Elektu validan elekton. Ĉi tiu elekto ne estas el la eblaj elektoj."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s ne povus esti interpretita en horzono %(current_timezone)s; ĝi "
+"povas esti plursenca aŭ ne ekzistas."
+
+msgid "Clear"
+msgstr "Vakigi"
+
+msgid "Currently"
+msgstr "Nuntempe"
+
+msgid "Change"
+msgstr "Ŝanĝi"
+
+msgid "Unknown"
+msgstr "Nekonate"
+
+msgid "Yes"
+msgstr "Jes"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "yes,no,maybe"
+msgstr "jes,ne,eble"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bitoko"
+msgstr[1] "%(size)d bitokoj"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "ptm"
+
+msgid "a.m."
+msgstr "atm"
+
+msgid "PM"
+msgstr "PTM"
+
+msgid "AM"
+msgstr "ATM"
+
+msgid "midnight"
+msgstr "noktomezo"
+
+msgid "noon"
+msgstr "tagmezo"
+
+msgid "Monday"
+msgstr "lundo"
+
+msgid "Tuesday"
+msgstr "mardo"
+
+msgid "Wednesday"
+msgstr "merkredo"
+
+msgid "Thursday"
+msgstr "ĵaŭdo"
+
+msgid "Friday"
+msgstr "vendredo"
+
+msgid "Saturday"
+msgstr "sabato"
+
+msgid "Sunday"
+msgstr "dimanĉo"
+
+msgid "Mon"
+msgstr "lun"
+
+msgid "Tue"
+msgstr "mar"
+
+msgid "Wed"
+msgstr "mer"
+
+msgid "Thu"
+msgstr "ĵaŭ"
+
+msgid "Fri"
+msgstr "ven"
+
+msgid "Sat"
+msgstr "sab"
+
+msgid "Sun"
+msgstr "dim"
+
+msgid "January"
+msgstr "januaro"
+
+msgid "February"
+msgstr "februaro"
+
+msgid "March"
+msgstr "marto"
+
+msgid "April"
+msgstr "aprilo"
+
+msgid "May"
+msgstr "majo"
+
+msgid "June"
+msgstr "junio"
+
+msgid "July"
+msgstr "julio"
+
+msgid "August"
+msgstr "aŭgusto"
+
+msgid "September"
+msgstr "septembro"
+
+msgid "October"
+msgstr "oktobro"
+
+msgid "November"
+msgstr "novembro"
+
+msgid "December"
+msgstr "decembro"
+
+msgid "jan"
+msgstr "jan"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "maj"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "aŭg"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "okt"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dec"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "marto"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "apr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "majo"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "jun."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "jul."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "aŭg."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "okt."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "dec."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Januaro"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Februaro"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Marto"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Aprilo"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Majo"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Aŭgusto"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Septembro"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Oktobro"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Novembro"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Decembro"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Tiu ne estas valida IPv6-adreso."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "aŭ"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d jaro"
+msgstr[1] "%d jaroj"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d monato"
+msgstr[1] "%d monatoj"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semajno"
+msgstr[1] "%d semajnoj"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d tago"
+msgstr[1] "%d tagoj"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d horo"
+msgstr[1] "%d horoj"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutoj"
+
+msgid "0 minutes"
+msgstr "0 minutoj"
+
+msgid "Forbidden"
+msgstr "Malpermesa"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF konfirmo malsukcesis. Peto ĉesigita."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Vi vidas tiun mesaĝon ĉar ĉi HTTPS retejo postulas “Referer header” esti "
+"sendita per via foliumilo, sed neniu estis sendita. Ĉi kaplinio estas "
+"bezonata pro motivoj de sekureco, por certigi ke via retumilo ne estu "
+"forrabita de triaj partioj."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Se vi agordis vian foliumilon por malebligi “Referer” kaplinioj, bonvolu "
+"reaktivigi ilin, almenaŭ por tiu ĉi retejo, aŭ por HTTPS rilatoj, aŭ por "
+"“samoriginaj” petoj."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Vi vidas tiun mesaĝon ĉar tiu-ĉi retejo postulas CSRF kuketon sendante "
+"formojn. Tiu-ĉi kuketo estas bezonata pro motivoj de sekureco, por certigi "
+"ke via retumilo ne esti forrabita de triaj partioj."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Se vi agordis vian foliumilon por malŝalti kuketojn, bonvole reaktivigi "
+"ilin, almenaŭ por tiu ĉi retejo, aŭ por “samoriginaj” petoj."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Pliaj informoj estas videblaj kun DEBUG=True."
+
+msgid "No year specified"
+msgstr "Neniu jaro specifita"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Neniu monato specifita"
+
+msgid "No day specified"
+msgstr "Neniu tago specifita"
+
+msgid "No week specified"
+msgstr "Neniu semajno specifita"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Neniu %(verbose_name_plural)s disponeblaj"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Estonta %(verbose_name_plural)s ne disponeblas ĉar %(class_name)s."
+"allow_future estas Malvera."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"La formato « %(format)s » aplikita al la data ĉeno '%(datestr)s' ne estas "
+"valida"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Neniu %(verbose_name)s trovita kongruas kun la informpeto"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Paĝo ne estas 'last', kaj ne povus esti transformita al entjero."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Nevalida paĝo (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Malplena listo kaj '%(class_name)s.allow_empty' estas Malvera."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Dosierujaj indeksoj ne estas permesitaj tie."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" ne ekzistas"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Indekso de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..76f7de0
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..0caa626
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/formats.py
new file mode 100644
index 0000000..430fc8f
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eo/formats.py
@@ -0,0 +1,49 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = r'j\-\a \d\e F Y' # '26-a de julio 1887'
+TIME_FORMAT = 'H:i' # '18:59'
+DATETIME_FORMAT = r'j\-\a \d\e F Y\, \j\e H:i' # '26-a de julio 1887, je 18:59'
+YEAR_MONTH_FORMAT = r'F \d\e Y' # 'julio de 1887'
+MONTH_DAY_FORMAT = r'j\-\a \d\e F' # '26-a de julio'
+SHORT_DATE_FORMAT = 'Y-m-d' # '1887-07-26'
+SHORT_DATETIME_FORMAT = 'Y-m-d H:i' # '1887-07-26 18:59'
+FIRST_DAY_OF_WEEK = 1 # Monday (lundo)
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%Y-%m-%d', # '1887-07-26'
+ '%y-%m-%d', # '87-07-26'
+ '%Y %m %d', # '1887 07 26'
+ '%d-a de %b %Y', # '26-a de jul 1887'
+ '%d %b %Y', # '26 jul 1887'
+ '%d-a de %B %Y', # '26-a de julio 1887'
+ '%d %B %Y', # '26 julio 1887'
+ '%d %m %Y', # '26 07 1887'
+]
+TIME_INPUT_FORMATS = [
+ '%H:%M:%S', # '18:59:00'
+ '%H:%M', # '18:59'
+]
+DATETIME_INPUT_FORMATS = [
+ '%Y-%m-%d %H:%M:%S', # '1887-07-26 18:59:00'
+ '%Y-%m-%d %H:%M', # '1887-07-26 18:59'
+ '%Y-%m-%d', # '1887-07-26'
+
+ '%Y.%m.%d %H:%M:%S', # '1887.07.26 18:59:00'
+ '%Y.%m.%d %H:%M', # '1887.07.26 18:59'
+ '%Y.%m.%d', # '1887.07.26'
+
+ '%d/%m/%Y %H:%M:%S', # '26/07/1887 18:59:00'
+ '%d/%m/%Y %H:%M', # '26/07/1887 18:59'
+ '%d/%m/%Y', # '26/07/1887'
+
+ '%y-%m-%d %H:%M:%S', # '87-07-26 18:59:00'
+ '%y-%m-%d %H:%M', # '87-07-26 18:59'
+ '%y-%m-%d', # '87-07-26'
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..05290ef
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.po
new file mode 100644
index 0000000..15638c5
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.po
@@ -0,0 +1,1278 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Abraham Estrada, 2013
+# albertoalcolea , 2014
+# Amanda Copete, 2017
+# Antoni Aloy , 2011-2014,2017
+# Diego Andres Sanabria Martin , 2012
+# Diego Schulz , 2012
+# Ernesto Avilés Vázquez , 2015-2016
+# Ernesto Avilés Vázquez , 2014
+# Ernesto Rico-Schmidt , 2017
+# franchukelly , 2011
+# Igor Támara , 2015
+# Jannis Leidel , 2011
+# José Luis , 2016
+# Josue Naaman Nistal Guerra , 2014
+# Leonardo J. Caballero G. , 2011,2013
+# Marc Garcia , 2011
+# monobotsoft , 2012
+# ntrrgc , 2013
+# ntrrgc , 2013
+# Pablo, 2015
+# Sebastián Magrí , 2013
+# Veronicabh , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 14:56+0000\n"
+"Last-Translator: Ernesto Rico-Schmidt \n"
+"Language-Team: Spanish (http://www.transifex.com/django/django/language/"
+"es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Africano"
+
+msgid "Arabic"
+msgstr "Árabe"
+
+msgid "Asturian"
+msgstr "Asturiano"
+
+msgid "Azerbaijani"
+msgstr "Azerbaiyán"
+
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+msgid "Belarusian"
+msgstr "Bielorruso"
+
+msgid "Bengali"
+msgstr "Bengalí"
+
+msgid "Breton"
+msgstr "Bretón"
+
+msgid "Bosnian"
+msgstr "Bosnio"
+
+msgid "Catalan"
+msgstr "Catalán"
+
+msgid "Czech"
+msgstr "Checo"
+
+msgid "Welsh"
+msgstr "Galés"
+
+msgid "Danish"
+msgstr "Danés"
+
+msgid "German"
+msgstr "Alemán"
+
+msgid "Lower Sorbian"
+msgstr "Bajo sorbio"
+
+msgid "Greek"
+msgstr "Griego"
+
+msgid "English"
+msgstr "Inglés"
+
+msgid "Australian English"
+msgstr "Inglés australiano"
+
+msgid "British English"
+msgstr "Inglés británico"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Español"
+
+msgid "Argentinian Spanish"
+msgstr "Español de Argentina"
+
+msgid "Colombian Spanish"
+msgstr "Español Colombiano"
+
+msgid "Mexican Spanish"
+msgstr "Español de México"
+
+msgid "Nicaraguan Spanish"
+msgstr "Español de Nicaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "Español venezolano"
+
+msgid "Estonian"
+msgstr "Estonio"
+
+msgid "Basque"
+msgstr "Vasco"
+
+msgid "Persian"
+msgstr "Persa"
+
+msgid "Finnish"
+msgstr "Finés"
+
+msgid "French"
+msgstr "Francés"
+
+msgid "Frisian"
+msgstr "Frisón"
+
+msgid "Irish"
+msgstr "Irlandés"
+
+msgid "Scottish Gaelic"
+msgstr "Gaélico Escocés"
+
+msgid "Galician"
+msgstr "Gallego"
+
+msgid "Hebrew"
+msgstr "Hebreo"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croata"
+
+msgid "Upper Sorbian"
+msgstr "Alto sorbio"
+
+msgid "Hungarian"
+msgstr "Húngaro"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesio"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandés"
+
+msgid "Italian"
+msgstr "Italiano"
+
+msgid "Japanese"
+msgstr "Japonés"
+
+msgid "Georgian"
+msgstr "Georgiano"
+
+msgid "Kazakh"
+msgstr "Kazajo"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Koreano"
+
+msgid "Luxembourgish"
+msgstr "Luxenburgués"
+
+msgid "Lithuanian"
+msgstr "Lituano"
+
+msgid "Latvian"
+msgstr "Letón"
+
+msgid "Macedonian"
+msgstr "Macedonio"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongol"
+
+msgid "Marathi"
+msgstr "Maratí"
+
+msgid "Burmese"
+msgstr "Birmano"
+
+msgid "Norwegian Bokmål"
+msgstr "Bokmål noruego"
+
+msgid "Nepali"
+msgstr "Nepalí"
+
+msgid "Dutch"
+msgstr "Holandés"
+
+msgid "Norwegian Nynorsk"
+msgstr "Nynorsk"
+
+msgid "Ossetic"
+msgstr "Osetio"
+
+msgid "Punjabi"
+msgstr "Panyabí"
+
+msgid "Polish"
+msgstr "Polaco"
+
+msgid "Portuguese"
+msgstr "Portugués"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugués de Brasil"
+
+msgid "Romanian"
+msgstr "Rumano"
+
+msgid "Russian"
+msgstr "Ruso"
+
+msgid "Slovak"
+msgstr "Eslovaco"
+
+msgid "Slovenian"
+msgstr "Esloveno"
+
+msgid "Albanian"
+msgstr "Albanés"
+
+msgid "Serbian"
+msgstr "Serbio"
+
+msgid "Serbian Latin"
+msgstr "Serbio latino"
+
+msgid "Swedish"
+msgstr "Sueco"
+
+msgid "Swahili"
+msgstr "Suajili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Tailandés"
+
+msgid "Turkish"
+msgstr "Turco"
+
+msgid "Tatar"
+msgstr "Tártaro"
+
+msgid "Udmurt"
+msgstr "Udmurt"
+
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "Cino simplificado"
+
+msgid "Traditional Chinese"
+msgstr "Chino tradicional"
+
+msgid "Messages"
+msgstr "Mensajes"
+
+msgid "Site Maps"
+msgstr "Mapas del sitio"
+
+msgid "Static Files"
+msgstr "Archivos estáticos"
+
+msgid "Syndication"
+msgstr "Sindicación"
+
+msgid "That page number is not an integer"
+msgstr "Este número de página no es un entero"
+
+msgid "That page number is less than 1"
+msgstr "Este número de página es menor que 1"
+
+msgid "That page contains no results"
+msgstr "Esa página no contiene resultados"
+
+msgid "Enter a valid value."
+msgstr "Introduzca un valor válido."
+
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+msgid "Enter a valid integer."
+msgstr "Introduzca un número entero válido."
+
+msgid "Enter a valid email address."
+msgstr "Introduzca una dirección de correo electrónico válida."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Introduzca un 'slug' válido, consistente en letras, números, guiones bajos o "
+"medios."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Introduzca un 'slug' consistente en letras, números, subrayados o guiones."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Introduzca una dirección IPv4 válida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Introduzca una dirección IPv6 válida."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Introduzca una dirección IPv4 o IPv6 válida."
+
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo dígitos separados por comas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Asegúrese de que este valor es %(limit_value)s (actualmente es "
+"%(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor es menor o igual a %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor es mayor o igual a %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga al menos %(limit_value)d caracter (tiene "
+"%(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga al menos %(limit_value)d caracteres (tiene "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga menos de %(limit_value)d caracter (tiene "
+"%(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga menos de %(limit_value)d caracteres (tiene "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Asegúrese de que no hay más de %(max)s dígito en total."
+msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos en total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Asegúrese de que no haya más de %(max)s dígito decimal."
+msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos decimales."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Asegúrese de que no haya más de %(max)s dígito antes del punto decimal"
+msgstr[1] ""
+"Asegúrese de que no haya más de %(max)s dígitos antes del punto decimal."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"La extensión de fichero '%(extension)s' no está permitida. Únicamente se "
+"permiten: '%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "Los caracteres nulos no están permitidos."
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s con este %(field_labels)s ya existe."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Valor %(value)r no es una opción válida."
+
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+msgid "This field cannot be blank."
+msgstr "Este campo no puede estar vacío."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Ya existe %(model_name)s con este %(field_label)s."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Campo de tipo: %(field_type)s"
+
+msgid "Integer"
+msgstr "Entero"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "El valor'%(value)s' debe ser un entero."
+
+msgid "Big (8 byte) integer"
+msgstr "Entero grande (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "El valor '%(value)s' debe ser verdadero o falso."
+
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (máximo %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"El valor '%(value)s' tiene un formato de fecha no válida. Debe estar en "
+"formato AAAA-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"El valor '%(value)s' tiene el formato correcto (AAAA-MM-DD), pero la fecha "
+"no es válida."
+
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"El valor'%(value)s' no tiene un formato válido. Debe estar en formato AAAA-"
+"MM-DD HH: [TZ]: MM [ss [uuuuuu].]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"El valor '%(value)s' tiene el formato correcto (AAAA-MM-DD HH: MM [:. Ss "
+"[uuuuuu]] [TZ]), pero la fecha/hora no es válida."
+
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "El valor '%(value)s' debe ser un número decimal."
+
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"El valor '%(value)s' no tiene un formato válido. Debe estar en el formato "
+"[DD] [HH:[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Duración"
+
+msgid "Email address"
+msgstr "Correo electrónico"
+
+msgid "File path"
+msgstr "Ruta de fichero"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "El valor '%(value)s' debe ser un float."
+
+msgid "Floating point number"
+msgstr "Número en coma flotante"
+
+msgid "IPv4 address"
+msgstr "Dirección IPv4"
+
+msgid "IP address"
+msgstr "Dirección IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "El valor '%(value)s' debe ser Ninguno, Verdadero o Falso."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+msgid "Positive integer"
+msgstr "Entero positivo"
+
+msgid "Positive small integer"
+msgstr "Entero positivo corto"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (hasta %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Entero corto"
+
+msgid "Text"
+msgstr "Texto"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"El valor '%(value)s' no tiene un formato válido. Debe estar en formato HH: "
+"MM [: SS [uuuuuu].] ."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"El valor '%(value)s' tiene el formato correcto (HH: MM [:. Ss [uuuuuu]]), "
+"pero es una hora no válida."
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Data de binarios brutos"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' no es un UUID válido."
+
+msgid "File"
+msgstr "Archivo"
+
+msgid "Image"
+msgstr "Imagen"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "La instancia de %(model)s con %(field)s %(value)r no existe."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clave foránea (tipo determinado por el campo relacionado)"
+
+msgid "One-to-one relationship"
+msgstr "Relación uno-a-uno"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "relación %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "relaciones %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Relación muchos-a-muchos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+msgid "Enter a valid date/time."
+msgstr "Introduzca una fecha/hora válida."
+
+msgid "Enter a valid duration."
+msgstr "Introduzca una duración válida."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el "
+"formulario."
+
+msgid "No file was submitted."
+msgstr "No se ha enviado ningún fichero"
+
+msgid "The submitted file is empty."
+msgstr "El fichero enviado está vacío."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracter "
+"(tiene %(length)d)."
+msgstr[1] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres "
+"(tiene %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Por favor envíe un fichero o marque la casilla de limpiar, pero no ambos."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se "
+"trataba de una imagen corrupta."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Escoja una opción válida. %(value)s no es una de las opciones disponibles."
+
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+msgid "Enter a complete value."
+msgstr "Introduzca un valor completo."
+
+msgid "Enter a valid UUID."
+msgstr "Introduzca un UUID válido."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Campo oculto %(name)s) *%(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Los datos de ManagementForm faltan o han sido manipulados"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Por favor, envíe %d formulario o menos."
+msgstr[1] "Por favor, envíe %d formularios o menos"
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Por favor, envíe %d formulario o más."
+msgstr[1] "Por favor, envíe %d formularios o más."
+
+msgid "Order"
+msgstr "Orden"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Por favor, corrija el dato duplicado para %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Por favor corrija el dato duplicado para %(field)s, ya que debe ser único."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Por favor corrija los datos duplicados para %(field_name)s ya que debe ser "
+"único para %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Por favor, corrija los valores duplicados abajo."
+
+msgid "The inline value did not match the parent instance."
+msgstr "El valor en línea no coincide con la instancia principal."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Escoja una opción válida. Esa opción no está entre las disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" no es un valor válido."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s no puede interpretarse en la zona temporal "
+"%(current_timezone)s; puede ser ambiguo o puede no existir."
+
+msgid "Clear"
+msgstr "Limpiar"
+
+msgid "Currently"
+msgstr "Actualmente"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "sí, no, quizás"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "medianoche"
+
+msgid "noon"
+msgstr "mediodía"
+
+msgid "Monday"
+msgstr "Lunes"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgid "Thursday"
+msgstr "Jueves"
+
+msgid "Friday"
+msgstr "Viernes"
+
+msgid "Saturday"
+msgstr "Sábado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Mon"
+msgstr "Lun"
+
+msgid "Tue"
+msgstr "Mar"
+
+msgid "Wed"
+msgstr "Mié"
+
+msgid "Thu"
+msgstr "Jue"
+
+msgid "Fri"
+msgstr "Vie"
+
+msgid "Sat"
+msgstr "Sáb"
+
+msgid "Sun"
+msgstr "Dom"
+
+msgid "January"
+msgstr "Enero"
+
+msgid "February"
+msgstr "Febrero"
+
+msgid "March"
+msgstr "Marzo"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Mayo"
+
+msgid "June"
+msgstr "Junio"
+
+msgid "July"
+msgstr "Julio"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Septiembre"
+
+msgid "October"
+msgstr "Octubre"
+
+msgid "November"
+msgstr "Noviembre"
+
+msgid "December"
+msgstr "Diciembre"
+
+msgid "jan"
+msgstr "ene"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "abr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "ago"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dic"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ene."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Mar."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Abr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Jun."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Jul."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dic."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Enero"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Febrero"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Agosto"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Septiembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Octubre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Noviembre"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Diciembre"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Esta no es una dirección IPv6 válida."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "o"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d año"
+msgstr[1] "%d años"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d meses"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d días"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+msgid "0 minutes"
+msgstr "0 minutos"
+
+msgid "Forbidden"
+msgstr "Prohibido"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Verificación CSRF fallida. Solicitud abortada"
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Estás viendo este mensaje porque este sitio web es HTTPS y requiere que tu "
+"navegador envíe la cabecera Referer y no se envió ninguna. Esta cabecera se "
+"necesita por razones de seguridad, para asegurarse de que tu navegador no ha "
+"sido comprometido por terceras partes."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Si has configurado tu navegador para desactivar las cabeceras 'Referer', por "
+"favor vuélvelas a activar, al menos para esta web, o para conexiones HTTPS, "
+"o para peticiones 'mismo-origen'."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Si estás usando la etiqueta "
+"o incluyendo el encabezamiento 'Referrer-Policy: no-referrer' , por favor "
+"retíralos. La protección CSRF requiere del encabezamiento 'Referer' para "
+"hacer control estricto de referencia . Si estás preocupado por la "
+"privacidad, usa alternativas como para enlaces a "
+"sitios de terceros."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se "
+"envían formularios. Esta cookie se necesita por razones de seguridad, para "
+"asegurar que tu navegador no ha sido comprometido por terceras partes."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Si has inhabilitado las cookies en tu navegador, por favor habilítalas "
+"nuevamente al menos para este sitio, o para solicitudes del mismo origen."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Se puede ver más información si se establece DEBUG=True."
+
+msgid "No year specified"
+msgstr "No se ha indicado el año"
+
+msgid "Date out of range"
+msgstr "Fecha fuera de rango"
+
+msgid "No month specified"
+msgstr "No se ha indicado el mes"
+
+msgid "No day specified"
+msgstr "No se ha indicado el día"
+
+msgid "No week specified"
+msgstr "No se ha indicado la semana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "No %(verbose_name_plural)s disponibles"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Los futuros %(verbose_name_plural)s no están disponibles porque "
+"%(class_name)s.allow_future es Falso."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Fecha '%(datestr)s' no válida, el formato válido es '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "La página no es la \"ultima\", ni puede ser convertida a un entero."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Página inválida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Lista vacía y '%(class_name)s.allow_empty' es Falso."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Los índices de directorio no están permitidos."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" no existe"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Índice de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: el marco web para perfeccionistas con plazos."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Ve la notas de la versión de Django "
+"%(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "¡La instalación funcionó con éxito! ¡Felicitaciones!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Estás viendo esta página porque DEBUG=True está en tu archivo de configuración y no has configurado "
+"ningún URL."
+
+msgid "Django Documentation"
+msgstr "Documentación de Django"
+
+msgid "Topics, references, & how-to's"
+msgstr "Temas, referencias y cómo hacerlos"
+
+msgid "Tutorial: A Polling App"
+msgstr "Tutorial: Una aplicación de encuesta"
+
+msgid "Get started with Django"
+msgstr "Comienza con Django"
+
+msgid "Django Community"
+msgstr "Comunidad Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "Conéctate, obtén ayuda o contribuye"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..c9efc78
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..a010347
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/formats.py
new file mode 100644
index 0000000..c89e66b
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es/formats.py
@@ -0,0 +1,30 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = r'j \d\e F \d\e Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i'
+YEAR_MONTH_FORMAT = r'F \d\e Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ # '31/12/2009', '31/12/09'
+ '%d/%m/%Y', '%d/%m/%y'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S',
+ '%d/%m/%Y %H:%M:%S.%f',
+ '%d/%m/%Y %H:%M',
+ '%d/%m/%y %H:%M:%S',
+ '%d/%m/%y %H:%M:%S.%f',
+ '%d/%m/%y %H:%M',
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..70d82f3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2d733ca
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po
@@ -0,0 +1,1268 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel , 2011
+# lardissone , 2014
+# poli , 2014
+# Ramiro Morales, 2013-2017
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:55+0000\n"
+"Last-Translator: Ramiro Morales\n"
+"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/"
+"language/es_AR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_AR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "afrikáans"
+
+msgid "Arabic"
+msgstr "árabe"
+
+msgid "Asturian"
+msgstr "asturiano"
+
+msgid "Azerbaijani"
+msgstr "Azerbaiyán"
+
+msgid "Bulgarian"
+msgstr "búlgaro"
+
+msgid "Belarusian"
+msgstr "bielorruso"
+
+msgid "Bengali"
+msgstr "bengalí"
+
+msgid "Breton"
+msgstr "bretón"
+
+msgid "Bosnian"
+msgstr "bosnio"
+
+msgid "Catalan"
+msgstr "catalán"
+
+msgid "Czech"
+msgstr "checo"
+
+msgid "Welsh"
+msgstr "galés"
+
+msgid "Danish"
+msgstr "danés"
+
+msgid "German"
+msgstr "alemán"
+
+msgid "Lower Sorbian"
+msgstr "bajo sorabo"
+
+msgid "Greek"
+msgstr "griego"
+
+msgid "English"
+msgstr "inglés"
+
+msgid "Australian English"
+msgstr "inglés australiano"
+
+msgid "British English"
+msgstr "inglés británico"
+
+msgid "Esperanto"
+msgstr "esperanto"
+
+msgid "Spanish"
+msgstr "español"
+
+msgid "Argentinian Spanish"
+msgstr "español (Argentina)"
+
+msgid "Colombian Spanish"
+msgstr "español (Colombia)"
+
+msgid "Mexican Spanish"
+msgstr "español (México)"
+
+msgid "Nicaraguan Spanish"
+msgstr "español (Nicaragua)"
+
+msgid "Venezuelan Spanish"
+msgstr "español (Venezuela)"
+
+msgid "Estonian"
+msgstr "estonio"
+
+msgid "Basque"
+msgstr "vasco"
+
+msgid "Persian"
+msgstr "persa"
+
+msgid "Finnish"
+msgstr "finlandés"
+
+msgid "French"
+msgstr "francés"
+
+msgid "Frisian"
+msgstr "frisón"
+
+msgid "Irish"
+msgstr "irlandés"
+
+msgid "Scottish Gaelic"
+msgstr "gaélico escocés"
+
+msgid "Galician"
+msgstr "gallego"
+
+msgid "Hebrew"
+msgstr "hebreo"
+
+msgid "Hindi"
+msgstr "hindi"
+
+msgid "Croatian"
+msgstr "croata"
+
+msgid "Upper Sorbian"
+msgstr "alto sorabo"
+
+msgid "Hungarian"
+msgstr "húngaro"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "indonesio"
+
+msgid "Ido"
+msgstr "ido"
+
+msgid "Icelandic"
+msgstr "islandés"
+
+msgid "Italian"
+msgstr "italiano"
+
+msgid "Japanese"
+msgstr "japonés"
+
+msgid "Georgian"
+msgstr "georgiano"
+
+msgid "Kazakh"
+msgstr "kazajo"
+
+msgid "Khmer"
+msgstr "jémer"
+
+msgid "Kannada"
+msgstr "canarés"
+
+msgid "Korean"
+msgstr "coreano"
+
+msgid "Luxembourgish"
+msgstr "luxemburgués"
+
+msgid "Lithuanian"
+msgstr "lituano"
+
+msgid "Latvian"
+msgstr "letón"
+
+msgid "Macedonian"
+msgstr "macedonio"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "mongol"
+
+msgid "Marathi"
+msgstr "maratí"
+
+msgid "Burmese"
+msgstr "burmés"
+
+msgid "Norwegian Bokmål"
+msgstr "bokmål noruego"
+
+msgid "Nepali"
+msgstr "nepalés"
+
+msgid "Dutch"
+msgstr "holandés"
+
+msgid "Norwegian Nynorsk"
+msgstr "nynorsk"
+
+msgid "Ossetic"
+msgstr "osetio"
+
+msgid "Punjabi"
+msgstr "Panyabí"
+
+msgid "Polish"
+msgstr "polaco"
+
+msgid "Portuguese"
+msgstr "portugués"
+
+msgid "Brazilian Portuguese"
+msgstr "portugués de Brasil"
+
+msgid "Romanian"
+msgstr "rumano"
+
+msgid "Russian"
+msgstr "ruso"
+
+msgid "Slovak"
+msgstr "eslovaco"
+
+msgid "Slovenian"
+msgstr "esloveno"
+
+msgid "Albanian"
+msgstr "albanés"
+
+msgid "Serbian"
+msgstr "serbio"
+
+msgid "Serbian Latin"
+msgstr "latín de Serbia"
+
+msgid "Swedish"
+msgstr "sueco"
+
+msgid "Swahili"
+msgstr "suajili"
+
+msgid "Tamil"
+msgstr "tamil"
+
+msgid "Telugu"
+msgstr "telugu"
+
+msgid "Thai"
+msgstr "tailandés"
+
+msgid "Turkish"
+msgstr "turco"
+
+msgid "Tatar"
+msgstr "tártaro"
+
+msgid "Udmurt"
+msgstr "udmurto"
+
+msgid "Ukrainian"
+msgstr "ucraniano"
+
+msgid "Urdu"
+msgstr "urdu"
+
+msgid "Vietnamese"
+msgstr "vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "chino simplificado"
+
+msgid "Traditional Chinese"
+msgstr "chino tradicional"
+
+msgid "Messages"
+msgstr "Mensajes"
+
+msgid "Site Maps"
+msgstr "Mapas de sitio"
+
+msgid "Static Files"
+msgstr "Archivos estáticos"
+
+msgid "Syndication"
+msgstr "Sindicación"
+
+msgid "That page number is not an integer"
+msgstr "El número de página no es un entero"
+
+msgid "That page number is less than 1"
+msgstr "El número de página es menor a 1"
+
+msgid "That page contains no results"
+msgstr "Esa página no contiene resultados"
+
+msgid "Enter a valid value."
+msgstr "Introduzca un valor válido."
+
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+msgid "Enter a valid integer."
+msgstr "Introduzca un valor numérico entero válido."
+
+msgid "Enter a valid email address."
+msgstr "Introduzca una dirección de email válida."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Introduzca un 'slug' válido consistente de letras, números, guiones bajos o "
+"guiones."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Introduzca un 'slug' válido consistente de letras Unicode, números, guiones "
+"bajos o guiones."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Introduzca una dirección IPv4 válida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Introduzca una dirección IPv6 válida."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Introduzca una dirección IPv4 o IPv6 válida."
+
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo dígitos separados por comas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Asegúrese de que este valor sea %(limit_value)s (actualmente es "
+"%(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracter "
+"(tiene %(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres "
+"(tiene %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga como máximo %(limit_value)d caracter "
+"(tiene %(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres "
+"(tiene %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Asegúrese de que no exista en total mas de %(max)s dígito."
+msgstr[1] "Asegúrese de que no existan en total mas de %(max)s dígitos."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Asegúrese de que no exista mas de %(max)s lugar decimal."
+msgstr[1] "Asegúrese de que no existan mas de %(max)s lugares decimales."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Asegúrese de que no exista mas de %(max)s dígito antes del punto decimal."
+msgstr[1] ""
+"Asegúrese de que no existan mas de %(max)s dígitos antes del punto decimal."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"La extensión de archivo '%(extension)s' no está permitida. Las extensiones "
+"aceptadas son: '%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "No se admiten caracteres nulos."
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "El valor %(value)r no es una opción válida."
+
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+msgid "This field cannot be blank."
+msgstr "Este campo no puede estar en blanco."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s debe ser único/a para un %(lookup_type)s "
+"%(date_field_label)s determinado."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Campo tipo: %(field_type)s"
+
+msgid "Integer"
+msgstr "Entero"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "El valor de '%(value)s' debe ser un número entero."
+
+msgid "Big (8 byte) integer"
+msgstr "Entero grande (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "El valor de '%(value)s' debe ser Verdadero o Falso."
+
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (máximo %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"El valor de '%(value)s' tiene un formato de fecha inválido. Debe usar el "
+"formato AAAA-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"El valor de '%(value)s' tiene un formato de fecha correcto (AAAA-MM-DD) pero "
+"representa una fecha inválida."
+
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"El valor de '%(value)s' tiene un formato inválido. Debe usar el formato AAAA-"
+"MM-DD HH:MM[:ss[.uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"El valor de '%(value)s' tiene un formato correcto (AAAA-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ]) pero representa una fecha/hora inválida."
+
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "El valor de '%(value)s' debe ser un número decimal."
+
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"El valor de '%(value)s' tiene un formato inválido. Debe usar el formato [DD] "
+"[HH:[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Duración"
+
+msgid "Email address"
+msgstr "Dirección de correo electrónico"
+
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "El valor de '%(value)s' debe ser un número de coma flotante."
+
+msgid "Floating point number"
+msgstr "Número de punto flotante"
+
+msgid "IPv4 address"
+msgstr "Dirección IPv4"
+
+msgid "IP address"
+msgstr "Dirección IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "El valor de '%(value)s' debe ser None, Verdadero o Falso."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+msgid "Positive integer"
+msgstr "Entero positivo"
+
+msgid "Positive small integer"
+msgstr "Entero pequeño positivo"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (de hasta %(max_length)s caracteres)"
+
+msgid "Small integer"
+msgstr "Entero pequeño"
+
+msgid "Text"
+msgstr "Texto"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"El valor de '%(value)s' tiene un formato inválido. Debe usar el formato HH:"
+"MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"El valor de '%(value)s' tiene un formato correcto (HH:MM[:ss[.uuuuuu]]) pero "
+"representa una hora inválida."
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Datos binarios crudos"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' no es un UUID válido."
+
+msgid "File"
+msgstr "Archivo"
+
+msgid "Image"
+msgstr "Imagen"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "No existe una instancia de %(model)s con %(field)s %(value)r."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clave foránea (el tipo está determinado por el campo relacionado)"
+
+msgid "One-to-one relationship"
+msgstr "Relación uno-a-uno"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "relación %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "relaciones %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Relación muchos-a-muchos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+msgid "Enter a valid time."
+msgstr "Introduzca un valor de hora válido."
+
+msgid "Enter a valid date/time."
+msgstr "Introduzca un valor de fecha/hora válido."
+
+msgid "Enter a valid duration."
+msgstr "Introduzca una duración válida."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se envió un archivo. Verifique el tipo de codificación en el formulario."
+
+msgid "No file was submitted."
+msgstr "No se envió ningún archivo."
+
+msgid "The submitted file is empty."
+msgstr "El archivo enviado está vacío."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracter "
+"(tiene %(length)d)."
+msgstr[1] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres "
+"(tiene %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Por favor envíe un archivo o active el checkbox, pero no ambas cosas."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Seleccione una imagen válida. El archivo que ha seleccionado no es una "
+"imagen o es un archivo de imagen corrupto."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. %(value)s no es una de las opciones "
+"disponibles."
+
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+msgid "Enter a complete value."
+msgstr "Introduzca un valor completo."
+
+msgid "Enter a valid UUID."
+msgstr "Introduzca un UUID válido."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Campo oculto %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+"Los datos correspondientes al ManagementForm no existen o han sido "
+"modificados"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Por favor envíe cero o %d formularios."
+msgstr[1] "Por favor envíe un máximo de %d formularios."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Por favor envíe %d o mas formularios."
+msgstr[1] "Por favor envíe %d o mas formularios."
+
+msgid "Order"
+msgstr "Ordenar"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Por favor, corrija la información duplicada en %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Por favor corrija la información duplicada en %(field)s, que debe ser única."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Por favor corrija la información duplicada en %(field_name)s que debe ser "
+"única para el %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Por favor, corrija los valores duplicados detallados mas abajo."
+
+msgid "The inline value did not match the parent instance."
+msgstr "El valor inline no coincide con el de la instancia padre."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. La opción seleccionada no es una de las "
+"disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" no es un valor válido."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s no puede ser interpretado en la zona horaria "
+"%(current_timezone)s; ya que podría ser ambiguo o podría no existir."
+
+msgid "Clear"
+msgstr "Eliminar"
+
+msgid "Currently"
+msgstr "Actualmente"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "si,no,talvez"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "medianoche"
+
+msgid "noon"
+msgstr "mediodía"
+
+msgid "Monday"
+msgstr "Lunes"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgid "Thursday"
+msgstr "Jueves"
+
+msgid "Friday"
+msgstr "Viernes"
+
+msgid "Saturday"
+msgstr "Sábado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Mon"
+msgstr "Lun"
+
+msgid "Tue"
+msgstr "Mar"
+
+msgid "Wed"
+msgstr "Mie"
+
+msgid "Thu"
+msgstr "Jue"
+
+msgid "Fri"
+msgstr "Vie"
+
+msgid "Sat"
+msgstr "Sab"
+
+msgid "Sun"
+msgstr "Dom"
+
+msgid "January"
+msgstr "Enero"
+
+msgid "February"
+msgstr "Febrero"
+
+msgid "March"
+msgstr "Marzo"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Mayo"
+
+msgid "June"
+msgstr "Junio"
+
+msgid "July"
+msgstr "Julio"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Setiembre"
+
+msgid "October"
+msgstr "Octubre"
+
+msgid "November"
+msgstr "Noviembre"
+
+msgid "December"
+msgstr "Diciembre"
+
+msgid "jan"
+msgstr "ene"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "abr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "ago"
+
+msgid "sep"
+msgstr "set"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dic"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Enero"
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Set."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dic."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Enero"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Febrero"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Agosto"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Setiembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Octubre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Noviembre"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Diciembre"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Esta no es una direción IPv6 válida."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "o"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d año"
+msgstr[1] "%d años"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d meses"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d días"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+msgid "0 minutes"
+msgstr "0 minutos"
+
+msgid "Forbidden"
+msgstr "Prohibido"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Verificación CSRF fallida. Petición abortada."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Ud. está viendo este mensaje porque este sitio HTTPS tiene como "
+"requerimiento que su browser Web envíe una cabecera 'Referer' pero el mismo "
+"no ha enviado una. El hecho de que esta cabecera sea obligatoria es una "
+"medida de seguridad para comprobar que su browser no está siendo controlado "
+"por terceros."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Si ha configurado su browser para deshabilitar las cabeceras 'Referer', por "
+"favor activelas al menos para este sitio, o para conexiones HTTPS o para "
+"peticiones generadas desde el mismo origen."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Si está usando la etiqueta "
+"o está incluyendo el encabezado 'Referrer-Policy: no-referrer' por favor "
+"quítelos. La protección CSRF necesita el encabezado 'Referer' para realizar "
+"una comprobación estricta de los referers. Si le preocupa la privacidad "
+"tiene alternativas tales como usar en los enlaces "
+"a sitios de terceros."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Ud. está viendo este mensaje porque este sitio tiene como requerimiento el "
+"uso de una 'cookie' CSRF cuando se envíen formularios. El hecho de que esta "
+"'cookie' sea obligatoria es una medida de seguridad para comprobar que su "
+"browser no está siendo controlado por terceros."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Si ha configurado su browser para deshabilitar 'cookies', por favor "
+"activelas al menos para este sitio o para peticiones generadas desde el "
+"mismo origen."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Hay mas información disponible. Para ver la misma use DEBUG=True."
+
+msgid "No year specified"
+msgstr "No se ha especificado el valor año"
+
+msgid "Date out of range"
+msgstr "Fecha fuera de rango"
+
+msgid "No month specified"
+msgstr "No se ha especificado el valor mes"
+
+msgid "No day specified"
+msgstr "No se ha especificado el valor día"
+
+msgid "No week specified"
+msgstr "No se ha especificado el valor semana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "No hay %(verbose_name_plural)s disponibles"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"No hay %(verbose_name_plural)s futuros disponibles porque %(class_name)s."
+"allow_future tiene el valor False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Cadena de fecha inválida '%(datestr)s', formato '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No se han encontrado %(verbose_name)s que coincidan con la consulta "
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Página debe tener el valor 'last' o un valor número entero."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Página inválida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Lista vacía y '%(class_name)s.allow_empty' tiene el valor False."
+
+msgid "Directory indexes are not allowed here."
+msgstr ""
+"No está habilitada la generación de listados de directorios en esta "
+"ubicación."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" no existe"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Listado de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: El framework Web para perfeccionistas con deadlines."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Ver las release notes de Django %(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "La instalación ha sido exitosa. ¡Felicitaciones!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Está viendo esta página porque el archivo de configuración contiene DEBUG=True y no ha configurado ninguna URL."
+
+msgid "Django Documentation"
+msgstr "Documentación de Django"
+
+msgid "Topics, references, & how-to's"
+msgstr "Tópicos, referencia & how-to's"
+
+msgid "Tutorial: A Polling App"
+msgstr "Tutorial: Una app de encuesta"
+
+msgid "Get started with Django"
+msgstr "Comience a aprender Django"
+
+msgid "Django Community"
+msgstr "Comunidad Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "Conécteses, consiga ayuda o contribuya"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..33e4593
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..9fd4680
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/formats.py
new file mode 100644
index 0000000..30058a1
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_AR/formats.py
@@ -0,0 +1,30 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = r'j N Y'
+TIME_FORMAT = r'H:i'
+DATETIME_FORMAT = r'j N Y H:i'
+YEAR_MONTH_FORMAT = r'F Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = r'd/m/Y'
+SHORT_DATETIME_FORMAT = r'd/m/Y H:i'
+FIRST_DAY_OF_WEEK = 0 # 0: Sunday, 1: Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', # '31/12/2009'
+ '%d/%m/%y', # '31/12/09'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S',
+ '%d/%m/%Y %H:%M:%S.%f',
+ '%d/%m/%Y %H:%M',
+ '%d/%m/%y %H:%M:%S',
+ '%d/%m/%y %H:%M:%S.%f',
+ '%d/%m/%y %H:%M',
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..9b6221d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2cae813
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po
@@ -0,0 +1,1241 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Carlos Muñoz , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/"
+"language/es_CO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_CO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikáans"
+
+msgid "Arabic"
+msgstr "Árabe"
+
+msgid "Asturian"
+msgstr "Asturiano"
+
+msgid "Azerbaijani"
+msgstr "Azerí"
+
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+msgid "Belarusian"
+msgstr "Bielorruso"
+
+msgid "Bengali"
+msgstr "Bengalí"
+
+msgid "Breton"
+msgstr "Bretón"
+
+msgid "Bosnian"
+msgstr "Bosnio"
+
+msgid "Catalan"
+msgstr "Catalán"
+
+msgid "Czech"
+msgstr "Checo"
+
+msgid "Welsh"
+msgstr "Galés"
+
+msgid "Danish"
+msgstr "Danés"
+
+msgid "German"
+msgstr "Alemán"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Griego"
+
+msgid "English"
+msgstr "Inglés"
+
+msgid "Australian English"
+msgstr "Inglés Australiano"
+
+msgid "British English"
+msgstr "Inglés Británico"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Español"
+
+msgid "Argentinian Spanish"
+msgstr "Español de Argentina"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Español de México"
+
+msgid "Nicaraguan Spanish"
+msgstr "Español de Nicaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "Español venezolano"
+
+msgid "Estonian"
+msgstr "Estonio"
+
+msgid "Basque"
+msgstr "Vasco"
+
+msgid "Persian"
+msgstr "Persa"
+
+msgid "Finnish"
+msgstr "Finés"
+
+msgid "French"
+msgstr "Francés"
+
+msgid "Frisian"
+msgstr "Frisón"
+
+msgid "Irish"
+msgstr "Irlandés"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Gallego"
+
+msgid "Hebrew"
+msgstr "Hebreo"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croata"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Húngaro"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesio"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandés"
+
+msgid "Italian"
+msgstr "Italiano"
+
+msgid "Japanese"
+msgstr "Japonés"
+
+msgid "Georgian"
+msgstr "Georgiano"
+
+msgid "Kazakh"
+msgstr "Kazajo"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Koreano"
+
+msgid "Luxembourgish"
+msgstr "Luxenburgués"
+
+msgid "Lithuanian"
+msgstr "Lituano"
+
+msgid "Latvian"
+msgstr "Letón"
+
+msgid "Macedonian"
+msgstr "Macedonio"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongol"
+
+msgid "Marathi"
+msgstr "Maratí"
+
+msgid "Burmese"
+msgstr "Birmano"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Nepalí"
+
+msgid "Dutch"
+msgstr "Holandés"
+
+msgid "Norwegian Nynorsk"
+msgstr "Nynorsk"
+
+msgid "Ossetic"
+msgstr "Osetio"
+
+msgid "Punjabi"
+msgstr "Panyabí"
+
+msgid "Polish"
+msgstr "Polaco"
+
+msgid "Portuguese"
+msgstr "Portugués"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugués brasileño"
+
+msgid "Romanian"
+msgstr "Rumano"
+
+msgid "Russian"
+msgstr "Ruso"
+
+msgid "Slovak"
+msgstr "Eslovaco"
+
+msgid "Slovenian"
+msgstr "Esloveno"
+
+msgid "Albanian"
+msgstr "Albanés"
+
+msgid "Serbian"
+msgstr "Serbio"
+
+msgid "Serbian Latin"
+msgstr "Serbio latino"
+
+msgid "Swedish"
+msgstr "Sueco"
+
+msgid "Swahili"
+msgstr "Suajili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Tailandés"
+
+msgid "Turkish"
+msgstr "Turco"
+
+msgid "Tatar"
+msgstr "Tártaro"
+
+msgid "Udmurt"
+msgstr "Udmurt"
+
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "Chino simplificado"
+
+msgid "Traditional Chinese"
+msgstr "Chino tradicional"
+
+msgid "Messages"
+msgstr "Mensajes"
+
+msgid "Site Maps"
+msgstr "Mapas del sitio"
+
+msgid "Static Files"
+msgstr "Archivos estáticos"
+
+msgid "Syndication"
+msgstr "Sindicación"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Ingrese un valor válido."
+
+msgid "Enter a valid URL."
+msgstr "Ingrese una URL válida."
+
+msgid "Enter a valid integer."
+msgstr "Ingrese un entero válido."
+
+msgid "Enter a valid email address."
+msgstr "Ingrese una dirección de correo electrónico válida."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Ingrese un 'slug' válido, compuesto por letras, números, guiones bajos o "
+"guiones."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Ingrese un 'slug' válido, compuesto por letras del conjunto Unicode, "
+"números, guiones bajos o guiones."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Ingrese una dirección IPv4 válida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Ingrese una dirección IPv6 válida."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Ingrese una dirección IPv4 o IPv6 válida."
+
+msgid "Enter only digits separated by commas."
+msgstr "Ingrese solo números separados por comas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Asegúrese de que este valor es %(limit_value)s (es %(show_value)s )."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter "
+"(tiene %(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres "
+"(tiene %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter "
+"(tiene %(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres "
+"(tiene %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Asegúrese de que no hayan mas de %(max)s dígito en total."
+msgstr[1] "Asegúrese de que no hayan mas de %(max)s dígitos en total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Asegúrese de que no hayan más de %(max)s decimal."
+msgstr[1] "Asegúrese de que no hayan más de %(max)s decimales."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Asegúrese de que no hayan más de %(max)s dígito antes del punto decimal."
+msgstr[1] ""
+"Asegúrese de que no hayan más de %(max)s dígitos antes del punto decimal"
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Valor %(value)r no es una opción válida."
+
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+msgid "This field cannot be blank."
+msgstr "Este campo no puede estar en blanco."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Tipo de campo: %(field_type)s"
+
+msgid "Integer"
+msgstr "Entero"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' debe ser un valor entero."
+
+msgid "Big (8 byte) integer"
+msgstr "Entero grande (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s' debe ser Verdadero o Falso"
+
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (máximo %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' tiene un formato de fecha no válida. Este valor debe estar en el "
+"formato AAAA-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"El valor '%(value)s' tiene un formato correcto (AAAA-MM-DD) pero es una "
+"fecha invalida."
+
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"'%(value)s' tiene un formato de fecha no válido. Este valor debe estar en el "
+"formato AAAA-MM-DD HH: [TZ]: MM [ss [uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"El valor '%(value)s' tiene un formato correcto (AAAA-MM-DD HH: MM [:. Ss "
+"[uuuuuu]] [TZ]) pero es una fecha/hora invalida."
+
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "El valor '%(value)s' debe ser un número decimal."
+
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"'%(value)s' tiene un formato no válido. Este valor debe estar en el formato "
+"[DD] [HH:[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Duración"
+
+msgid "Email address"
+msgstr "Dirección de correo electrónico"
+
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "El valor '%(value)s' debe ser un número real."
+
+msgid "Floating point number"
+msgstr "Número de punto flotante"
+
+msgid "IPv4 address"
+msgstr "Dirección IPv4"
+
+msgid "IP address"
+msgstr "Dirección IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "El valor '%(value)s' debe ser Nulo, Verdadero o Falso"
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+msgid "Positive integer"
+msgstr "Entero positivo"
+
+msgid "Positive small integer"
+msgstr "Entero positivo pequeño"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (hasta %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Entero pequeño"
+
+msgid "Text"
+msgstr "Texto"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"El valor '%(value)s' tiene un formato no válido. Este debe estar en el "
+"formato HH:MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"El valor '%(value)s' tiene un formato correcto (HH:MM[:ss[.uuuuuu]]) pero "
+"tiene la hora invalida."
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Datos de binarios brutos"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' no es un UUID válido."
+
+msgid "File"
+msgstr "Archivo"
+
+msgid "Image"
+msgstr "Imagen"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "La instancia del %(model)s con %(field)s %(value)r no existe."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Llave foránea (tipo determinado por el campo relacionado)"
+
+msgid "One-to-one relationship"
+msgstr "Relación uno-a-uno"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Relación muchos-a-muchos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+msgid "Enter a whole number."
+msgstr "Ingrese un número entero."
+
+msgid "Enter a number."
+msgstr "Ingrese un número."
+
+msgid "Enter a valid date."
+msgstr "Ingrese una fecha válida."
+
+msgid "Enter a valid time."
+msgstr "Ingrese una hora válida."
+
+msgid "Enter a valid date/time."
+msgstr "Ingrese una fecha/hora válida."
+
+msgid "Enter a valid duration."
+msgstr "Ingrese una duración válida."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el "
+"formulario."
+
+msgid "No file was submitted."
+msgstr "No se ha enviado ningún fichero."
+
+msgid "The submitted file is empty."
+msgstr "El fichero enviado está vacío."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter "
+"(tiene %(length)d)."
+msgstr[1] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres "
+"(tiene %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Por favor envíe un fichero o marque la casilla de limpiar, pero no ambos."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se "
+"trataba de una imagen corrupta."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Escoja una opción válida. %(value)s no es una de las opciones disponibles."
+
+msgid "Enter a list of values."
+msgstr "Ingrese una lista de valores."
+
+msgid "Enter a complete value."
+msgstr "Ingrese un valor completo."
+
+msgid "Enter a valid UUID."
+msgstr "Ingrese un UUID válido."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Campo oculto %(name)s) *%(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Los datos de ManagementForm faltan o han sido manipulados"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Por favor, envíe %d o menos formularios."
+msgstr[1] "Por favor, envíe %d o menos formularios."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Por favor, envíe %d o mas formularios."
+msgstr[1] "Por favor, envíe %d o mas formularios."
+
+msgid "Order"
+msgstr "Orden"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Por favor, corrija el dato duplicado para %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Por favor corrija el dato duplicado para %(field)s, este debe ser único."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Por favor corrija los datos duplicados para %(field_name)s este debe ser "
+"único para %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Por favor, corrija los valores duplicados abajo."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Escoja una opción válida. Esa opción no está entre las disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s no puede interpretarse en el huso horario %(current_timezone)s; "
+"puede ser ambiguo o puede no existir."
+
+msgid "Clear"
+msgstr "Limpiar"
+
+msgid "Currently"
+msgstr "Actualmente"
+
+msgid "Change"
+msgstr "Cambiar"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "sí, no, quizás"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "medianoche"
+
+msgid "noon"
+msgstr "mediodía"
+
+msgid "Monday"
+msgstr "Lunes"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgid "Thursday"
+msgstr "Jueves"
+
+msgid "Friday"
+msgstr "Viernes"
+
+msgid "Saturday"
+msgstr "Sábado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Mon"
+msgstr "Lun"
+
+msgid "Tue"
+msgstr "Mar"
+
+msgid "Wed"
+msgstr "Mié"
+
+msgid "Thu"
+msgstr "Jue"
+
+msgid "Fri"
+msgstr "Vie"
+
+msgid "Sat"
+msgstr "Sáb"
+
+msgid "Sun"
+msgstr "Dom"
+
+msgid "January"
+msgstr "Enero"
+
+msgid "February"
+msgstr "Febrero"
+
+msgid "March"
+msgstr "Marzo"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Mayo"
+
+msgid "June"
+msgstr "Junio"
+
+msgid "July"
+msgstr "Julio"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Septiembre"
+
+msgid "October"
+msgstr "Octubre"
+
+msgid "November"
+msgstr "Noviembre"
+
+msgid "December"
+msgstr "Diciembre"
+
+msgid "jan"
+msgstr "ene"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "abr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "ago"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dic"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ene."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sep."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dic."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Enero"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Febrero"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Agosto"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Septiembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Octubre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Noviembre"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Diciembre"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Esta no es una dirección IPv6 válida."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "o"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ","
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d año"
+msgstr[1] "%d años"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d meses"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d días"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+msgid "0 minutes"
+msgstr "0 minutos"
+
+msgid "Forbidden"
+msgstr "Prohibido"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Verificación CSRF fallida. Solicitud abortada."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Estás viendo este mensaje porque este sitio web es HTTPS y requiere que tu "
+"navegador envíe una 'Referer header' y no se envió ninguna. Esta cabecera se "
+"necesita por razones de seguridad, para asegurarse de que tu navegador no ha "
+"sido comprometido por terceras partes."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Si has configurado tu navegador desactivando las cabeceras 'Referer', por "
+"favor vuélvelas a activar, al menos para esta web, o para conexiones HTTPS, "
+"o para peticiones 'same-origin'."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se "
+"envían formularios. Esta cookie se necesita por razones de seguridad, para "
+"asegurar que tu navegador no ha sido comprometido por terceras partes."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Si has inhabilitado las cookies en tu navegador, por favor habilítalas "
+"nuevamente al menos para este sitio, o para peticiones 'same-origin'."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Se puede ver más información si se establece DEBUG=True."
+
+msgid "No year specified"
+msgstr "No se ha indicado el año"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "No se ha indicado el mes"
+
+msgid "No day specified"
+msgstr "No se ha indicado el día"
+
+msgid "No week specified"
+msgstr "No se ha indicado la semana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "No %(verbose_name_plural)s disponibles"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Los futuros %(verbose_name_plural)s no están disponibles porque "
+"%(class_name)s.allow_future es Falso."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Fecha '%(datestr)s' no válida, el formato válido es '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "La página no es la \"ultima\", ni puede ser convertida a un entero."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Página inválida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Lista vacía y '%(class_name)s.allow_empty' es Falso."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Los índices de directorio no están permitidos."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" no existe"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Índice de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..1aed5c3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..acbce27
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/formats.py
new file mode 100644
index 0000000..cefbe26
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_CO/formats.py
@@ -0,0 +1,26 @@
+# This file is distributed under the same license as the Django package.
+#
+DATE_FORMAT = r'j \d\e F \d\e Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i'
+YEAR_MONTH_FORMAT = r'F \d\e Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y H:i'
+FIRST_DAY_OF_WEEK = 1
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06'
+ '%Y%m%d', # '20061025'
+
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S',
+ '%d/%m/%Y %H:%M:%S.%f',
+ '%d/%m/%Y %H:%M',
+ '%d/%m/%y %H:%M:%S',
+ '%d/%m/%y %H:%M:%S.%f',
+ '%d/%m/%y %H:%M',
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..68ab9ee
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po
new file mode 100644
index 0000000..44f60f8
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po
@@ -0,0 +1,1204 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Abraham Estrada, 2011-2013
+# zodman , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/"
+"language/es_MX/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_MX\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "afrikáans"
+
+msgid "Arabic"
+msgstr "Árabe"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "Azerbaijani"
+
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+msgid "Belarusian"
+msgstr "bielorruso"
+
+msgid "Bengali"
+msgstr "Bengalí"
+
+msgid "Breton"
+msgstr "bretón"
+
+msgid "Bosnian"
+msgstr "Bosnio"
+
+msgid "Catalan"
+msgstr "Catalán"
+
+msgid "Czech"
+msgstr "Checo"
+
+msgid "Welsh"
+msgstr "Galés"
+
+msgid "Danish"
+msgstr "Danés"
+
+msgid "German"
+msgstr "Alemán"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Griego"
+
+msgid "English"
+msgstr "Inglés"
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr "Inglés británico"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Español"
+
+msgid "Argentinian Spanish"
+msgstr "Español de Argentina"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Español de México"
+
+msgid "Nicaraguan Spanish"
+msgstr "Español de nicaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "español de Venezuela"
+
+msgid "Estonian"
+msgstr "Estonio"
+
+msgid "Basque"
+msgstr "Vasco"
+
+msgid "Persian"
+msgstr "Persa"
+
+msgid "Finnish"
+msgstr "Finés"
+
+msgid "French"
+msgstr "Francés"
+
+msgid "Frisian"
+msgstr "Frisón"
+
+msgid "Irish"
+msgstr "Irlandés"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Gallego"
+
+msgid "Hebrew"
+msgstr "Hebreo"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croata"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Húngaro"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesio"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "Islandés"
+
+msgid "Italian"
+msgstr "Italiano"
+
+msgid "Japanese"
+msgstr "Japonés"
+
+msgid "Georgian"
+msgstr "Georgiano"
+
+msgid "Kazakh"
+msgstr "Kazajstán"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Coreano"
+
+msgid "Luxembourgish"
+msgstr "luxemburgués"
+
+msgid "Lithuanian"
+msgstr "Lituano"
+
+msgid "Latvian"
+msgstr "Letón"
+
+msgid "Macedonian"
+msgstr "Macedonio"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongol"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr "burmés"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Nepal"
+
+msgid "Dutch"
+msgstr "Holandés"
+
+msgid "Norwegian Nynorsk"
+msgstr "Noruego Nynorsk"
+
+msgid "Ossetic"
+msgstr "osetio"
+
+msgid "Punjabi"
+msgstr "Punjabi"
+
+msgid "Polish"
+msgstr "Polaco"
+
+msgid "Portuguese"
+msgstr "Portugués"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugués de Brasil"
+
+msgid "Romanian"
+msgstr "Rumano"
+
+msgid "Russian"
+msgstr "Ruso"
+
+msgid "Slovak"
+msgstr "Eslovaco"
+
+msgid "Slovenian"
+msgstr "Esloveno"
+
+msgid "Albanian"
+msgstr "Albanés"
+
+msgid "Serbian"
+msgstr "Serbio"
+
+msgid "Serbian Latin"
+msgstr "Latin Serbio"
+
+msgid "Swedish"
+msgstr "Sueco"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Tailandés"
+
+msgid "Turkish"
+msgstr "Turco"
+
+msgid "Tatar"
+msgstr "Tatar"
+
+msgid "Udmurt"
+msgstr "udmurto"
+
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "Chino simplificado"
+
+msgid "Traditional Chinese"
+msgstr "Chino tradicional"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Introduzca un valor válido."
+
+msgid "Enter a valid URL."
+msgstr "Ingrese una URL válida."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr "Introduzca una dirección de correo electrónico válida."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Introduzca un \"slug\", compuesto por letras, números, guiones bajos o "
+"medios."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Introduzca una dirección IPv4 válida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Introduzca una dirección IPv6 válida."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Introduzca una dirección IPv4 o IPv6 válida."
+
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo números separados por comas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Asegúrese de que este valor es %(limit_value)s (es %(show_value)s )."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracter "
+"(tiene %(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres "
+"(tiene %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+msgid "This field cannot be blank."
+msgstr "Este campo no puede estar en blanco."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Campo tipo: %(field_type)s"
+
+msgid "Integer"
+msgstr "Entero"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Entero grande (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Verdadero o Falso)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (máximo %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Dirección de correo electrónico"
+
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Número de punto flotante"
+
+msgid "IPv4 address"
+msgstr "Dirección IPv4"
+
+msgid "IP address"
+msgstr "Dirección IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+msgid "Positive integer"
+msgstr "Entero positivo"
+
+msgid "Positive small integer"
+msgstr "Entero positivo pequeño"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (hasta %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Entero pequeño"
+
+msgid "Text"
+msgstr "Texto"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "Archivo"
+
+msgid "Image"
+msgstr "Imagen"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clave foránea (el tipo está determinado por el campo relacionado)"
+
+msgid "One-to-one relationship"
+msgstr "Relación uno-a-uno"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Relación muchos-a-muchos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+msgid "Enter a valid date/time."
+msgstr "Introduzca una fecha/hora válida."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se envió un archivo. Verifique el tipo de codificación en el formulario."
+
+msgid "No file was submitted."
+msgstr "No se envió ningún archivo."
+
+msgid "The submitted file is empty."
+msgstr "El archivo enviado está vacío."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Por favor envíe un archivo o marque la casilla, no ambos."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Seleccione una imagen válida. El archivo que ha seleccionado no es una "
+"imagen o es un un archivo de imagen corrupto."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. %(value)s no es una de las opciones "
+"disponibles."
+
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "Ordenar"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Por favor, corrija la información duplicada en %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Por favor corrija la información duplicada en %(field)s, que debe ser única."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Por favor corrija la información duplicada en %(field_name)s que debe ser "
+"única para el %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Por favor, corrija los valores duplicados detallados mas abajo."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. La opción seleccionada no es una de las "
+"disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"La fecha %(datetime)s no puede se interpretada en la zona horaria "
+"%(current_timezone)s; ya que puede ser ambigua o que no pueden existir."
+
+msgid "Clear"
+msgstr "Borrar"
+
+msgid "Currently"
+msgstr "Actualmente"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "sí, no, tal vez"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "medianoche"
+
+msgid "noon"
+msgstr "mediodía"
+
+msgid "Monday"
+msgstr "Lunes"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgid "Thursday"
+msgstr "Jueves"
+
+msgid "Friday"
+msgstr "Viernes"
+
+msgid "Saturday"
+msgstr "Sábado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Mon"
+msgstr "Lun"
+
+msgid "Tue"
+msgstr "Mar"
+
+msgid "Wed"
+msgstr "Mie"
+
+msgid "Thu"
+msgstr "Jue"
+
+msgid "Fri"
+msgstr "Vie"
+
+msgid "Sat"
+msgstr "Sab"
+
+msgid "Sun"
+msgstr "Dom"
+
+msgid "January"
+msgstr "Enero"
+
+msgid "February"
+msgstr "Febrero"
+
+msgid "March"
+msgstr "Marzo"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Mayo"
+
+msgid "June"
+msgstr "Junio"
+
+msgid "July"
+msgstr "Julio"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Septiembre"
+
+msgid "October"
+msgstr "Octubre"
+
+msgid "November"
+msgstr "Noviembre"
+
+msgid "December"
+msgstr "Diciembre"
+
+msgid "jan"
+msgstr "ene"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "abr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "ago"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dic"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ene."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sep."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dic."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Enero"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Febrero"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Agosto"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Septiembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Octubre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Noviembre"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Diciembre"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "o"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ","
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d año"
+msgstr[1] "%d años"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d meses"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d días"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+msgid "0 minutes"
+msgstr "0 minutos"
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "No se ha especificado el valor año"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "No se ha especificado el valor mes"
+
+msgid "No day specified"
+msgstr "No se ha especificado el valor dia"
+
+msgid "No week specified"
+msgstr "No se ha especificado el valor semana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "No hay %(verbose_name_plural)s disponibles"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"No hay %(verbose_name_plural)s futuros disponibles porque %(class_name)s."
+"allow_future tiene el valor False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Cadena de fecha inválida '%(datestr)s', formato '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No se han encontrado %(verbose_name)s que coincidan con la consulta"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "La página no es \"last\", ni puede ser convertido a un int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Página inválida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Lista vacía y '%(class_name)s.allow_empty' tiene el valor False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Los índices del directorio no están permitidos."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" no existe"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Índice de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..bd280a4
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..51826ba
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/formats.py
new file mode 100644
index 0000000..228a821
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_MX/formats.py
@@ -0,0 +1,25 @@
+# This file is distributed under the same license as the Django package.
+#
+DATE_FORMAT = r'j \d\e F \d\e Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i'
+YEAR_MONTH_FORMAT = r'F \d\e Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday: ISO 8601
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06'
+ '%Y%m%d', # '20061025'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S',
+ '%d/%m/%Y %H:%M:%S.%f',
+ '%d/%m/%Y %H:%M',
+ '%d/%m/%y %H:%M:%S',
+ '%d/%m/%y %H:%M:%S.%f',
+ '%d/%m/%y %H:%M',
+]
+DECIMAL_SEPARATOR = '.' # ',' is also official (less common): NOM-008-SCFI-2002
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..af025d6
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..645f93d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/formats.py
new file mode 100644
index 0000000..2eacf50
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_NI/formats.py
@@ -0,0 +1,26 @@
+# This file is distributed under the same license as the Django package.
+#
+DATE_FORMAT = r'j \d\e F \d\e Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i'
+YEAR_MONTH_FORMAT = r'F \d\e Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday: ISO 8601
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06'
+ '%Y%m%d', # '20061025'
+
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S',
+ '%d/%m/%Y %H:%M:%S.%f',
+ '%d/%m/%Y %H:%M',
+ '%d/%m/%y %H:%M:%S',
+ '%d/%m/%y %H:%M:%S.%f',
+ '%d/%m/%y %H:%M',
+]
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..e8266ca
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..273a1e6
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/formats.py
new file mode 100644
index 0000000..7f53ef9
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_PR/formats.py
@@ -0,0 +1,27 @@
+# This file is distributed under the same license as the Django package.
+#
+DATE_FORMAT = r'j \d\e F \d\e Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i'
+YEAR_MONTH_FORMAT = r'F \d\e Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y H:i'
+FIRST_DAY_OF_WEEK = 0 # Sunday
+
+DATE_INPUT_FORMATS = [
+ # '31/12/2009', '31/12/09'
+ '%d/%m/%Y', '%d/%m/%y'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S',
+ '%d/%m/%Y %H:%M:%S.%f',
+ '%d/%m/%Y %H:%M',
+ '%d/%m/%y %H:%M:%S',
+ '%d/%m/%y %H:%M:%S.%f',
+ '%d/%m/%y %H:%M',
+]
+
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..51ee3a5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po
new file mode 100644
index 0000000..db2d592
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po
@@ -0,0 +1,1245 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Eduardo , 2017
+# Leonardo J. Caballero G. , 2016
+# Sebastián Magrí , 2011
+# Yoel Acevedo, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/"
+"language/es_VE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_VE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikáans"
+
+msgid "Arabic"
+msgstr "Árabe"
+
+msgid "Asturian"
+msgstr "Asturiano"
+
+msgid "Azerbaijani"
+msgstr "Azerí"
+
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+msgid "Belarusian"
+msgstr "Bielorruso"
+
+msgid "Bengali"
+msgstr "Bengalí"
+
+msgid "Breton"
+msgstr "Bretón"
+
+msgid "Bosnian"
+msgstr "Bosnio"
+
+msgid "Catalan"
+msgstr "Catalán"
+
+msgid "Czech"
+msgstr "Checo"
+
+msgid "Welsh"
+msgstr "Galés"
+
+msgid "Danish"
+msgstr "Danés"
+
+msgid "German"
+msgstr "Alemán"
+
+msgid "Lower Sorbian"
+msgstr "Sorbio Inferior"
+
+msgid "Greek"
+msgstr "Griego"
+
+msgid "English"
+msgstr "Inglés"
+
+msgid "Australian English"
+msgstr "Inglés Australiano"
+
+msgid "British English"
+msgstr "Inglés Británico"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Español"
+
+msgid "Argentinian Spanish"
+msgstr "Español de Argentina"
+
+msgid "Colombian Spanish"
+msgstr "Español de Colombia"
+
+msgid "Mexican Spanish"
+msgstr "Español de México"
+
+msgid "Nicaraguan Spanish"
+msgstr "Español de Nicaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "Español de Venezuela"
+
+msgid "Estonian"
+msgstr "Estonio"
+
+msgid "Basque"
+msgstr "Vazco"
+
+msgid "Persian"
+msgstr "Persa"
+
+msgid "Finnish"
+msgstr "Finlandés"
+
+msgid "French"
+msgstr "Francés"
+
+msgid "Frisian"
+msgstr "Frisio"
+
+msgid "Irish"
+msgstr "Irlandés"
+
+msgid "Scottish Gaelic"
+msgstr "Gaélico Escocés"
+
+msgid "Galician"
+msgstr "Galés"
+
+msgid "Hebrew"
+msgstr "Hebreo"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croata"
+
+msgid "Upper Sorbian"
+msgstr "Sorbio Superior"
+
+msgid "Hungarian"
+msgstr "Húngaro"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesio"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandés"
+
+msgid "Italian"
+msgstr "Italiano"
+
+msgid "Japanese"
+msgstr "Japonés"
+
+msgid "Georgian"
+msgstr "Georgiano"
+
+msgid "Kazakh"
+msgstr "Kazajo"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Canarés"
+
+msgid "Korean"
+msgstr "Coreano"
+
+msgid "Luxembourgish"
+msgstr "Luxenburgués"
+
+msgid "Lithuanian"
+msgstr "Lituano"
+
+msgid "Latvian"
+msgstr "Latvio"
+
+msgid "Macedonian"
+msgstr "Macedonio"
+
+msgid "Malayalam"
+msgstr "Malayala"
+
+msgid "Mongolian"
+msgstr "Mongol"
+
+msgid "Marathi"
+msgstr "Maratí"
+
+msgid "Burmese"
+msgstr "Birmano"
+
+msgid "Norwegian Bokmål"
+msgstr "Noruego"
+
+msgid "Nepali"
+msgstr "Nepalí"
+
+msgid "Dutch"
+msgstr "Holandés"
+
+msgid "Norwegian Nynorsk"
+msgstr "Nynorsk"
+
+msgid "Ossetic"
+msgstr "Osetio"
+
+msgid "Punjabi"
+msgstr "Punjabi"
+
+msgid "Polish"
+msgstr "Polaco"
+
+msgid "Portuguese"
+msgstr "Portugués"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugués de Brasil"
+
+msgid "Romanian"
+msgstr "Ruman"
+
+msgid "Russian"
+msgstr "Ruso"
+
+msgid "Slovak"
+msgstr "Eslovaco"
+
+msgid "Slovenian"
+msgstr "Eslovenio"
+
+msgid "Albanian"
+msgstr "Albano"
+
+msgid "Serbian"
+msgstr "Serbi"
+
+msgid "Serbian Latin"
+msgstr "Latín Serbio"
+
+msgid "Swedish"
+msgstr "Sueco"
+
+msgid "Swahili"
+msgstr "Suajili"
+
+msgid "Tamil"
+msgstr "Tamil"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Tailandés"
+
+msgid "Turkish"
+msgstr "Turco"
+
+msgid "Tatar"
+msgstr "Tártaro"
+
+msgid "Udmurt"
+msgstr "Udmurt"
+
+msgid "Ukrainian"
+msgstr "Ucranio"
+
+msgid "Urdu"
+msgstr "Urdu"
+
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "Chino simplificado"
+
+msgid "Traditional Chinese"
+msgstr "Chino tradicional"
+
+msgid "Messages"
+msgstr "Mensajes"
+
+msgid "Site Maps"
+msgstr "Mapas del sitio"
+
+msgid "Static Files"
+msgstr "Archivos estáticos"
+
+msgid "Syndication"
+msgstr "Sindicación"
+
+msgid "That page number is not an integer"
+msgstr "Ese número de página no es un número entero"
+
+msgid "That page number is less than 1"
+msgstr "Ese número de página es menor que 1"
+
+msgid "That page contains no results"
+msgstr "Esa página no contiene resultados"
+
+msgid "Enter a valid value."
+msgstr "Introduzca un valor válido."
+
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+msgid "Enter a valid integer."
+msgstr "Ingrese un valor válido."
+
+msgid "Enter a valid email address."
+msgstr "Ingrese una dirección de correo electrónico válida."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Introduzca un 'slug' válido, consistente de letras, números, guiones bajos o "
+"guiones."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Ingrese un 'slug' válido, compuesto por letras del conjunto Unicode, "
+"números, guiones bajos o guiones."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Introduzca una dirección IPv4 válida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Ingrese una dirección IPv6 válida."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Ingrese una dirección IPv4 o IPv6 válida."
+
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca solo dígitos separados por comas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Asegúrese de que este valor %(limit_value)s (ahora es %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor es menor o igual que %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Asegúrese de que este valor es mayor o igual que %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter "
+"(tiene %(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres "
+"(tiene %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter "
+"(tiene %(show_value)d)."
+msgstr[1] ""
+"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres "
+"(tiene %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Asegúrese de que no hayan más de %(max)s dígito en total."
+msgstr[1] "Asegúrese de que no hayan más de %(max)s dígitos en total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Asegúrese de que no hayan más de %(max)s decimal."
+msgstr[1] "Asegúrese de que no hayan más de %(max)s decimales."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Asegúrese de que no hayan más de %(max)s dígito antes del punto decimal."
+msgstr[1] ""
+"Asegúrese de que no hayan más de %(max)s dígitos antes del punto decimal."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"La extensión de archivo '%(extension)s' no está permitida. Las extensiones "
+"permitidas son ' %(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "y"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s con este %(field_labels)s ya existe."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Valor %(value)r no es una opción válida."
+
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+msgid "This field cannot be blank."
+msgstr "Este campo no puede estar en blanco."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s con esta %(field_label)s ya existe."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Tipo de campo: %(field_type)s"
+
+msgid "Integer"
+msgstr "Entero"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' debe ser un valor entero."
+
+msgid "Big (8 byte) integer"
+msgstr "Entero grande (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s' debe ser Verdadero o Falso."
+
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (máximo %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' tiene un formato de fecha no válida. Este valor debe estar en el "
+"formato AAAA-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"valor '%(value)s' tiene un formato correcto (AAAA-MM-DD) pero es una fecha "
+"invalida."
+
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"'%(value)s' tiene un formato de fecha no válido. Este valor debe estar en el "
+"formato AAAA-MM-DD HH:MM[:ss[.uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"el valor '%(value)s' tiene un formato correcto (AAAA-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ]) pero es una fecha/hora invalida."
+
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "el valor '%(value)s' debe ser un número decimal."
+
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"el valor '%(value)s' tiene un formato no válido. Este valor debe estar en el "
+"formato [DD] [HH:[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Duración"
+
+msgid "Email address"
+msgstr "Dirección de correo electrónico"
+
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "el valor '%(value)s' debe ser un número real."
+
+msgid "Floating point number"
+msgstr "Número de punto flotante"
+
+msgid "IPv4 address"
+msgstr "Dirección IPv4"
+
+msgid "IP address"
+msgstr "Dirección IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "el valor '%(value)s' debe ser Nulo, Verdadero o Falso."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+msgid "Positive integer"
+msgstr "Entero positivo"
+
+msgid "Positive small integer"
+msgstr "Entero positivo pequeño"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (hasta %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Entero pequeño"
+
+msgid "Text"
+msgstr "Texto"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"el valor '%(value)s' tiene un formato no válido. Este debe estar en el "
+"formato HH:MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"el valor '%(value)s' tiene un formato correcto (HH:MM[:ss[.uuuuuu]]) pero "
+"tiene la hora invalida."
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Datos de binarios brutos"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' no es un UUID válido."
+
+msgid "File"
+msgstr "Archivo"
+
+msgid "Image"
+msgstr "Imagen"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "la instancia del %(model)s con %(field)s %(value)r no existe."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clave foránea (tipo determinado por el campo relacionado)"
+
+msgid "One-to-one relationship"
+msgstr "Relación uno a uno"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "Relación %(from)s - %(to)s "
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "Relaciones %(from)s - %(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Relación muchos a muchos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+msgid "Enter a whole number."
+msgstr "Introduzca un número completo."
+
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+msgid "Enter a valid date/time."
+msgstr "Introduzca una hora y fecha válida."
+
+msgid "Enter a valid duration."
+msgstr "Ingrese una duración válida."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se envió archivo alguno. Revise el tipo de codificación del formulario."
+
+msgid "No file was submitted."
+msgstr "No se envió ningún archivo."
+
+msgid "The submitted file is empty."
+msgstr "El archivo enviado está vacío."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter "
+"(tiene %(length)d)."
+msgstr[1] ""
+"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres "
+"(tiene %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Por favor provea un archivo o active el selector de limpiar, no ambos."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se "
+"trataba de una imagen corrupta."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Escoja una opción válida. %(value)s no es una de las opciones disponibles."
+
+msgid "Enter a list of values."
+msgstr "Ingrese una lista de valores."
+
+msgid "Enter a complete value."
+msgstr "Ingrese un valor completo."
+
+msgid "Enter a valid UUID."
+msgstr "Ingrese un UUID válido."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Campo oculto %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Los datos de ManagementForm faltan o han sido manipulados"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Por favor, envíe %d o un menor número de formularios."
+msgstr[1] "Por favor, envíe %d o un menor número de formularios."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Por favor, envíe %d o más formularios."
+msgstr[1] "Por favor, envíe %d o más formularios."
+
+msgid "Order"
+msgstr "Orden"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Por favor, corrija el dato duplicado para %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Por favor, corrija el dato duplicado para %(field)s, este debe ser único."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Por favor, corrija los datos duplicados para %(field_name)s este debe ser "
+"único para %(lookup)s en %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Por favor, corrija los valores duplicados abajo."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Escoja una opción válida. Esa opción no está entre las opciones disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s no puede interpretarse en la zona horaria %(current_timezone)s; "
+"puede ser ambiguo o puede no existir."
+
+msgid "Clear"
+msgstr "Limpiar"
+
+msgid "Currently"
+msgstr "Actualmente"
+
+msgid "Change"
+msgstr "Cambiar"
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Yes"
+msgstr "Sí"
+
+msgid "No"
+msgstr "No"
+
+msgid "yes,no,maybe"
+msgstr "sí, no, quizás"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "medianoche"
+
+msgid "noon"
+msgstr "mediodía"
+
+msgid "Monday"
+msgstr "Lunes"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgid "Thursday"
+msgstr "Jueves"
+
+msgid "Friday"
+msgstr "Viernes"
+
+msgid "Saturday"
+msgstr "Sábado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Mon"
+msgstr "Lun"
+
+msgid "Tue"
+msgstr "Mar"
+
+msgid "Wed"
+msgstr "Mié"
+
+msgid "Thu"
+msgstr "Jue"
+
+msgid "Fri"
+msgstr "Vie"
+
+msgid "Sat"
+msgstr "Sáb"
+
+msgid "Sun"
+msgstr "Dom"
+
+msgid "January"
+msgstr "Enero"
+
+msgid "February"
+msgstr "Febrero"
+
+msgid "March"
+msgstr "Marzo"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Mayo"
+
+msgid "June"
+msgstr "Junio"
+
+msgid "July"
+msgstr "Julio"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Septiembre"
+
+msgid "October"
+msgstr "Octubre"
+
+msgid "November"
+msgstr "Noviembre"
+
+msgid "December"
+msgstr "Diciembre"
+
+msgid "jan"
+msgstr "ene"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "abr"
+
+msgid "may"
+msgstr "may"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "ago"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dic"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ene."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sep."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dic."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Enero"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Febrero"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Marzo"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mayo"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Junio"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Julio"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Agosto"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Septiembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Octubre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Noviembre"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Diciembre"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Esta no es una dirección IPv6 válida."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "o"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d año"
+msgstr[1] "%d años"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d meses"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d días"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+msgid "0 minutes"
+msgstr "0 minutos"
+
+msgid "Forbidden"
+msgstr "Prohibido"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Verificación CSRF fallida. Solicitud abortada."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Estás viendo este mensaje porque este sitio web es HTTPS y requiere que tu "
+"navegador envíe una 'Referer header' y no se envió ninguna. Esta cabecera se "
+"necesita por razones de seguridad, para asegurarse de que tu navegador no ha "
+"sido comprometido por terceras partes."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Si has configurado tu navegador desactivando las cabeceras 'Referer', por "
+"favor vuélvelas a activar, al menos para esta web, o para conexiones HTTPS, "
+"o para peticiones 'same-origin'."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se "
+"envían formularios. Esta cookie se necesita por razones de seguridad, para "
+"asegurar que tu navegador no ha sido comprometido por terceras partes."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Si has inhabilitado las cookies en tu navegador, por favor habilítalas "
+"nuevamente al menos para este sitio, o para peticiones 'same-origin'."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Se puede ver más información si se establece DEBUG=True."
+
+msgid "No year specified"
+msgstr "No se ha indicado el año"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "No se ha indicado el mes"
+
+msgid "No day specified"
+msgstr "No se ha indicado el día"
+
+msgid "No week specified"
+msgstr "No se ha indicado la semana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "No %(verbose_name_plural)s disponibles"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Los futuros %(verbose_name_plural)s no están disponibles porque "
+"%(class_name)s.allow_future es Falso."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Fecha '%(datestr)s' no válida, el formato válido es '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "La página no es la 'ultima', ni puede ser convertida a un entero."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Página inválida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Lista vacía y '%(class_name)s.allow_empty' es Falso."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Los índices de directorio no están permitidos."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" no existe"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Índice de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..92688c5
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.po
new file mode 100644
index 0000000..7e8fccb
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.po
@@ -0,0 +1,1247 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# eallik , 2011
+# Jannis Leidel , 2011
+# Janno Liivak , 2013-2015
+# madisvain , 2011
+# Martin Pajuste , 2014-2015
+# Martin Pajuste , 2016-2017
+# Marti Raudsepp , 2014,2016
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 10:26+0000\n"
+"Last-Translator: Martin Pajuste \n"
+"Language-Team: Estonian (http://www.transifex.com/django/django/language/"
+"et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "afrikaani"
+
+msgid "Arabic"
+msgstr "araabia"
+
+msgid "Asturian"
+msgstr "astuuria"
+
+msgid "Azerbaijani"
+msgstr "aserbaidžaani"
+
+msgid "Bulgarian"
+msgstr "bulgaaria"
+
+msgid "Belarusian"
+msgstr "valgevene"
+
+msgid "Bengali"
+msgstr "bengali"
+
+msgid "Breton"
+msgstr "bretooni"
+
+msgid "Bosnian"
+msgstr "bosnia"
+
+msgid "Catalan"
+msgstr "katalaani"
+
+msgid "Czech"
+msgstr "tšehhi"
+
+msgid "Welsh"
+msgstr "uelsi"
+
+msgid "Danish"
+msgstr "taani"
+
+msgid "German"
+msgstr "saksa"
+
+msgid "Lower Sorbian"
+msgstr " alamsorbi"
+
+msgid "Greek"
+msgstr "kreeka"
+
+msgid "English"
+msgstr "inglise"
+
+msgid "Australian English"
+msgstr "austraalia inglise"
+
+msgid "British English"
+msgstr "briti inglise"
+
+msgid "Esperanto"
+msgstr "esperanto"
+
+msgid "Spanish"
+msgstr "hispaania"
+
+msgid "Argentinian Spanish"
+msgstr "argentiina hispaani"
+
+msgid "Colombian Spanish"
+msgstr "kolumbia hispaania"
+
+msgid "Mexican Spanish"
+msgstr "mehhiko hispaania"
+
+msgid "Nicaraguan Spanish"
+msgstr "nikaraagua hispaania"
+
+msgid "Venezuelan Spanish"
+msgstr "venetsueela hispaania"
+
+msgid "Estonian"
+msgstr "eesti"
+
+msgid "Basque"
+msgstr "baski"
+
+msgid "Persian"
+msgstr "pärsia"
+
+msgid "Finnish"
+msgstr "soome"
+
+msgid "French"
+msgstr "prantsuse"
+
+msgid "Frisian"
+msgstr "friisi"
+
+msgid "Irish"
+msgstr "iiri"
+
+msgid "Scottish Gaelic"
+msgstr "šoti gaeli"
+
+msgid "Galician"
+msgstr "galiitsia"
+
+msgid "Hebrew"
+msgstr "heebrea"
+
+msgid "Hindi"
+msgstr "hindi"
+
+msgid "Croatian"
+msgstr "horvaatia"
+
+msgid "Upper Sorbian"
+msgstr "ülemsorbi"
+
+msgid "Hungarian"
+msgstr "ungari"
+
+msgid "Interlingua"
+msgstr "interlingua"
+
+msgid "Indonesian"
+msgstr "indoneesi"
+
+msgid "Ido"
+msgstr "ido"
+
+msgid "Icelandic"
+msgstr "islandi"
+
+msgid "Italian"
+msgstr "itaalia"
+
+msgid "Japanese"
+msgstr "jaapani"
+
+msgid "Georgian"
+msgstr "gruusia"
+
+msgid "Kazakh"
+msgstr "kasahhi"
+
+msgid "Khmer"
+msgstr "khmeri"
+
+msgid "Kannada"
+msgstr "kannada"
+
+msgid "Korean"
+msgstr "korea"
+
+msgid "Luxembourgish"
+msgstr "letseburgi"
+
+msgid "Lithuanian"
+msgstr "leedu"
+
+msgid "Latvian"
+msgstr "läti"
+
+msgid "Macedonian"
+msgstr "makedoonia"
+
+msgid "Malayalam"
+msgstr "malaia"
+
+msgid "Mongolian"
+msgstr "mongoolia"
+
+msgid "Marathi"
+msgstr "marathi"
+
+msgid "Burmese"
+msgstr "birma"
+
+msgid "Norwegian Bokmål"
+msgstr "norra bokmål"
+
+msgid "Nepali"
+msgstr "nepali"
+
+msgid "Dutch"
+msgstr "hollandi"
+
+msgid "Norwegian Nynorsk"
+msgstr "norra (nynorsk)"
+
+msgid "Ossetic"
+msgstr "osseetia"
+
+msgid "Punjabi"
+msgstr "pandžab"
+
+msgid "Polish"
+msgstr "poola"
+
+msgid "Portuguese"
+msgstr "portugali"
+
+msgid "Brazilian Portuguese"
+msgstr "brasiilia portugali"
+
+msgid "Romanian"
+msgstr "rumeenia"
+
+msgid "Russian"
+msgstr "vene"
+
+msgid "Slovak"
+msgstr "slovaki"
+
+msgid "Slovenian"
+msgstr "sloveeni"
+
+msgid "Albanian"
+msgstr "albaania"
+
+msgid "Serbian"
+msgstr "serbia"
+
+msgid "Serbian Latin"
+msgstr "serbia (ladina)"
+
+msgid "Swedish"
+msgstr "rootsi"
+
+msgid "Swahili"
+msgstr "suahiili"
+
+msgid "Tamil"
+msgstr "tamiili"
+
+msgid "Telugu"
+msgstr "telugu"
+
+msgid "Thai"
+msgstr "tai"
+
+msgid "Turkish"
+msgstr "türgi"
+
+msgid "Tatar"
+msgstr "tatari"
+
+msgid "Udmurt"
+msgstr "udmurdi"
+
+msgid "Ukrainian"
+msgstr "ukrania"
+
+msgid "Urdu"
+msgstr "urdu"
+
+msgid "Vietnamese"
+msgstr "vietnami"
+
+msgid "Simplified Chinese"
+msgstr "lihtsustatud hiina"
+
+msgid "Traditional Chinese"
+msgstr "traditsiooniline hiina"
+
+msgid "Messages"
+msgstr "Sõnumid"
+
+msgid "Site Maps"
+msgstr "Saidikaardid"
+
+msgid "Static Files"
+msgstr "Staatilised failid"
+
+msgid "Syndication"
+msgstr "Sündikeerimine"
+
+msgid "That page number is not an integer"
+msgstr "See lehe number ei ole täisarv"
+
+msgid "That page number is less than 1"
+msgstr "See lehe number on väiksem kui 1"
+
+msgid "That page contains no results"
+msgstr "See leht ei sisalda tulemusi"
+
+msgid "Enter a valid value."
+msgstr "Sisestage korrektne väärtus."
+
+msgid "Enter a valid URL."
+msgstr "Sisestage korrektne URL."
+
+msgid "Enter a valid integer."
+msgstr "Sisestage korrektne täisarv."
+
+msgid "Enter a valid email address."
+msgstr "Sisestage korrektne e-posti aadress."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"See väärtus võib sisaldada ainult tähti, numbreid, alljooni ja sidekriipse."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Sisesta korrektne 'nälk', mis koosneb Unicode tähtedest, numbritest, ala- ja "
+"sidekriipsudest."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Sisestage korrektne IPv4 aadress."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Sisestage korrektne IPv6 aadress."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Sisestage korrektne IPv4 või IPv6 aadress."
+
+msgid "Enter only digits separated by commas."
+msgstr "Sisestage ainult komaga eraldatud numbreid."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Veendu, et see väärtus on %(limit_value)s (hetkel on %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Veendu, et see väärtus on väiksem või võrdne kui %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Veendu, et see väärtus on suurem või võrdne kui %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Väärtuses peab olema vähemalt %(limit_value)d tähemärk (praegu on "
+"%(show_value)d)."
+msgstr[1] ""
+"Väärtuses peab olema vähemalt %(limit_value)d tähemärki (praegu on "
+"%(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärk (praegu on "
+"%(show_value)d)."
+msgstr[1] ""
+"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärki (praegu on "
+"%(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s."
+msgstr[1] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s."
+msgstr[1] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s."
+msgstr[1] ""
+"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Faililaiend '%(extension)s' ei ole lubatud. Lubatud laiendid on: "
+"'%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "ja"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s väljaga %(field_labels)s on juba olemas."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Väärtus %(value)r ei ole kehtiv valik."
+
+msgid "This field cannot be null."
+msgstr "See lahter ei tohi olla tühi."
+
+msgid "This field cannot be blank."
+msgstr "See väli ei saa olla tühi."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Sellise %(field_label)s-väljaga %(model_name)s on juba olemas."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s peab olema unikaalne %(date_field_label)s %(lookup_type)s "
+"suhtes."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Lahter tüüpi: %(field_type)s"
+
+msgid "Integer"
+msgstr "Täisarv"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' väärtus peab olema täisarv."
+
+msgid "Big (8 byte) integer"
+msgstr "Suur (8 baiti) täisarv"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s' väärtus peab olema kas Tõene või Väär."
+
+msgid "Boolean (Either True or False)"
+msgstr "Tõeväärtus (Kas tõene või väär)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (kuni %(max_length)s märki)"
+
+msgid "Comma-separated integers"
+msgstr "Komaga eraldatud täisarvud"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' väärtusel on vale kuupäevaformaat. See peab olema kujul AAAA-KK-"
+"PP."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"'%(value)s' väärtusel on õige formaat (AAAA-KK-PP), kuid kuupäev on vale."
+
+msgid "Date (without time)"
+msgstr "Kuupäev (kellaajata)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"'%(value)s' väärtusel on vale formaat. Peab olema formaadis AAAA-KK-PP HH:"
+"MM[:ss[.uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"'%(value)s' väärtusel on õige formaat (AAAA-KK-PP HH:MM[:ss[.uuuuuu]][TZ]), "
+"kuid kuupäev/kellaaeg on vale."
+
+msgid "Date (with time)"
+msgstr "Kuupäev (kellaajaga)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "'%(value)s' väärtus peab olema kümnendarv."
+
+msgid "Decimal number"
+msgstr "Kümnendmurd"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"'%(value)s' väärtusel on vale formaat. Peab olema formaadis [DD] [HH:"
+"[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Kestus"
+
+msgid "Email address"
+msgstr "E-posti aadress"
+
+msgid "File path"
+msgstr "Faili asukoht"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "'%(value)s' väärtus peab olema ujukomaarv."
+
+msgid "Floating point number"
+msgstr "Ujukomaarv"
+
+msgid "IPv4 address"
+msgstr "IPv4 aadress"
+
+msgid "IP address"
+msgstr "IP aadress"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "'%(value)s' väärtus peab olema kas Puudub, Tõene või Väär."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Tõeväärtus (Kas tõene, väär või tühi)"
+
+msgid "Positive integer"
+msgstr "Positiivne täisarv"
+
+msgid "Positive small integer"
+msgstr "Positiivne väikene täisarv"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Nälk (kuni %(max_length)s märki)"
+
+msgid "Small integer"
+msgstr "Väike täisarv"
+
+msgid "Text"
+msgstr "Tekst"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"'%(value)s' väärtusel on vale formaat. Peab olema formaadis HH:MM[:ss[."
+"uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"'%(value)s' väärtusel on õige formaat (HH:MM[:ss[.uuuuuu]]), kuid kellaaeg "
+"on vale."
+
+msgid "Time"
+msgstr "Aeg"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Töötlemata binaarandmed"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' ei ole korrektne UUID."
+
+msgid "File"
+msgstr "Fail"
+
+msgid "Image"
+msgstr "Pilt"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "%(model)s isendit %(field)s %(value)r ei leidu."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Välisvõti (tüübi määrab seotud väli) "
+
+msgid "One-to-one relationship"
+msgstr "Üks-ühele seos"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "%(from)s-%(to)s seos"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "%(from)s-%(to)s seosed"
+
+msgid "Many-to-many relationship"
+msgstr "Mitu-mitmele seos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "See lahter on nõutav."
+
+msgid "Enter a whole number."
+msgstr "Sisestage täisarv."
+
+msgid "Enter a number."
+msgstr "Sisestage arv."
+
+msgid "Enter a valid date."
+msgstr "Sisestage korrektne kuupäev."
+
+msgid "Enter a valid time."
+msgstr "Sisestage korrektne kellaaeg."
+
+msgid "Enter a valid date/time."
+msgstr "Sisestage korrektne kuupäev ja kellaaeg."
+
+msgid "Enter a valid duration."
+msgstr "Sisestage korrektne kestus."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ühtegi faili ei saadetud. Kontrollige vormi kodeeringutüüpi."
+
+msgid "No file was submitted."
+msgstr "Ühtegi faili ei saadetud."
+
+msgid "The submitted file is empty."
+msgstr "Saadetud fail on tühi."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Veenduge, et faili nimes poleks rohkem kui %(max)d märk (praegu on "
+"%(length)d)."
+msgstr[1] ""
+"Veenduge, et faili nimes poleks rohkem kui %(max)d märki (praegu on "
+"%(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Palun laadige fail või märgistage 'tühjenda' kast, mitte mõlemat."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Laadige korrektne pilt. Fail, mille laadisite, ei olnud kas pilt või oli "
+"fail vigane."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Valige korrektne väärtus. %(value)s ei ole valitav."
+
+msgid "Enter a list of values."
+msgstr "Sisestage väärtuste nimekiri."
+
+msgid "Enter a complete value."
+msgstr "Sisestage täielik väärtus."
+
+msgid "Enter a valid UUID."
+msgstr "Sisestage korrektne UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Peidetud väli %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "ManagementForm andmed on kadunud või nendega on keegi midagi teinud"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Palun kinnitage %d või vähem vormi."
+msgstr[1] "Palun kinnitage %d või vähem vormi."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Palun kinnitage %d või rohkem vormi."
+msgstr[1] "Palun kinnitage %d või rohkem vormi."
+
+msgid "Order"
+msgstr "Järjestus"
+
+msgid "Delete"
+msgstr "Kustuta"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Palun parandage duplikaat-andmed lahtris %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Palun parandage duplikaat-andmed lahtris %(field)s, mis peab olema unikaalne."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Palun parandage allolevad duplikaat-väärtused"
+
+msgid "The inline value did not match the parent instance."
+msgstr "Pesastatud väärtus ei sobi ülemobjektiga."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Valige korrektne väärtus. Valitud väärtus ei ole valitav."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" ei ole korrektne väärtus."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s ei saanud tõlgendada ajavööndis %(current_timezone)s; see on "
+"kas puudu või mitmetähenduslik."
+
+msgid "Clear"
+msgstr "Tühjenda"
+
+msgid "Currently"
+msgstr "Hetkel"
+
+msgid "Change"
+msgstr "Muuda"
+
+msgid "Unknown"
+msgstr "Tundmatu"
+
+msgid "Yes"
+msgstr "Jah"
+
+msgid "No"
+msgstr "Ei"
+
+msgid "yes,no,maybe"
+msgstr "jah,ei,võib-olla"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bait"
+msgstr[1] "%(size)d baiti"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s kB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.l."
+
+msgid "a.m."
+msgstr "e.l."
+
+msgid "PM"
+msgstr "PL"
+
+msgid "AM"
+msgstr "EL"
+
+msgid "midnight"
+msgstr "südaöö"
+
+msgid "noon"
+msgstr "keskpäev"
+
+msgid "Monday"
+msgstr "esmaspäev"
+
+msgid "Tuesday"
+msgstr "teisipäev"
+
+msgid "Wednesday"
+msgstr "kolmapäev"
+
+msgid "Thursday"
+msgstr "neljapäev"
+
+msgid "Friday"
+msgstr "reede"
+
+msgid "Saturday"
+msgstr "laupäev"
+
+msgid "Sunday"
+msgstr "pühapäev"
+
+msgid "Mon"
+msgstr "esmasp."
+
+msgid "Tue"
+msgstr "teisip."
+
+msgid "Wed"
+msgstr "kolmap."
+
+msgid "Thu"
+msgstr "neljap."
+
+msgid "Fri"
+msgstr "reede"
+
+msgid "Sat"
+msgstr "laup."
+
+msgid "Sun"
+msgstr "pühap."
+
+msgid "January"
+msgstr "jaanuar"
+
+msgid "February"
+msgstr "veebruar"
+
+msgid "March"
+msgstr "märts"
+
+msgid "April"
+msgstr "aprill"
+
+msgid "May"
+msgstr "mai"
+
+msgid "June"
+msgstr "juuni"
+
+msgid "July"
+msgstr "juuli"
+
+msgid "August"
+msgstr "august"
+
+msgid "September"
+msgstr "september"
+
+msgid "October"
+msgstr "oktoober"
+
+msgid "November"
+msgstr "november"
+
+msgid "December"
+msgstr "detsember"
+
+msgid "jan"
+msgstr "jaan"
+
+msgid "feb"
+msgstr "veeb"
+
+msgid "mar"
+msgstr "märts"
+
+msgid "apr"
+msgstr "apr"
+
+msgid "may"
+msgstr "mai"
+
+msgid "jun"
+msgstr "jun"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "aug"
+
+msgid "sep"
+msgstr "sept"
+
+msgid "oct"
+msgstr "okt"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dets"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "jaan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "veeb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "mär."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "apr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "mai"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "juuni"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "juuli"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "aug."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "sept."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "okt."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "dets."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "jaanuar"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "veebruar"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "märts"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "aprill"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "mai"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "juuni"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "juuli"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "august"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "september"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "oktoober"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "november"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "detsember"
+
+msgid "This is not a valid IPv6 address."
+msgstr "See ei ole korrektne IPv6 aadress."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "või"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d aasta"
+msgstr[1] "%d aastat"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d kuu"
+msgstr[1] "%d kuud"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d nädal"
+msgstr[1] "%d nädalat"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d päev"
+msgstr[1] "%d päeva"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d tund"
+msgstr[1] "%d tundi"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minutit"
+
+msgid "0 minutes"
+msgstr "0 minutit"
+
+msgid "Forbidden"
+msgstr "Keelatud"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF verifitseerimine ebaõnnestus. Päring katkestati."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Näete seda sõnumit, kuna käesolev HTTPS leht nõuab 'Viitaja päise' saatmist "
+"teie brauserile, kuid seda ei saadetud. Seda päist on vaja "
+"turvakaalutlustel, kindlustamaks et teie brauserit ei ole kolmandate "
+"osapoolte poolt üle võetud."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Kui olete oma brauseri seadistustes välja lülitanud 'Viitaja' päised siis "
+"lülitage need taas sisse vähemalt antud lehe jaoks või HTTPS üheduste jaoks "
+"või 'sama-allika' päringute jaoks."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Näete seda teadet, kuna see leht vajab CSRF küpsist vormide postitamiseks. "
+"Seda küpsist on vaja turvakaalutlustel, kindlustamaks et teie brauserit ei "
+"ole kolmandate osapoolte poolt üle võetud."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Kui olete oma brauseris küpsised keelanud, siis palun lubage need vähemalt "
+"selle lehe jaoks või 'sama-allika' päringute jaoks."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Saadaval on rohkem infot kasutades DEBUG=True"
+
+msgid "No year specified"
+msgstr "Aasta on valimata"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Kuu on valimata"
+
+msgid "No day specified"
+msgstr "Päev on valimata"
+
+msgid "No week specified"
+msgstr "Nädal on valimata"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Ei leitud %(verbose_name_plural)s"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Tulevane %(verbose_name_plural)s pole saadaval, sest %(class_name)s."
+"allow_future on False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Vigane kuupäeva-string '%(datestr)s' lähtudes formaadist '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Päringule vastavat %(verbose_name)s ei leitud"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Lehekülg ei ole 'last', ka ei saa teda konvertida täisarvuks."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Vigane leht (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Tühi list ja '%(class_name)s.allow_empty' on False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Kausta sisuloendid ei ole siin lubatud."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" ei eksisteeri"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "%(directory)s sisuloend"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Näete seda lehte, kuna teil on määratud DEBUG=True Django seadete failis ja te ei ole ühtki URLi seadistanud."
+
+msgid "Django Documentation"
+msgstr "Django dokumentatsioon"
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..d0a709a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..9752064
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/formats.py
new file mode 100644
index 0000000..8c23b10
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/et/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j. F Y'
+TIME_FORMAT = 'G:i'
+# DATETIME_FORMAT =
+# YEAR_MONTH_FORMAT =
+MONTH_DAY_FORMAT = 'j. F'
+SHORT_DATE_FORMAT = 'd.m.Y'
+# SHORT_DATETIME_FORMAT =
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = ' ' # Non-breaking space
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6697972
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..501a7cc
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po
@@ -0,0 +1,1260 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aitzol Naberan , 2013,2016
+# Ander Martínez , 2013-2014
+# Eneko Illarramendi , 2017
+# Jannis Leidel , 2011
+# jazpillaga , 2011
+# julen , 2011-2012
+# julen , 2013,2015
+# totorika93 , 2012
+# Unai Zalakain , 2013
+# Urtzi Odriozola , 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 10:52+0000\n"
+"Last-Translator: Urtzi Odriozola \n"
+"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+msgid "Arabic"
+msgstr "Arabiera"
+
+msgid "Asturian"
+msgstr "Asturiera"
+
+msgid "Azerbaijani"
+msgstr "Azerbaijanera"
+
+msgid "Bulgarian"
+msgstr "Bulgariera"
+
+msgid "Belarusian"
+msgstr "Bielorrusiera"
+
+msgid "Bengali"
+msgstr "Bengalera"
+
+msgid "Breton"
+msgstr "Bretoia"
+
+msgid "Bosnian"
+msgstr "Bosniera"
+
+msgid "Catalan"
+msgstr "Katalana"
+
+msgid "Czech"
+msgstr "Txekiera"
+
+msgid "Welsh"
+msgstr "Galesa"
+
+msgid "Danish"
+msgstr "Daniera"
+
+msgid "German"
+msgstr "Alemana"
+
+msgid "Lower Sorbian"
+msgstr "Behe-sorbiera"
+
+msgid "Greek"
+msgstr "Greziera"
+
+msgid "English"
+msgstr "Ingelesa"
+
+msgid "Australian English"
+msgstr "Australiar ingelesa"
+
+msgid "British English"
+msgstr "Ingelesa"
+
+msgid "Esperanto"
+msgstr "Esperantoa"
+
+msgid "Spanish"
+msgstr "Gaztelania"
+
+msgid "Argentinian Spanish"
+msgstr "Gaztelania (Argentina)"
+
+msgid "Colombian Spanish"
+msgstr "Gaztelania (Kolonbia)"
+
+msgid "Mexican Spanish"
+msgstr "Gaztelania (Mexiko)"
+
+msgid "Nicaraguan Spanish"
+msgstr "Gaztelania (Nikaragua)"
+
+msgid "Venezuelan Spanish"
+msgstr "Gaztelania (Venezuela)"
+
+msgid "Estonian"
+msgstr "Estoniera"
+
+msgid "Basque"
+msgstr "Euskara"
+
+msgid "Persian"
+msgstr "Persiera"
+
+msgid "Finnish"
+msgstr "Finlandiera"
+
+msgid "French"
+msgstr "Frantsesa"
+
+msgid "Frisian"
+msgstr "Frisiera"
+
+msgid "Irish"
+msgstr "Irlandako gaelikoa"
+
+msgid "Scottish Gaelic"
+msgstr "Eskoziako gaelikoa"
+
+msgid "Galician"
+msgstr "Galiziera"
+
+msgid "Hebrew"
+msgstr "Hebreera"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Kroaziera"
+
+msgid "Upper Sorbian"
+msgstr "Goi-sorbiera"
+
+msgid "Hungarian"
+msgstr "Hungariera"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonesiera"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandiera"
+
+msgid "Italian"
+msgstr "Italiera"
+
+msgid "Japanese"
+msgstr "Japoniera"
+
+msgid "Georgian"
+msgstr "Georgiera"
+
+msgid "Kazakh"
+msgstr "Kazakhera"
+
+msgid "Khmer"
+msgstr "Khmerera"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Koreera"
+
+msgid "Luxembourgish"
+msgstr "Luxenburgera"
+
+msgid "Lithuanian"
+msgstr "Lituaniera"
+
+msgid "Latvian"
+msgstr "Letoniera"
+
+msgid "Macedonian"
+msgstr "Mazedoniera"
+
+msgid "Malayalam"
+msgstr "Malabarera"
+
+msgid "Mongolian"
+msgstr "Mongoliera"
+
+msgid "Marathi"
+msgstr "Marathera"
+
+msgid "Burmese"
+msgstr "Birmaniera"
+
+msgid "Norwegian Bokmål"
+msgstr "Bokmåla (Norvegia)"
+
+msgid "Nepali"
+msgstr "Nepalera"
+
+msgid "Dutch"
+msgstr "Nederlandera"
+
+msgid "Norwegian Nynorsk"
+msgstr "Nynorsk (Norvegia)"
+
+msgid "Ossetic"
+msgstr "Osetiera"
+
+msgid "Punjabi"
+msgstr "Punjabera"
+
+msgid "Polish"
+msgstr "Poloniera"
+
+msgid "Portuguese"
+msgstr "Portugesa"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugesa (Brazil)"
+
+msgid "Romanian"
+msgstr "Errumaniera"
+
+msgid "Russian"
+msgstr "Errusiera"
+
+msgid "Slovak"
+msgstr "Eslovakiera"
+
+msgid "Slovenian"
+msgstr "Esloveniera"
+
+msgid "Albanian"
+msgstr "Albaniera"
+
+msgid "Serbian"
+msgstr "Serbiera"
+
+msgid "Serbian Latin"
+msgstr "Serbiera"
+
+msgid "Swedish"
+msgstr "Suediera"
+
+msgid "Swahili"
+msgstr "Swahilia"
+
+msgid "Tamil"
+msgstr "Tamilera"
+
+msgid "Telugu"
+msgstr "Telugua"
+
+msgid "Thai"
+msgstr "Thailandiera"
+
+msgid "Turkish"
+msgstr "Turkiera"
+
+msgid "Tatar"
+msgstr "Tatarera"
+
+msgid "Udmurt"
+msgstr "Udmurtera"
+
+msgid "Ukrainian"
+msgstr "Ukrainera"
+
+msgid "Urdu"
+msgstr "Urdua"
+
+msgid "Vietnamese"
+msgstr "Vietnamera"
+
+msgid "Simplified Chinese"
+msgstr "Txinera (sinpletua)"
+
+msgid "Traditional Chinese"
+msgstr "Txinera (tradizionala)"
+
+msgid "Messages"
+msgstr "Mezuak"
+
+msgid "Site Maps"
+msgstr "Sitemap-ak"
+
+msgid "Static Files"
+msgstr "Fitxategi estatikoak"
+
+msgid "Syndication"
+msgstr "Sindikazioa"
+
+msgid "That page number is not an integer"
+msgstr "Orrialde hori ez da zenbaki bat"
+
+msgid "That page number is less than 1"
+msgstr "Orrialde zenbaki hori 1 baino txikiagoa da"
+
+msgid "That page contains no results"
+msgstr "Orrialde horrek ez du emaitzarik"
+
+msgid "Enter a valid value."
+msgstr "Idatzi baleko balio bat."
+
+msgid "Enter a valid URL."
+msgstr "Idatzi baleko URL bat."
+
+msgid "Enter a valid integer."
+msgstr "Idatzi baleko zenbaki bat."
+
+msgid "Enter a valid email address."
+msgstr "Idatzi baleko helbide elektroniko bat."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Idatzi hizki, zenbaki, azpimarra edo marratxoz osatutako baleko 'slug' bat."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Idatzi Unicode hizki, zenbaki, azpimarra edo marratxoz osatutako baleko "
+"'slug' bat."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Idatzi baleko IPv4 sare-helbide bat."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Idatzi baleko IPv6 sare-helbide bat."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Idatzi baleko IPv4 edo IPv6 sare-helbide bat."
+
+msgid "Enter only digits separated by commas."
+msgstr "Idatzi komaz bereizitako digitoak soilik."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Ziurtatu balio hau gutxienez %(limit_value)s dela (orain %(show_value)s da)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Ziurtatu balio hau %(limit_value)s baino txikiagoa edo berdina dela."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Ziurtatu balio hau %(limit_value)s baino handiagoa edo berdina dela."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Ziurtatu balio honek gutxienez karaktere %(limit_value)d duela "
+"(%(show_value)d ditu)."
+msgstr[1] ""
+"Ziurtatu balio honek gutxienez %(limit_value)d karaktere dituela "
+"(%(show_value)d ditu)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Ziurtatu balio honek gehienez karaktere %(limit_value)d duela "
+"(%(show_value)d ditu)."
+msgstr[1] ""
+"Ziurtatu balio honek gehienez %(limit_value)d karaktere dituela "
+"(%(show_value)d ditu)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Ziurtatu digitu %(max)s baino gehiago ez dagoela guztira."
+msgstr[1] "Ziurtatu %(max)s digitu baino gehiago ez dagoela guztira."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren atzetik."
+msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren atzetik."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren aurretik."
+msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren aurretik."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"'%(extension)s' fitxategi-luzapena ez da balekoa. Hauek dira onartutako "
+"fitxategi-luzapenak: '%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "Null karaktereak ez daude baimenduta."
+
+msgid "and"
+msgstr "eta"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(field_labels)s hauek dauzkan %(model_name)s dagoeneko existitzen da."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "%(value)r balioa ez da baleko aukera bat."
+
+msgid "This field cannot be null."
+msgstr "Eremu hau ezin daiteke hutsa izan (null)."
+
+msgid "This field cannot be blank."
+msgstr "Eremu honek ezin du hutsik egon."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(field_label)s hori daukan %(model_name)s dagoeneko existitzen da."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Eremuaren mota: %(field_type)s"
+
+msgid "Integer"
+msgstr "Zenbaki osoa"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "'%(value)s' balioak integer bat izan behar du."
+
+msgid "Big (8 byte) integer"
+msgstr "Zenbaki osoa (handia 8 byte)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "'%(value)s' balioak True edo False izan behar du."
+
+msgid "Boolean (Either True or False)"
+msgstr "Boolearra (True edo False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String-a (%(max_length)s gehienez)"
+
+msgid "Comma-separated integers"
+msgstr "Komaz bereiztutako zenbaki osoak"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"'%(value)s' balioak ez dauka data formatu zuzena. Formatu zuzena UUUU-HH-EE "
+"da."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"'%(value)s' balioak formatu zuzena (UUUU-HH-EE) dauka, baina ez da data "
+"zuzen bat."
+
+msgid "Date (without time)"
+msgstr "Data (ordurik gabe)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"'%(value)s' balioak ez dauka formatu zuzena. Formatu zuzena UUUU-HH-EE OO:"
+"MM[:ss[.uuuuuu]][TZ] da."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"'%(value)s' balioak formatu zuzena dauka (UUUU-HH-EE OO:MM[:ss[.uuuuuu]]"
+"[TZ]),\n"
+"baina ez da data/ordu zuzena."
+
+msgid "Date (with time)"
+msgstr "Data (orduarekin)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "'%(value)s' balioak zenbaki hamartarra izan behar du."
+
+msgid "Decimal number"
+msgstr "Zenbaki hamartarra"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"'%(value)s' balioak ez dauka foramtu zuzena. [EE] [OO:[MM:]]ss[.uuuuuu] "
+"formatuan egon behar da."
+
+msgid "Duration"
+msgstr "Iraupena"
+
+msgid "Email address"
+msgstr "Helbide elektronikoa"
+
+msgid "File path"
+msgstr "Fitxategiaren bidea"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "'%(value)s' balioak float bat izan behar du."
+
+msgid "Floating point number"
+msgstr "Koma higikorreko zenbakia (float)"
+
+msgid "IPv4 address"
+msgstr "IPv4 sare-helbidea"
+
+msgid "IP address"
+msgstr "IP helbidea"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "'%(value)s' balioak True, False edo None izan behar du."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolearra (True, False edo None)"
+
+msgid "Positive integer"
+msgstr "Osoko positiboa"
+
+msgid "Positive small integer"
+msgstr "Osoko positibo txikia"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (gehienez %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Osoko txikia"
+
+msgid "Text"
+msgstr "Testua"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"'%(value)s' balioak ez dauka formatu zuzena. OO:MM[:ss[.uuuuuu]] formatuan "
+"egon behar du."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"'%(value)s' balioak formatu zuzena dauka (OO:MM[:ss[.uuuuuu]]) baina ez da "
+"ordu \n"
+"zuzena"
+
+msgid "Time"
+msgstr "Ordua"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Datu bitar gordinak"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' ez da baleko UUID bat."
+
+msgid "File"
+msgstr "Fitxategia"
+
+msgid "Image"
+msgstr "Irudia"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+"%(field)s %(value)r edukidun %(model)s modeloko instantziarik ez da "
+"exiistitzen."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "1-N (mota erlazionatutako eremuaren arabera)"
+
+msgid "One-to-one relationship"
+msgstr "Bat-bat erlazioa"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "%(from)s-%(to)s erlazioa"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "%(from)s-%(to)s erlazioak"
+
+msgid "Many-to-many relationship"
+msgstr "M:N erlazioa"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Eremu hau beharrezkoa da."
+
+msgid "Enter a whole number."
+msgstr "Idatzi zenbaki oso bat."
+
+msgid "Enter a number."
+msgstr "Idatzi zenbaki bat."
+
+msgid "Enter a valid date."
+msgstr "Idatzi baleko data bat."
+
+msgid "Enter a valid time."
+msgstr "Idatzi baleko ordu bat."
+
+msgid "Enter a valid date/time."
+msgstr "Idatzi baleko data/ordu bat."
+
+msgid "Enter a valid duration."
+msgstr "Idatzi baleko iraupen bat."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ez da fitxategirik bidali. Egiaztatu formularioaren kodeketa-mota."
+
+msgid "No file was submitted."
+msgstr "Ez da fitxategirik bidali."
+
+msgid "The submitted file is empty."
+msgstr "Bidalitako fitxategia hutsik dago."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Ziurtatu fitxategi izen honek gehienez karaktere %(max)d duela (%(length)d "
+"ditu)."
+msgstr[1] ""
+"Ziurtatu fitxategi izen honek gehienez %(max)d karaktere dituela (%(length)d "
+"ditu)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Mesedez, igo fitxategi bat edo egin klik garbitu botoian, ez biak."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Igo baleko irudi bat. Zuk igotako fitxategia ez da irudi bat edo akatsen bat "
+"du."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Hautatu baleko aukera bat. %(value)s ez dago erabilgarri."
+
+msgid "Enter a list of values."
+msgstr "Idatzi balio-zerrenda bat."
+
+msgid "Enter a complete value."
+msgstr "Sartu balio osoa."
+
+msgid "Enter a valid UUID."
+msgstr "Idatzi baleko UUID bat."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(%(name)s eremu ezkutua) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "ManagementForm daturik ez dago edo ez da balekoa."
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Bidali formulario %d edo gutxiago, mesedez."
+msgstr[1] "Bidali %d formulario edo gutxiago, mesedez."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Gehitu formulario %d edo gehiago"
+msgstr[1] "Bidali %d formulario edo gehiago, mesedez."
+
+msgid "Order"
+msgstr "Ordena"
+
+msgid "Delete"
+msgstr "Ezabatu"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Zuzendu bikoiztketa %(field)s eremuan."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Zuzendu bikoizketa %(field)s eremuan. Bakarra izan behar da."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Zuzendu bakarra izan behar den%(field_name)s eremuarentzako bikoiztutako "
+"data %(lookup)s egiteko %(date_field)s eremuan"
+
+msgid "Please correct the duplicate values below."
+msgstr "Zuzendu hurrengo balio bikoiztuak."
+
+msgid "The inline value did not match the parent instance."
+msgstr "Barneko balioa eta gurasoaren instantzia ez datoz bat."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Hautatu aukera zuzen bat. Hautatutakoa ez da zuzena."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" ez da balio egokia."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s ezin da interpretatu %(current_timezone)s ordu-eremuan;\n"
+"baliteke ez existitzea edo anbiguoa izatea"
+
+msgid "Clear"
+msgstr "Garbitu"
+
+msgid "Currently"
+msgstr "Orain"
+
+msgid "Change"
+msgstr "Aldatu"
+
+msgid "Unknown"
+msgstr "Ezezaguna"
+
+msgid "Yes"
+msgstr "Bai"
+
+msgid "No"
+msgstr "Ez"
+
+msgid "yes,no,maybe"
+msgstr "bai,ez,agian"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "byte %(size)d "
+msgstr[1] "%(size)d byte"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "gauerdia"
+
+msgid "noon"
+msgstr "eguerdia"
+
+msgid "Monday"
+msgstr "astelehena"
+
+msgid "Tuesday"
+msgstr "asteartea"
+
+msgid "Wednesday"
+msgstr "asteazkena"
+
+msgid "Thursday"
+msgstr "osteguna"
+
+msgid "Friday"
+msgstr "ostirala"
+
+msgid "Saturday"
+msgstr "larunbata"
+
+msgid "Sunday"
+msgstr "igandea"
+
+msgid "Mon"
+msgstr "al"
+
+msgid "Tue"
+msgstr "ar"
+
+msgid "Wed"
+msgstr "az"
+
+msgid "Thu"
+msgstr "og"
+
+msgid "Fri"
+msgstr "ol"
+
+msgid "Sat"
+msgstr "lr"
+
+msgid "Sun"
+msgstr "ig"
+
+msgid "January"
+msgstr "urtarrila"
+
+msgid "February"
+msgstr "otsaila"
+
+msgid "March"
+msgstr "martxoa"
+
+msgid "April"
+msgstr "apirila"
+
+msgid "May"
+msgstr "maiatza"
+
+msgid "June"
+msgstr "ekaina"
+
+msgid "July"
+msgstr "uztaila"
+
+msgid "August"
+msgstr "abuztua"
+
+msgid "September"
+msgstr "iraila"
+
+msgid "October"
+msgstr "urria"
+
+msgid "November"
+msgstr "azaroa"
+
+msgid "December"
+msgstr "abendua"
+
+msgid "jan"
+msgstr "urt"
+
+msgid "feb"
+msgstr "ots"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "api"
+
+msgid "may"
+msgstr "mai"
+
+msgid "jun"
+msgstr "eka"
+
+msgid "jul"
+msgstr "uzt"
+
+msgid "aug"
+msgstr "abu"
+
+msgid "sep"
+msgstr "ira"
+
+msgid "oct"
+msgstr "urr"
+
+msgid "nov"
+msgstr "aza"
+
+msgid "dec"
+msgstr "abe"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "urt."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "ots."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "mar."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "api."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "mai."
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "eka."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "uzt."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "abu."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "ira."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "urr."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "aza."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "abe."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "urtarrila"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "otsaila"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "martxoa"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "apirila"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "maiatza"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "ekaina"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "uztaila"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "abuztua"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "iraila"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "urria"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "azaroa"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "abendua"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Hau ez da baleko IPv6 helbide bat."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "edo"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "urte %d"
+msgstr[1] "%d urte"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "hilabete %d"
+msgstr[1] "%d hilabete"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "aste %d"
+msgstr[1] "%d aste"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "egun %d"
+msgstr[1] "%d egun"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "ordu %d"
+msgstr[1] "%d ordu"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "minutu %d"
+msgstr[1] "%d minutu"
+
+msgid "0 minutes"
+msgstr "0 minutu"
+
+msgid "Forbidden"
+msgstr "Debekatuta"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF egiaztapenak huts egin du. Eskaera abortatu da."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Mezu hau ikusten ari zara HTTPS gune honek, zure nabigatzaileak 'Referer "
+"header' bat bidaltzea behar duelako, baina ez du batere bidali. Goiburuko "
+"hau zure nabigatzailea beste norbaitek ordeztu ez duela ziurtatzeko eskatzen "
+"da."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Zure nabigatzailera 'Refere' goiburukoak desgaitzeko konfiguratu baldin "
+"baduzu, mesedez, gune honetarako, HTTPS konexio edo 'same-origin' "
+"eskaeretarako gaitu berriro."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+" etiketa erabiltzen ari "
+"bazara edo 'Referrer-Policy: no-referrer' goiburukoa, mesedez ezabatu "
+"itzazu. CSRF babesak 'Referer' goiburukoa behar du egiaztapen zorrotza "
+"egiteko. Pribatutasunaz kezkatuta bazaude, erabili bezalako alternatibak hirugarrenen webgune loturentzat."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Formularioa bidaltzean gune honek CSRF cookie bat behar duelako ikusten duzu "
+"mezu hau. Cookie hau beharrezkoa da segurtasun arrazoiengatik, zure "
+"nabigatzailea beste batek ordezkatzen ez duela ziurtatzeko."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Nabigatzailea cookiak desgaitzeko konfiguratu baldin baduzu, mesedez "
+"aktibatu behintzat gune honetarako, edo 'same-origin' eskaeretarako."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Informazio gehiago erabilgarri dago DEBUG=True ezarrita."
+
+msgid "No year specified"
+msgstr "Ez da urterik zehaztu"
+
+msgid "Date out of range"
+msgstr "Data baliozko tartetik kanpo"
+
+msgid "No month specified"
+msgstr "Ez da hilabeterik zehaztu"
+
+msgid "No day specified"
+msgstr "Ez da egunik zehaztu"
+
+msgid "No week specified"
+msgstr "Ez da asterik zehaztu"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Ez dago %(verbose_name_plural)s"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Etorkizuneko %(verbose_name_plural)s ez dago aukeran %(class_name)s."
+"allow_future False delako"
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "%(datestr)s data string okerra '%(format)s' formaturako"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Bilaketarekin bat datorren %(verbose_name)s-rik ez dago"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Orria ez da azkena, hortaz ezin da osokora (int) biurtu."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Orri baliogabea (%(page_number)s):%(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Zerrenda hutsa eta '%(class_name)s.allow_empty' False da"
+
+msgid "Directory indexes are not allowed here."
+msgstr "Direktorio zerrendak ez daude baimenduak."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" ez da existitzen"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "%(directory)s zerrenda"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: epeekin perfekzionistak direnentzat Web frameworka."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Ikusi Django %(version)s-ren argitaratze "
+"oharrak"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Instalazioak arrakastaz funtzionatu du! Zorionak!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Zure settings fitxategian DEBUG=True jarrita eta URLrik konfiguratu gabe duzulako ari zara "
+"ikusten orrialde hau."
+
+msgid "Django Documentation"
+msgstr "Django dokumentazioa"
+
+msgid "Topics, references, & how-to's"
+msgstr "Gaiak, erreferentziak, & laguntzak"
+
+msgid "Tutorial: A Polling App"
+msgstr "Tutoriala: Galdetegi aplikazioa"
+
+msgid "Get started with Django"
+msgstr "Hasi Djangorekin"
+
+msgid "Django Community"
+msgstr "Django Komunitatea"
+
+msgid "Connect, get help, or contribute"
+msgstr "Konektatu, lortu laguntza edo lagundu"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..1fdd33e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..3a3009e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/formats.py
new file mode 100644
index 0000000..f8ebfea
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/eu/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = r'Y\k\o N j\a'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = r'Y\k\o N j\a, H:i'
+YEAR_MONTH_FORMAT = r'Y\k\o F'
+MONTH_DAY_FORMAT = r'F\r\e\n j\a'
+SHORT_DATE_FORMAT = 'Y-m-d'
+SHORT_DATETIME_FORMAT = 'Y-m-d H:i'
+FIRST_DAY_OF_WEEK = 1 # Astelehena
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..0105ba3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2d67ad0
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po
@@ -0,0 +1,1215 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Ali Vakilzade , 2015
+# Arash Fazeli , 2012
+# Jannis Leidel , 2011
+# Mazdak Badakhshan , 2014
+# Mohammad Hossein Mojtahedi , 2013
+# Pouya Abbassi, 2016
+# Reza Mohammadi , 2013-2016
+# Saeed , 2011
+# Sina Cheraghi , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Persian (http://www.transifex.com/django/django/language/"
+"fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fa\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Afrikaans"
+msgstr "آفریکانس"
+
+msgid "Arabic"
+msgstr "عربی"
+
+msgid "Asturian"
+msgstr "آستوری"
+
+msgid "Azerbaijani"
+msgstr "آذربایجانی"
+
+msgid "Bulgarian"
+msgstr "بلغاری"
+
+msgid "Belarusian"
+msgstr "بلاروس"
+
+msgid "Bengali"
+msgstr "بنگالی"
+
+msgid "Breton"
+msgstr "برتون"
+
+msgid "Bosnian"
+msgstr "بوسنیایی"
+
+msgid "Catalan"
+msgstr "کاتالونیایی"
+
+msgid "Czech"
+msgstr "چکی"
+
+msgid "Welsh"
+msgstr "ویلزی"
+
+msgid "Danish"
+msgstr "دانمارکی"
+
+msgid "German"
+msgstr "آلمانی"
+
+msgid "Lower Sorbian"
+msgstr "صربستانی پایین"
+
+msgid "Greek"
+msgstr "یونانی"
+
+msgid "English"
+msgstr "انگلیسی"
+
+msgid "Australian English"
+msgstr "انگلیسی استرالیایی"
+
+msgid "British English"
+msgstr "انگلیسی بریتیش"
+
+msgid "Esperanto"
+msgstr "اسپرانتو"
+
+msgid "Spanish"
+msgstr "اسپانیایی"
+
+msgid "Argentinian Spanish"
+msgstr "اسپانیایی آرژانتینی"
+
+msgid "Colombian Spanish"
+msgstr "کلمبیائی اسپانیایی"
+
+msgid "Mexican Spanish"
+msgstr "اسپانیولی مکزیکی"
+
+msgid "Nicaraguan Spanish"
+msgstr "نیکاراگوئه اسپانیایی"
+
+msgid "Venezuelan Spanish"
+msgstr "ونزوئلا اسپانیایی"
+
+msgid "Estonian"
+msgstr "استونی"
+
+msgid "Basque"
+msgstr "باسکی"
+
+msgid "Persian"
+msgstr "فارسی"
+
+msgid "Finnish"
+msgstr "فنلاندی"
+
+msgid "French"
+msgstr "فرانسوی"
+
+msgid "Frisian"
+msgstr "فریزی"
+
+msgid "Irish"
+msgstr "ایرلندی"
+
+msgid "Scottish Gaelic"
+msgstr "اسکاتلندی"
+
+msgid "Galician"
+msgstr "گالیسیایی"
+
+msgid "Hebrew"
+msgstr "عبری"
+
+msgid "Hindi"
+msgstr "هندی"
+
+msgid "Croatian"
+msgstr "کرواتی"
+
+msgid "Upper Sorbian"
+msgstr "صربستانی بالا"
+
+msgid "Hungarian"
+msgstr "مجاری"
+
+msgid "Interlingua"
+msgstr "اینترلینگوا"
+
+msgid "Indonesian"
+msgstr "اندونزیایی"
+
+msgid "Ido"
+msgstr "ایدو"
+
+msgid "Icelandic"
+msgstr "ایسلندی"
+
+msgid "Italian"
+msgstr "ایتالیایی"
+
+msgid "Japanese"
+msgstr "ژاپنی"
+
+msgid "Georgian"
+msgstr "گرجی"
+
+msgid "Kazakh"
+msgstr "قزاقستان"
+
+msgid "Khmer"
+msgstr "خمری"
+
+msgid "Kannada"
+msgstr "کنادهای"
+
+msgid "Korean"
+msgstr "کرهای"
+
+msgid "Luxembourgish"
+msgstr "لوگزامبورگی"
+
+msgid "Lithuanian"
+msgstr "لیتوانی"
+
+msgid "Latvian"
+msgstr "لتونیایی"
+
+msgid "Macedonian"
+msgstr "مقدونی"
+
+msgid "Malayalam"
+msgstr "مالایایی"
+
+msgid "Mongolian"
+msgstr "مغولی"
+
+msgid "Marathi"
+msgstr "مِراتی"
+
+msgid "Burmese"
+msgstr "برمهای"
+
+msgid "Norwegian Bokmål"
+msgstr "نروژی"
+
+msgid "Nepali"
+msgstr "نپالی"
+
+msgid "Dutch"
+msgstr "هلندی"
+
+msgid "Norwegian Nynorsk"
+msgstr "نروژی Nynorsk"
+
+msgid "Ossetic"
+msgstr "آسی"
+
+msgid "Punjabi"
+msgstr "پنجابی"
+
+msgid "Polish"
+msgstr "لهستانی"
+
+msgid "Portuguese"
+msgstr "پرتغالی"
+
+msgid "Brazilian Portuguese"
+msgstr "پرتغالیِ برزیل"
+
+msgid "Romanian"
+msgstr "رومانی"
+
+msgid "Russian"
+msgstr "روسی"
+
+msgid "Slovak"
+msgstr "اسلواکی"
+
+msgid "Slovenian"
+msgstr "اسلووِنی"
+
+msgid "Albanian"
+msgstr "آلبانیایی"
+
+msgid "Serbian"
+msgstr "صربی"
+
+msgid "Serbian Latin"
+msgstr "صربی لاتین"
+
+msgid "Swedish"
+msgstr "سوئدی"
+
+msgid "Swahili"
+msgstr "سواحیلی"
+
+msgid "Tamil"
+msgstr "تامیلی"
+
+msgid "Telugu"
+msgstr "تلوگویی"
+
+msgid "Thai"
+msgstr "تایلندی"
+
+msgid "Turkish"
+msgstr "ترکی"
+
+msgid "Tatar"
+msgstr "تاتار"
+
+msgid "Udmurt"
+msgstr "ادمورت"
+
+msgid "Ukrainian"
+msgstr "اکراینی"
+
+msgid "Urdu"
+msgstr "اردو"
+
+msgid "Vietnamese"
+msgstr "ویتنامی"
+
+msgid "Simplified Chinese"
+msgstr "چینی سادهشده"
+
+msgid "Traditional Chinese"
+msgstr "چینی سنتی"
+
+msgid "Messages"
+msgstr "پیغامها"
+
+msgid "Site Maps"
+msgstr "نقشههای وبگاه"
+
+msgid "Static Files"
+msgstr "پروندههای استاتیک"
+
+msgid "Syndication"
+msgstr "پیوند"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "یک مقدار معتبر وارد کنید."
+
+msgid "Enter a valid URL."
+msgstr "یک نشانی اینترنتی معتبر وارد کنید."
+
+msgid "Enter a valid integer."
+msgstr "یک عدد معتبر وارد کنید."
+
+msgid "Enter a valid email address."
+msgstr "یک ایمیل آدرس معتبر وارد کنید."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr "یک 'slug' معتبر شامل حروف، ارقام، خط زیر و یا خط تیره وارد کنید."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr "یک «نامک» معتبر شامل حروف یونیکد، اعداد، زیرخط یا خط فاصله وارد کنید."
+
+msgid "Enter a valid IPv4 address."
+msgstr "یک نشانی IPv4 معتبر وارد کنید."
+
+msgid "Enter a valid IPv6 address."
+msgstr "یک آدرس معتبر IPv6 وارد کنید."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "IPv4 یا IPv6 آدرس معتبر وارد کنید."
+
+msgid "Enter only digits separated by commas."
+msgstr "فقط ارقام جدا شده با کاما وارد کنید."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "مطمئن شوید مقدار %(limit_value)s است. (اکنون %(show_value)s می باشد)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "مطمئن شوید این مقدار کوچکتر و یا مساوی %(limit_value)s است."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "مطمئن شوید این مقدار بزرگتر و یا مساوی %(limit_value)s است."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"طول این مقدار باید حداقل %(limit_value)d کاراکتر باشد (طولش %(show_value)d "
+"است)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"طول این مقدار باید حداکثر %(limit_value)d کاراکتر باشد (طولش %(show_value)d "
+"است)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "نباید در مجموع بیش از %(max)s رقم داشته باشد."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "نباید بیش از %(max)s رقم اعشار داشته باشد."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "نباید بیش از %(max)s رقم قبل ممیز داشته باشد."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "و"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s با این %(field_labels)s وجود دارد."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "مقدار %(value)r انتخاب معتبری نیست. "
+
+msgid "This field cannot be null."
+msgstr "این فیلد نمی تواند پوچ باشد."
+
+msgid "This field cannot be blank."
+msgstr "این فیلد نمی تواند خالی باشد."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s با این %(field_label)s از قبل موجود است."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s باید برای %(lookup_type)s %(date_field_label)s یکتا باشد."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "فیلد با نوع: %(field_type)s"
+
+msgid "Integer"
+msgstr "عدد صحیح"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "مقدار «%(value)s» باید یک عدد باشد."
+
+msgid "Big (8 byte) integer"
+msgstr "بزرگ (8 بایت) عدد صحیح"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "مقدار «%(value)s» باید یا True باشد و یا False."
+
+msgid "Boolean (Either True or False)"
+msgstr "بولی (درست یا غلط)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "رشته (تا %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "اعداد صحیح جدا-شده با ویلگول"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"مقدار تاریخ «%(value)s» در قالب نادرستی وارد شده است. باید در قالب YYYY-MM-"
+"DD باشد."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"مقدار تاریخ «%(value)s» با اینکه در قالب درستی (YYYY-MM-DD) است ولی تاریخ "
+"ناممکنی را نشان میدهد."
+
+msgid "Date (without time)"
+msgstr "تاریخ (بدون زمان)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب YYYY-MM-DD HH:"
+"MM[:ss[.uuuuuu]][TZ] باشد."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"مقدار «%(value)s» با اینکه در قالب درستی (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) است ولی تاریخ/زمان ناممکنی را نشان میدهد."
+
+msgid "Date (with time)"
+msgstr "تاریخ (با زمان)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "مقدار «%(value)s» باید عدد باشد."
+
+msgid "Decimal number"
+msgstr "عدد دهدهی"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب [DD] [HH:"
+"[MM:]]ss[.uuuuuu] باشد."
+
+msgid "Duration"
+msgstr "بازهٔ زمانی"
+
+msgid "Email address"
+msgstr "نشانی پست الکترونیکی"
+
+msgid "File path"
+msgstr "مسیر پرونده"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "مقدار «%(value)s» باید عدد حقیقی باشد."
+
+msgid "Floating point number"
+msgstr "عدد اعشاری"
+
+msgid "IPv4 address"
+msgstr "IPv4 آدرس"
+
+msgid "IP address"
+msgstr "نشانی IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "مقدار «%(value)s» باید یا None باشد یا True و یا False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "بولی (درست، نادرست یا پوچ)"
+
+msgid "Positive integer"
+msgstr "عدد صحیح مثبت"
+
+msgid "Positive small integer"
+msgstr "مثبت عدد صحیح کوچک"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "تیتر (حداکثر %(max_length)s)"
+
+msgid "Small integer"
+msgstr "عدد صحیح کوچک"
+
+msgid "Text"
+msgstr "متن"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب HH:MM[:ss[."
+"uuuuuu]] باشد."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"مقدار «%(value)s» با اینکه در قالب درستی (HH:MM[:ss[.uuuuuu]]) است ولی زمان "
+"ناممکنی را نشان میدهد."
+
+msgid "Time"
+msgstr "زمان"
+
+msgid "URL"
+msgstr "نشانی اینترنتی"
+
+msgid "Raw binary data"
+msgstr "دادهٔ دودویی خام"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' یک UUID معتبر نیست."
+
+msgid "File"
+msgstr "پرونده"
+
+msgid "Image"
+msgstr "تصویر"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "%(model)s با %(field)s %(value)r وجود ندارد."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "کلید خارجی ( نوع بر اساس فیلد رابط مشخص میشود )"
+
+msgid "One-to-one relationship"
+msgstr "رابطه یک به یک "
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "رابطه %(from)s به %(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "روابط %(from)s به %(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "رابطه چند به چند"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":؟.!"
+
+msgid "This field is required."
+msgstr "این فیلد لازم است."
+
+msgid "Enter a whole number."
+msgstr "به طور کامل یک عدد وارد کنید."
+
+msgid "Enter a number."
+msgstr "یک عدد وارد کنید."
+
+msgid "Enter a valid date."
+msgstr "یک تاریخ معتبر وارد کنید."
+
+msgid "Enter a valid time."
+msgstr "یک زمان معتبر وارد کنید."
+
+msgid "Enter a valid date/time."
+msgstr "یک تاریخ/زمان معتبر وارد کنید."
+
+msgid "Enter a valid duration."
+msgstr "یک بازهٔ زمانی معتبر وارد کنید."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "پروندهای ارسال نشده است. نوع کدگذاری فرم را بررسی کنید."
+
+msgid "No file was submitted."
+msgstr "پروندهای ارسال نشده است."
+
+msgid "The submitted file is empty."
+msgstr "پروندهٔ ارسالشده خالیست."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"طول عنوان پرونده باید حداقل %(max)d کاراکتر باشد (طولش %(length)d است)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "لطفا یا فایل ارسال کنید یا دکمه پاک کردن را علامت بزنید، نه هردو."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"یک تصویر معتبر بارگذاری کنید. پروندهای که بارگذاری کردید یا تصویر نبوده و یا "
+"تصویری مخدوش بوده است."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "یک گزینهٔ معتبر انتخاب کنید. %(value)s از گزینههای موجود نیست."
+
+msgid "Enter a list of values."
+msgstr "فهرستی از مقادیر وارد کنید."
+
+msgid "Enter a complete value."
+msgstr "یک مقدار کامل وارد کنید."
+
+msgid "Enter a valid UUID."
+msgstr "یک UUID معتبر وارد کنید."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(فیلد پنهان %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "اطلاعات ManagementForm ناقص است و یا دستکاری شده است."
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "لطفاً %d یا کمتر فرم بفرستید."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "لطفاً %d یا بیشتر فرم بفرستید."
+
+msgid "Order"
+msgstr "ترتیب:"
+
+msgid "Delete"
+msgstr "حذف"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "لطفا محتوی تکراری برای %(field)s را اصلاح کنید."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "لطفا محتوی تکراری برای %(field)s را که باید یکتا باشد اصلاح کنید."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"لطفا اطلاعات تکراری %(field_name)s را اصلاح کنید که باید در %(lookup)s "
+"یکتا باشد %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "لطفا مقدار تکراری را اصلاح کنید."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "یک گزینهٔ معتبر انتخاب کنید. آن گزینه از گزینههای موجود نیست."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s نمیتواند در %(current_timezone)s معنی شود.شاید این زمان مبهم "
+"است و یا وجود ندارد."
+
+msgid "Clear"
+msgstr "پاک کردن"
+
+msgid "Currently"
+msgstr "در حال حاضر"
+
+msgid "Change"
+msgstr "تغییر"
+
+msgid "Unknown"
+msgstr "ناشناخته"
+
+msgid "Yes"
+msgstr "بله"
+
+msgid "No"
+msgstr "خیر"
+
+msgid "yes,no,maybe"
+msgstr "بله،خیر،شاید"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d بایت"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "ب.ظ."
+
+msgid "a.m."
+msgstr "صبح"
+
+msgid "PM"
+msgstr "بعد از ظهر"
+
+msgid "AM"
+msgstr "صبح"
+
+msgid "midnight"
+msgstr "نیمه شب"
+
+msgid "noon"
+msgstr "ظهر"
+
+msgid "Monday"
+msgstr "دوشنبه"
+
+msgid "Tuesday"
+msgstr "سه شنبه"
+
+msgid "Wednesday"
+msgstr "چهارشنبه"
+
+msgid "Thursday"
+msgstr "پنجشنبه"
+
+msgid "Friday"
+msgstr "جمعه"
+
+msgid "Saturday"
+msgstr "شنبه"
+
+msgid "Sunday"
+msgstr "یکشنبه"
+
+msgid "Mon"
+msgstr "دوشنبه"
+
+msgid "Tue"
+msgstr "سهشنبه"
+
+msgid "Wed"
+msgstr "چهارشنبه"
+
+msgid "Thu"
+msgstr "پنجشنبه"
+
+msgid "Fri"
+msgstr "جمعه"
+
+msgid "Sat"
+msgstr "شنبه"
+
+msgid "Sun"
+msgstr "یکشنبه"
+
+msgid "January"
+msgstr "ژانویه"
+
+msgid "February"
+msgstr "فوریه"
+
+msgid "March"
+msgstr "مارس"
+
+msgid "April"
+msgstr "آوریل"
+
+msgid "May"
+msgstr "مه"
+
+msgid "June"
+msgstr "ژوئن"
+
+msgid "July"
+msgstr "ژوئیه"
+
+msgid "August"
+msgstr "اوت"
+
+msgid "September"
+msgstr "سپتامبر"
+
+msgid "October"
+msgstr "اکتبر"
+
+msgid "November"
+msgstr "نوامبر"
+
+msgid "December"
+msgstr "دسامبر"
+
+msgid "jan"
+msgstr "ژانویه"
+
+msgid "feb"
+msgstr "فوریه"
+
+msgid "mar"
+msgstr "مارس"
+
+msgid "apr"
+msgstr "آوریل"
+
+msgid "may"
+msgstr "مه"
+
+msgid "jun"
+msgstr "ژوئن"
+
+msgid "jul"
+msgstr "ژوئیه"
+
+msgid "aug"
+msgstr "اوت"
+
+msgid "sep"
+msgstr "سپتامبر"
+
+msgid "oct"
+msgstr "اکتبر"
+
+msgid "nov"
+msgstr "نوامبر"
+
+msgid "dec"
+msgstr "دسامبر"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "ژانویه"
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "فوریه"
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "مارس"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "آوریل"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "مه"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "ژوئن"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "جولای"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "اوت"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "سپتامبر"
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "اکتبر"
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "نوامبر"
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "دسامبر"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "ژانویه"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "فوریه"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "مارس"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "آوریل"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "مه"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "ژوئن"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "جولای"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "اوت"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "سپتامبر"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "اکتبر"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "نوامبر"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "دسامبر"
+
+msgid "This is not a valid IPv6 address."
+msgstr "این مقدار آدرس IPv6 معتبری نیست."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "یا"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr "،"
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d سال"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d ماه"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d هفته"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d روز"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ساعت"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d دقیقه"
+
+msgid "0 minutes"
+msgstr "0 دقیقه"
+
+msgid "Forbidden"
+msgstr "ممنوع"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF تأیید نشد. درخواست لغو شد."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"شما این پیغام را میبینید چون این سایتِ HTTPS نیازمند یک «تیتر ارجاع» برای "
+"ارسال به بروزر شماست، ولی هیچ چیزی ارسال نشده است. این تیتر به دلایل امنیتی "
+"مورد نیاز است، برای اینکه از هایجک نشدن بروزر اطمینان حاصل شود."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"اگر بزوزر خود را برای غیر فعال کردن تیترهای «ارجاع» تنظیم کردهاید، لطفا "
+"مجددا این ویژگی را فعال کنید، حداقل برای این وبسایت، یا برای اتصالات HTTPS، "
+"یا برای درخواستهایی با «مبدا یکسان»."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"شما این پیغام را میبینید چون این سایت نیازمند کوکی «جعل درخواست میان وبگاهی» "
+"در زمان ارائه ی فورم میباشد. این کوکیها برای مسائل امنیتی ضروری هستند، برای "
+"اطمینان از اینکه بروزر شما توسط شخص ثالثی هایجک نشده باشد."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"چنانچه مروگرتان را طوری تنظیم کردهاید که cookie ها غیر فعال باشند، لطفاً "
+"حداقل برای این وبگاه و یا برای «same-origin» فعالش کنید."
+
+msgid "More information is available with DEBUG=True."
+msgstr "اطلاعات بیشتر با DEBUG=True ارائه خواهد شد."
+
+msgid "No year specified"
+msgstr "هیچ سالی مشخص نشده است"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "هیچ ماهی مشخص نشده است"
+
+msgid "No day specified"
+msgstr "هیچ روزی مشخص نشده است"
+
+msgid "No week specified"
+msgstr "هیچ هفتهای مشخص نشده است"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "هیچ %(verbose_name_plural)s موجود نیست"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"آینده %(verbose_name_plural)s امکان پذیر نیست زیرا مقدار %(class_name)s."
+"allow_future برابر False تنظیم شده است."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "متن تاریخ '%(datestr)s' با فرمت '%(format)s' غلط است."
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "هیچ %(verbose_name)s ای مطابق جستجو پیدا نشد."
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Page مقدار 'last' نیست,همچنین قابل تبدیل به عدد هم نمیباشد."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "صفحهی اشتباه (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr " لیست خالی است و '%(class_name)s.allow_empty' برابر False است."
+
+msgid "Directory indexes are not allowed here."
+msgstr "شاخص دایرکتوری اینجا قابل قبول نیست."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" وجود ندارد"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "فهرست %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..95f24be
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..e03efe3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/formats.py
new file mode 100644
index 0000000..419a9a2
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fa/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F Y'
+TIME_FORMAT = 'G:i'
+DATETIME_FORMAT = 'j F Y، ساعت G:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'Y/n/j'
+SHORT_DATETIME_FORMAT = 'Y/n/j، G:i'
+FIRST_DAY_OF_WEEK = 6
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d7f35ce
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po
new file mode 100644
index 0000000..0247661
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po
@@ -0,0 +1,1239 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Aarni Koskela, 2015,2017
+# Antti Kaihola , 2011
+# Jannis Leidel , 2011
+# Lasse Liehu , 2015
+# Klaus Dahlén , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Finnish (http://www.transifex.com/django/django/language/"
+"fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "afrikaans"
+
+msgid "Arabic"
+msgstr "arabia"
+
+msgid "Asturian"
+msgstr "asturian kieli"
+
+msgid "Azerbaijani"
+msgstr "azeri"
+
+msgid "Bulgarian"
+msgstr "bulgaria"
+
+msgid "Belarusian"
+msgstr "valkovenäjän kieli"
+
+msgid "Bengali"
+msgstr "bengali"
+
+msgid "Breton"
+msgstr "bretoni"
+
+msgid "Bosnian"
+msgstr "bosnia"
+
+msgid "Catalan"
+msgstr "katalaani"
+
+msgid "Czech"
+msgstr "tšekki"
+
+msgid "Welsh"
+msgstr "wales"
+
+msgid "Danish"
+msgstr "tanska"
+
+msgid "German"
+msgstr "saksa"
+
+msgid "Lower Sorbian"
+msgstr "Alasorbi"
+
+msgid "Greek"
+msgstr "kreikka"
+
+msgid "English"
+msgstr "englanti"
+
+msgid "Australian English"
+msgstr "australianenglanti"
+
+msgid "British English"
+msgstr "brittienglanti"
+
+msgid "Esperanto"
+msgstr "esperanto"
+
+msgid "Spanish"
+msgstr "espanja"
+
+msgid "Argentinian Spanish"
+msgstr "Argentiinan espanja"
+
+msgid "Colombian Spanish"
+msgstr "Kolumbian espanja"
+
+msgid "Mexican Spanish"
+msgstr "Meksikon espanja"
+
+msgid "Nicaraguan Spanish"
+msgstr "Nicaraguan espanja"
+
+msgid "Venezuelan Spanish"
+msgstr "Venezuelan espanja"
+
+msgid "Estonian"
+msgstr "viro"
+
+msgid "Basque"
+msgstr "baski"
+
+msgid "Persian"
+msgstr "persia"
+
+msgid "Finnish"
+msgstr "suomi"
+
+msgid "French"
+msgstr "ranska"
+
+msgid "Frisian"
+msgstr "friisi"
+
+msgid "Irish"
+msgstr "irlanti"
+
+msgid "Scottish Gaelic"
+msgstr "Skottilainen gaeli"
+
+msgid "Galician"
+msgstr "galicia"
+
+msgid "Hebrew"
+msgstr "heprea"
+
+msgid "Hindi"
+msgstr "hindi"
+
+msgid "Croatian"
+msgstr "kroatia"
+
+msgid "Upper Sorbian"
+msgstr "Yläsorbi"
+
+msgid "Hungarian"
+msgstr "unkari"
+
+msgid "Interlingua"
+msgstr "interlingua"
+
+msgid "Indonesian"
+msgstr "indonesia"
+
+msgid "Ido"
+msgstr "ido"
+
+msgid "Icelandic"
+msgstr "islanti"
+
+msgid "Italian"
+msgstr "italia"
+
+msgid "Japanese"
+msgstr "japani"
+
+msgid "Georgian"
+msgstr "georgia"
+
+msgid "Kazakh"
+msgstr "kazakin kieli"
+
+msgid "Khmer"
+msgstr "khmer"
+
+msgid "Kannada"
+msgstr "kannada"
+
+msgid "Korean"
+msgstr "korea"
+
+msgid "Luxembourgish"
+msgstr "luxemburgin kieli"
+
+msgid "Lithuanian"
+msgstr "liettua"
+
+msgid "Latvian"
+msgstr "latvia"
+
+msgid "Macedonian"
+msgstr "makedonia"
+
+msgid "Malayalam"
+msgstr "malajalam"
+
+msgid "Mongolian"
+msgstr "mongolia"
+
+msgid "Marathi"
+msgstr "marathi"
+
+msgid "Burmese"
+msgstr "burman kieli"
+
+msgid "Norwegian Bokmål"
+msgstr "norja (bokmål)"
+
+msgid "Nepali"
+msgstr "nepalin kieli"
+
+msgid "Dutch"
+msgstr "hollanti"
+
+msgid "Norwegian Nynorsk"
+msgstr "norja (uusnorja)"
+
+msgid "Ossetic"
+msgstr "osseetin kieli"
+
+msgid "Punjabi"
+msgstr "punjabin kieli"
+
+msgid "Polish"
+msgstr "puola"
+
+msgid "Portuguese"
+msgstr "portugali"
+
+msgid "Brazilian Portuguese"
+msgstr "brasilian portugali"
+
+msgid "Romanian"
+msgstr "romania"
+
+msgid "Russian"
+msgstr "venäjä"
+
+msgid "Slovak"
+msgstr "slovakia"
+
+msgid "Slovenian"
+msgstr "slovenia"
+
+msgid "Albanian"
+msgstr "albaani"
+
+msgid "Serbian"
+msgstr "serbia"
+
+msgid "Serbian Latin"
+msgstr "serbian latina"
+
+msgid "Swedish"
+msgstr "ruotsi"
+
+msgid "Swahili"
+msgstr "swahili"
+
+msgid "Tamil"
+msgstr "tamili"
+
+msgid "Telugu"
+msgstr "telugu"
+
+msgid "Thai"
+msgstr "thain kieli"
+
+msgid "Turkish"
+msgstr "turkki"
+
+msgid "Tatar"
+msgstr "tataarin kieli"
+
+msgid "Udmurt"
+msgstr "udmurtti"
+
+msgid "Ukrainian"
+msgstr "ukraina"
+
+msgid "Urdu"
+msgstr "urdu"
+
+msgid "Vietnamese"
+msgstr "vietnam"
+
+msgid "Simplified Chinese"
+msgstr "kiina (yksinkertaistettu)"
+
+msgid "Traditional Chinese"
+msgstr "kiina (perinteinen)"
+
+msgid "Messages"
+msgstr "Viestit"
+
+msgid "Site Maps"
+msgstr "Sivukartat"
+
+msgid "Static Files"
+msgstr "Staattiset tiedostot"
+
+msgid "Syndication"
+msgstr "Syndikointi"
+
+msgid "That page number is not an integer"
+msgstr "Annettu sivunumero ei ole kokonaisluku"
+
+msgid "That page number is less than 1"
+msgstr "Annettu sivunumero on alle 1"
+
+msgid "That page contains no results"
+msgstr "Annetulla sivulla ei ole tuloksia"
+
+msgid "Enter a valid value."
+msgstr "Syötä oikea arvo."
+
+msgid "Enter a valid URL."
+msgstr "Syötä oikea URL-osoite."
+
+msgid "Enter a valid integer."
+msgstr "Syötä kelvollinen kokonaisluku."
+
+msgid "Enter a valid email address."
+msgstr "Syötä kelvollinen sähköpostiosoite."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala- ja "
+"tavuviivoja (_ -)."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Tässä voidaan käyttää vain Unicode-kirjaimia, numeroita sekä ala- ja "
+"tavuviivoja."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Syötä kelvollinen IPv4-osoite."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Syötä kelvollinen IPv6-osoite."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite."
+
+msgid "Enter only digits separated by commas."
+msgstr "Vain pilkulla erotetut kokonaisluvut kelpaavat tässä."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "Tämän arvon on oltava %(limit_value)s (nyt %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Tämän arvon on oltava enintään %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Tämän luvun on oltava vähintään %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Varmista, että tämä arvo on vähintään %(limit_value)d merkin pituinen (tällä "
+"hetkellä %(show_value)d)."
+msgstr[1] ""
+"Varmista, että tämä arvo on vähintään %(limit_value)d merkkiä pitkä (tällä "
+"hetkellä %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Varmista, että tämä arvo on enintään %(limit_value)d merkin pituinen (tällä "
+"hetkellä %(show_value)d)."
+msgstr[1] ""
+"Varmista, että tämä arvo on enintään %(limit_value)d merkkiä pitkä (tällä "
+"hetkellä %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Tässä luvussa voi olla yhteensä enintään %(max)s numero."
+msgstr[1] "Tässä luvussa voi olla yhteensä enintään %(max)s numeroa."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Tässä luvussa saa olla enintään %(max)s desimaali."
+msgstr[1] "Tässä luvussa saa olla enintään %(max)s desimaalia."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Tässä luvussa saa olla enintään %(max)s numero ennen desimaalipilkkua."
+msgstr[1] ""
+"Tässä luvussa saa olla enintään %(max)s numeroa ennen desimaalipilkkua."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Pääte \"%(extension)s\" ei ole sallittu. Sallittuja päätteitä ovat "
+"\"%(allowed_extensions)s\"."
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "ja"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s jolla on nämä %(field_labels)s on jo olemassa."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Arvo %(value)r ei kelpaa."
+
+msgid "This field cannot be null."
+msgstr "Tämän kentän arvo ei voi olla \"null\"."
+
+msgid "This field cannot be blank."
+msgstr "Tämä kenttä ei voi olla tyhjä."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s jolla on tämä %(field_label)s, on jo olemassa."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"\"%(field_label)s\"-kentän on oltava uniikki suhteessa: %(date_field_label)s "
+"%(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Kenttä tyyppiä: %(field_type)s"
+
+msgid "Integer"
+msgstr "Kokonaisluku"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "%(value)s-arvo tulee olla kokonaisluku."
+
+msgid "Big (8 byte) integer"
+msgstr "Suuri (8-tavuinen) kokonaisluku"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "%(value)s-arvo pitää olla joko tosi tai epätosi."
+
+msgid "Boolean (Either True or False)"
+msgstr "Totuusarvo: joko tosi (True) tai epätosi (False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Merkkijono (enintään %(max_length)s merkkiä)"
+
+msgid "Comma-separated integers"
+msgstr "Pilkulla erotetut kokonaisluvut"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"%(value)s-arvo on väärässä päivämäärämuodossa. Sen tulee olla VVVV-KK-PP -"
+"muodossa."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"%(value)s-arvo on oikeassa päivämäärämuodossa (VVVV-KK-PP), muttei ole "
+"kelvollinen päivämäärä."
+
+msgid "Date (without time)"
+msgstr "Päivämäärä (ilman kellonaikaa)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"%(value)s-arvon muoto ei kelpaa. Se tulee olla VVVV-KK-PP TT:MM[:ss[.uuuuuu]]"
+"[TZ] -muodossa."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"%(value)s-arvon muoto on oikea (VVVV-KK-PP TT:MM[:ss[.uuuuuu]][TZ]), mutta "
+"päivämäärä/aika ei ole kelvollinen."
+
+msgid "Date (with time)"
+msgstr "Päivämäärä ja kellonaika"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "%(value)s-arvo tulee olla desimaaliluku."
+
+msgid "Decimal number"
+msgstr "Desimaaliluku"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr "%(value)s-arvo pitää olla muodossa [PP] TT:MM[:ss[.uuuuuu]]."
+
+msgid "Duration"
+msgstr "Kesto"
+
+msgid "Email address"
+msgstr "Sähköpostiosoite"
+
+msgid "File path"
+msgstr "Tiedostopolku"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "%(value)s-arvo tulee olla liukuluku."
+
+msgid "Floating point number"
+msgstr "Liukuluku"
+
+msgid "IPv4 address"
+msgstr "IPv4-osoite"
+
+msgid "IP address"
+msgstr "IP-osoite"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "%(value)s-arvo tulee olla joko ei mitään, tosi tai epätosi."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Totuusarvo: joko tosi (True), epätosi (False) tai ei mikään (None)"
+
+msgid "Positive integer"
+msgstr "Positiivinen kokonaisluku"
+
+msgid "Positive small integer"
+msgstr "Pieni positiivinen kokonaisluku"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Lyhytnimi (enintään %(max_length)s merkkiä)"
+
+msgid "Small integer"
+msgstr "Pieni kokonaisluku"
+
+msgid "Text"
+msgstr "Tekstiä"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr "%(value)s-arvo pitää olla muodossa TT:MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"%(value)s-arvo on oikeassa muodossa (TT:MM[:ss[.uuuuuu]]), mutta kellonaika "
+"ei kelpaa."
+
+msgid "Time"
+msgstr "Kellonaika"
+
+msgid "URL"
+msgstr "URL-osoite"
+
+msgid "Raw binary data"
+msgstr "Raaka binaaridata"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "%(value)s ei ole kelvollinen UUID."
+
+msgid "File"
+msgstr "Tiedosto"
+
+msgid "Image"
+msgstr "Kuva"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "%(model)s-tietuetta %(field)s-kentällä %(value)r ei ole olemassa."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Vierasavain (tyyppi määräytyy liittyvän kentän mukaan)"
+
+msgid "One-to-one relationship"
+msgstr "Yksi-yhteen relaatio"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "%(from)s-%(to)s -suhde"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "%(from)s-%(to)s -suhteet"
+
+msgid "Many-to-many relationship"
+msgstr "Moni-moneen relaatio"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Tämä kenttä vaaditaan."
+
+msgid "Enter a whole number."
+msgstr "Syötä kokonaisluku."
+
+msgid "Enter a number."
+msgstr "Syötä luku."
+
+msgid "Enter a valid date."
+msgstr "Syötä oikea päivämäärä."
+
+msgid "Enter a valid time."
+msgstr "Syötä oikea kellonaika."
+
+msgid "Enter a valid date/time."
+msgstr "Syötä oikea pvm/kellonaika."
+
+msgid "Enter a valid duration."
+msgstr "Syötä oikea kesto."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)."
+
+msgid "No file was submitted."
+msgstr "Yhtään tiedostoa ei ole lähetetty."
+
+msgid "The submitted file is empty."
+msgstr "Lähetetty tiedosto on tyhjä."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Varmista, että tämä tiedostonimi on enintään %(max)d merkin pituinen (tällä "
+"hetkellä %(length)d)."
+msgstr[1] ""
+"Varmista, että tämä tiedostonimi on enintään %(max)d merkkiä pitkä (tällä "
+"hetkellä %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Voit joko lähettää tai poistaa tiedoston, muttei kumpaakin samalla."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Valitse oikea vaihtoehto. %(value)s ei ole vaihtoehtojen joukossa."
+
+msgid "Enter a list of values."
+msgstr "Syötä lista."
+
+msgid "Enter a complete value."
+msgstr "Syötä kokonainen arvo."
+
+msgid "Enter a valid UUID."
+msgstr "Syötä oikea UUID."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Piilokenttä %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "ManagementForm-tiedot puuttuvat tai niitä on muutettu"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Lähetä enintään %d lomake."
+msgstr[1] "Lähetä enintään %d lomaketta."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Lähetä vähintään %d lomake."
+msgstr[1] "Lähetä vähintään %d lomaketta."
+
+msgid "Order"
+msgstr "Järjestys"
+
+msgid "Delete"
+msgstr "Poista"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Korjaa kaksoisarvo kentälle %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Ole hyvä ja korjaa uniikin kentän %(field)s kaksoisarvo."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Korjaa allaolevat kaksoisarvot."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Valitse oikea vaihtoehto. Valintasi ei löydy vaihtoehtojen joukosta."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s -arvoa ei pystytty lukemaan aikavyöhykkeellä "
+"%(current_timezone)s; se saattaa olla moniarvoinen tai määrittämätön."
+
+msgid "Clear"
+msgstr "Poista"
+
+msgid "Currently"
+msgstr "Tällä hetkellä"
+
+msgid "Change"
+msgstr "Muokkaa"
+
+msgid "Unknown"
+msgstr "Tuntematon"
+
+msgid "Yes"
+msgstr "Kyllä"
+
+msgid "No"
+msgstr "Ei"
+
+msgid "yes,no,maybe"
+msgstr "kyllä,ei,ehkä"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d tavu"
+msgstr[1] "%(size)d tavua"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "ip"
+
+msgid "a.m."
+msgstr "ap"
+
+msgid "PM"
+msgstr "IP"
+
+msgid "AM"
+msgstr "AP"
+
+msgid "midnight"
+msgstr "keskiyö"
+
+msgid "noon"
+msgstr "keskipäivä"
+
+msgid "Monday"
+msgstr "maanantai"
+
+msgid "Tuesday"
+msgstr "tiistai"
+
+msgid "Wednesday"
+msgstr "keskiviikko"
+
+msgid "Thursday"
+msgstr "torstai"
+
+msgid "Friday"
+msgstr "perjantai"
+
+msgid "Saturday"
+msgstr "lauantai"
+
+msgid "Sunday"
+msgstr "sunnuntai"
+
+msgid "Mon"
+msgstr "ma"
+
+msgid "Tue"
+msgstr "ti"
+
+msgid "Wed"
+msgstr "ke"
+
+msgid "Thu"
+msgstr "to"
+
+msgid "Fri"
+msgstr "pe"
+
+msgid "Sat"
+msgstr "la"
+
+msgid "Sun"
+msgstr "su"
+
+msgid "January"
+msgstr "tammikuu"
+
+msgid "February"
+msgstr "helmikuu"
+
+msgid "March"
+msgstr "maaliskuu"
+
+msgid "April"
+msgstr "huhtikuu"
+
+msgid "May"
+msgstr "toukokuu"
+
+msgid "June"
+msgstr "kesäkuu"
+
+msgid "July"
+msgstr "heinäkuu"
+
+msgid "August"
+msgstr "elokuu"
+
+msgid "September"
+msgstr "syyskuu"
+
+msgid "October"
+msgstr "lokakuu"
+
+msgid "November"
+msgstr "marraskuu"
+
+msgid "December"
+msgstr "joulukuu"
+
+msgid "jan"
+msgstr "tam"
+
+msgid "feb"
+msgstr "hel"
+
+msgid "mar"
+msgstr "maa"
+
+msgid "apr"
+msgstr "huh"
+
+msgid "may"
+msgstr "tou"
+
+msgid "jun"
+msgstr "kes"
+
+msgid "jul"
+msgstr "hei"
+
+msgid "aug"
+msgstr "elo"
+
+msgid "sep"
+msgstr "syy"
+
+msgid "oct"
+msgstr "lok"
+
+msgid "nov"
+msgstr "mar"
+
+msgid "dec"
+msgstr "jou"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "tammi"
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "helmi"
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "maalis"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "huhti"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "touko"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "kesä"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "heinä"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "elo"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "syys"
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "loka"
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "marras"
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "joulu"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "tammikuuta"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "helmikuuta"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "maaliskuuta"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "huhtikuuta"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "toukokuuta"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "kesäkuuta"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "heinäkuuta"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "elokuuta"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "syyskuuta"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "lokakuuta"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "marraskuuta"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "joulukuuta"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Tämä ei ole kelvollinen IPv6-osoite."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s…"
+
+msgid "or"
+msgstr "tai"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d vuosi"
+msgstr[1] "%d vuotta"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d kuukausi"
+msgstr[1] "%d kuukautta"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d viikko"
+msgstr[1] "%d viikkoa"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d päivä"
+msgstr[1] "%d päivää"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d tunti"
+msgstr[1] "%d tuntia"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuutti"
+msgstr[1] "%d minuuttia"
+
+msgid "0 minutes"
+msgstr "0 minuuttia"
+
+msgid "Forbidden"
+msgstr "Kielletty"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "CSRF-vahvistus epäonnistui. Pyyntö hylätty."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Näet tämän viestin, koska tämä HTTPS-sivusto vaatii selaintasi lähettämään "
+"Referer-otsakkeen, mutta sitä ei vastaanotettu. Otsake vaaditaan "
+"turvallisuussyistä, varmistamaan etteivät kolmannet osapuolet ole ottaneet "
+"selaintasi haltuun."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Jos olet konfiguroinut selaimesi olemaan lähettämättä Referer-otsaketta, ole "
+"hyvä ja kytke otsake takaisin päälle ainakin tälle sivulle, HTTPS-"
+"yhteyksille tai saman lähteen (\"same-origin\") pyynnöille."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Näet tämän viestin, koska tämä sivusto vaatii CSRF-evästeen "
+"vastaanottaessaan lomaketietoja. Eväste vaaditaan turvallisuussyistä, "
+"varmistamaan etteivät kolmannet osapuolet ole ottaneet selaintasi haltuun."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Jos olet konfiguroinut selaimesi olemaan vastaanottamatta tai lähettämättä "
+"evästeitä, ole hyvä ja kytke evästeet takaisin päälle ainakin tälle sivulle "
+"tai saman lähteen (\"same-origin\") pyynnöille."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Lisätietoja `DEBUG=True`-konfiguraatioasetuksella."
+
+msgid "No year specified"
+msgstr "Vuosi puuttuu"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Kuukausi puuttuu"
+
+msgid "No day specified"
+msgstr "Päivä puuttuu"
+
+msgid "No week specified"
+msgstr "Viikko puuttuu"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "%(verbose_name_plural)s: yhtään kohdetta ei löydy"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"%(verbose_name_plural)s: tulevia kohteita ei löydy, koska %(class_name)s."
+"allow_future:n arvo on False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "Päivämäärä '%(datestr)s' ei ole muotoa '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Hakua vastaavaa %(verbose_name)s -kohdetta ei löytynyt"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "Sivunumero ei ole 'last' (viimeinen) eikä näytä luvulta."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Epäkelpo sivu (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Lista on tyhjä, ja '%(class_name)s.allow_empty':n arvo on False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Hakemistolistauksia ei sallita täällä."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" ei ole olemassa"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Hakemistolistaus: %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..9c3c63a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..3e8894f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/formats.py
new file mode 100644
index 0000000..2bdec14
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fi/formats.py
@@ -0,0 +1,39 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j. E Y'
+TIME_FORMAT = 'G.i'
+DATETIME_FORMAT = r'j. E Y \k\e\l\l\o G.i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j. F'
+SHORT_DATE_FORMAT = 'j.n.Y'
+SHORT_DATETIME_FORMAT = 'j.n.Y G.i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d.%m.%Y', # '20.3.2014'
+ '%d.%m.%y', # '20.3.14'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d.%m.%Y %H.%M.%S', # '20.3.2014 14.30.59'
+ '%d.%m.%Y %H.%M.%S.%f', # '20.3.2014 14.30.59.000200'
+ '%d.%m.%Y %H.%M', # '20.3.2014 14.30'
+ '%d.%m.%Y', # '20.3.2014'
+
+ '%d.%m.%y %H.%M.%S', # '20.3.14 14.30.59'
+ '%d.%m.%y %H.%M.%S.%f', # '20.3.14 14.30.59.000200'
+ '%d.%m.%y %H.%M', # '20.3.14 14.30'
+ '%d.%m.%y', # '20.3.14'
+]
+TIME_INPUT_FORMATS = [
+ '%H.%M.%S', # '14.30.59'
+ '%H.%M.%S.%f', # '14.30.59.000200'
+ '%H.%M', # '14.30'
+]
+
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '\xa0' # Non-breaking space
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..42780bb
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..e88a70f
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,1281 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# charettes , 2012
+# Claude Paroz , 2013-2017
+# Claude Paroz , 2011
+# Jannis Leidel , 2011
+# Jean-Baptiste Mora, 2014
+# Larlet David , 2011
+# Marie-Cécile Gohier , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 08:05+0000\n"
+"Last-Translator: Claude Paroz \n"
+"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgid "Afrikaans"
+msgstr "Afrikaans"
+
+msgid "Arabic"
+msgstr "Arabe"
+
+msgid "Asturian"
+msgstr "Asturien"
+
+msgid "Azerbaijani"
+msgstr "Azéri"
+
+msgid "Bulgarian"
+msgstr "Bulgare"
+
+msgid "Belarusian"
+msgstr "Biélorusse"
+
+msgid "Bengali"
+msgstr "Bengalî"
+
+msgid "Breton"
+msgstr "Breton"
+
+msgid "Bosnian"
+msgstr "Bosniaque"
+
+msgid "Catalan"
+msgstr "Catalan"
+
+msgid "Czech"
+msgstr "Tchèque"
+
+msgid "Welsh"
+msgstr "Gallois"
+
+msgid "Danish"
+msgstr "Dannois"
+
+msgid "German"
+msgstr "Allemand"
+
+msgid "Lower Sorbian"
+msgstr "Bas-sorabe"
+
+msgid "Greek"
+msgstr "Grec"
+
+msgid "English"
+msgstr "Anglais"
+
+msgid "Australian English"
+msgstr "Anglais australien"
+
+msgid "British English"
+msgstr "Anglais britannique"
+
+msgid "Esperanto"
+msgstr "Espéranto"
+
+msgid "Spanish"
+msgstr "Espagnol"
+
+msgid "Argentinian Spanish"
+msgstr "Espagnol argentin"
+
+msgid "Colombian Spanish"
+msgstr "Espagnol colombien"
+
+msgid "Mexican Spanish"
+msgstr "Espagnol mexicain"
+
+msgid "Nicaraguan Spanish"
+msgstr "Espagnol nicaraguayen"
+
+msgid "Venezuelan Spanish"
+msgstr "Espagnol vénézuélien"
+
+msgid "Estonian"
+msgstr "Estonien"
+
+msgid "Basque"
+msgstr "Basque"
+
+msgid "Persian"
+msgstr "Perse"
+
+msgid "Finnish"
+msgstr "Finlandais"
+
+msgid "French"
+msgstr "Français"
+
+msgid "Frisian"
+msgstr "Frise"
+
+msgid "Irish"
+msgstr "Irlandais"
+
+msgid "Scottish Gaelic"
+msgstr "Gaélique écossais"
+
+msgid "Galician"
+msgstr "Galicien"
+
+msgid "Hebrew"
+msgstr "Hébreu"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "Croate"
+
+msgid "Upper Sorbian"
+msgstr "Haut-sorabe"
+
+msgid "Hungarian"
+msgstr "Hongrois"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indonésien"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Islandais"
+
+msgid "Italian"
+msgstr "Italien"
+
+msgid "Japanese"
+msgstr "Japonais"
+
+msgid "Georgian"
+msgstr "Géorgien"
+
+msgid "Kazakh"
+msgstr "Kazakh"
+
+msgid "Khmer"
+msgstr "Khmer"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Coréen"
+
+msgid "Luxembourgish"
+msgstr "Luxembourgeois"
+
+msgid "Lithuanian"
+msgstr "Lituanien"
+
+msgid "Latvian"
+msgstr "Letton"
+
+msgid "Macedonian"
+msgstr "Macédonien"
+
+msgid "Malayalam"
+msgstr "Malayâlam"
+
+msgid "Mongolian"
+msgstr "Mongole"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "Birman"
+
+msgid "Norwegian Bokmål"
+msgstr "Norvégien Bokmal"
+
+msgid "Nepali"
+msgstr "Népalais"
+
+msgid "Dutch"
+msgstr "Hollandais"
+
+msgid "Norwegian Nynorsk"
+msgstr "Norvégien Nynorsk"
+
+msgid "Ossetic"
+msgstr "Ossète"
+
+msgid "Punjabi"
+msgstr "Penjabi"
+
+msgid "Polish"
+msgstr "Polonais"
+
+msgid "Portuguese"
+msgstr "Portugais"
+
+msgid "Brazilian Portuguese"
+msgstr "Portugais brésilien"
+
+msgid "Romanian"
+msgstr "Roumain"
+
+msgid "Russian"
+msgstr "Russe"
+
+msgid "Slovak"
+msgstr "Slovaque"
+
+msgid "Slovenian"
+msgstr "Slovène"
+
+msgid "Albanian"
+msgstr "Albanais"
+
+msgid "Serbian"
+msgstr "Serbe"
+
+msgid "Serbian Latin"
+msgstr "Serbe latin"
+
+msgid "Swedish"
+msgstr "Suédois"
+
+msgid "Swahili"
+msgstr "Swahili"
+
+msgid "Tamil"
+msgstr "Tamoul"
+
+msgid "Telugu"
+msgstr "Télougou"
+
+msgid "Thai"
+msgstr "Thaï"
+
+msgid "Turkish"
+msgstr "Turc"
+
+msgid "Tatar"
+msgstr "Tatar"
+
+msgid "Udmurt"
+msgstr "Oudmourte"
+
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+msgid "Urdu"
+msgstr "Ourdou"
+
+msgid "Vietnamese"
+msgstr "Vietnamien"
+
+msgid "Simplified Chinese"
+msgstr "Chinois simplifié"
+
+msgid "Traditional Chinese"
+msgstr "Chinois traditionnel"
+
+msgid "Messages"
+msgstr "Messages"
+
+msgid "Site Maps"
+msgstr "Plans de sites"
+
+msgid "Static Files"
+msgstr "Fichiers statiques"
+
+msgid "Syndication"
+msgstr "Syndication"
+
+msgid "That page number is not an integer"
+msgstr "Ce numéro de page n'est pas un nombre entier"
+
+msgid "That page number is less than 1"
+msgstr "Ce numéro de page est plus petit que 1"
+
+msgid "That page contains no results"
+msgstr "Cette page ne contient aucun résultat"
+
+msgid "Enter a valid value."
+msgstr "Saisissez une valeur valide."
+
+msgid "Enter a valid URL."
+msgstr "Saisissez une URL valide."
+
+msgid "Enter a valid integer."
+msgstr "Saisissez un nombre entier valide."
+
+msgid "Enter a valid email address."
+msgstr "Saisissez une adresse de courriel valide."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et "
+"des traits d'union."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Ce champ ne doit contenir que des caractères Unicode, des nombres, des "
+"tirets bas (_) et des traits d'union."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Saisissez une adresse IPv4 valide."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Saisissez une adresse IPv6 valide."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Saisissez une adresse IPv4 ou IPv6 valide."
+
+msgid "Enter only digits separated by commas."
+msgstr "Saisissez uniquement des chiffres séparés par des virgules."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Assurez-vous que cette valeur est %(limit_value)s (actuellement "
+"%(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+"Assurez-vous que cette valeur est inférieure ou égale à %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Assurez-vous que cette valeur est supérieure ou égale à %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractère "
+"(actuellement %(show_value)d)."
+msgstr[1] ""
+"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractères "
+"(actuellement %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractère "
+"(actuellement %(show_value)d)."
+msgstr[1] ""
+"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractères "
+"(actuellement %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Assurez-vous qu'il n'y a pas plus de %(max)s chiffre au total."
+msgstr[1] "Assurez-vous qu'il n'y a pas plus de %(max)s chiffres au total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+"Assurez-vous qu'il n'y a pas plus de %(max)s chiffre après la virgule."
+msgstr[1] ""
+"Assurez-vous qu'il n'y a pas plus de %(max)s chiffres après la virgule."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Assurez-vous qu'il n'y a pas plus de %(max)s chiffre avant la virgule."
+msgstr[1] ""
+"Assurez-vous qu'il n'y a pas plus de %(max)s chiffres avant la virgule."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"L'extension de fichier « %(extension)s » n'est pas autorisée. Les extensions "
+"autorisées sont : %(allowed_extensions)s."
+
+msgid "Null characters are not allowed."
+msgstr "Le caractère nul n'est pas autorisé."
+
+msgid "and"
+msgstr "et"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "Un object %(model_name)s avec ces champs %(field_labels)s existe déjà."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "La valeur « %(value)r » n'est pas un choix valide."
+
+msgid "This field cannot be null."
+msgstr "Ce champ ne peut pas être vide."
+
+msgid "This field cannot be blank."
+msgstr "Ce champ ne peut pas être vide."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Un objet %(model_name)s avec ce champ %(field_label)s existe déjà."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s doit être unique pour la partie %(lookup_type)s de "
+"%(date_field_label)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Champ de type : %(field_type)s"
+
+msgid "Integer"
+msgstr "Entier"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "La valeur « %(value)s » doit être un nombre entier."
+
+msgid "Big (8 byte) integer"
+msgstr "Grand entier (8 octets)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "La valeur « %(value)s » doit être soit True (vrai), soit False (faux)."
+
+msgid "Boolean (Either True or False)"
+msgstr "Booléen (soit vrai ou faux)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Chaîne de caractère (jusqu'à %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Des entiers séparés par une virgule"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"Le format de date de la valeur « %(value)s » n'est pas valide. Le format "
+"correct est AAAA-MM-JJ."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Le format de date de la valeur « %(value)s » est correct (AAAA-MM-JJ), mais "
+"la date n'est pas valide."
+
+msgid "Date (without time)"
+msgstr "Date (sans l'heure)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Le format de la valeur « %(value)s » n'est pas valide. Le format correct est "
+"AAAA-MM-JJ HH:MM[:ss[.uuuuuu]][FH]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Le format de date de la valeur « %(value)s » est correct (AAAA-MM-JJ HH:MM[:"
+"ss[.uuuuuu]][FH]), mais la date ou l'heure n'est pas valide."
+
+msgid "Date (with time)"
+msgstr "Date (avec l'heure)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "La valeur « %(value)s » doit être un nombre décimal."
+
+msgid "Decimal number"
+msgstr "Nombre décimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"Le format de la valeur « %(value)s » n'est pas valide. Le format correct est "
+"[JJ] [HH:[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Durée"
+
+msgid "Email address"
+msgstr "Adresse électronique"
+
+msgid "File path"
+msgstr "Chemin vers le fichier"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "La valeur « %(value)s » doit être un nombre à virgule flottante."
+
+msgid "Floating point number"
+msgstr "Nombre à virgule flottante"
+
+msgid "IPv4 address"
+msgstr "Adresse IPv4"
+
+msgid "IP address"
+msgstr "Adresse IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+"La valeur « %(value)s » doit valoir soit None (vide), True (vrai) ou False "
+"(faux)."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booléen (soit vrai, faux ou nul)"
+
+msgid "Positive integer"
+msgstr "Nombre entier positif"
+
+msgid "Positive small integer"
+msgstr "Petit nombre entier positif"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (jusqu'à %(max_length)s car.)"
+
+msgid "Small integer"
+msgstr "Petit nombre entier"
+
+msgid "Text"
+msgstr "Texte"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Le format de la valeur « %(value)s » n'est pas valide. Le format correct est "
+"HH:MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Le format de la valeur « %(value)s » est correct (HH:MM[:ss[.uuuuuu]]), mais "
+"l'heure n'est pas valide."
+
+msgid "Time"
+msgstr "Heure"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Données binaires brutes"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "La valeur « %(value)s » n'est pas un UUID valide."
+
+msgid "File"
+msgstr "Fichier"
+
+msgid "Image"
+msgstr "Image"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "L'instance %(model)s avec %(value)r dans %(field)s n'existe pas."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clé étrangère (type défini par le champ lié)"
+
+msgid "One-to-one relationship"
+msgstr "Relation un à un"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "Relation %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "Relations %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Relation plusieurs à plusieurs"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Ce champ est obligatoire."
+
+msgid "Enter a whole number."
+msgstr "Saisissez un nombre entier."
+
+msgid "Enter a number."
+msgstr "Saisissez un nombre."
+
+msgid "Enter a valid date."
+msgstr "Saisissez une date valide."
+
+msgid "Enter a valid time."
+msgstr "Saisissez une heure valide."
+
+msgid "Enter a valid date/time."
+msgstr "Saisissez une date et une heure valides."
+
+msgid "Enter a valid duration."
+msgstr "Saisissez une durée valide."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Aucun fichier n'a été soumis. Vérifiez le type d'encodage du formulaire."
+
+msgid "No file was submitted."
+msgstr "Aucun fichier n'a été soumis."
+
+msgid "The submitted file is empty."
+msgstr "Le fichier soumis est vide."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractère "
+"(actuellement %(length)d)."
+msgstr[1] ""
+"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractères "
+"(actuellement %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "Envoyez un fichier ou cochez la case d'effacement, mais pas les deux."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Téléversez une image valide. Le fichier que vous avez transféré n'est pas "
+"une image ou bien est corrompu."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Sélectionnez un choix valide. %(value)s n'en fait pas partie."
+
+msgid "Enter a list of values."
+msgstr "Saisissez une liste de valeurs."
+
+msgid "Enter a complete value."
+msgstr "Saisissez une valeur complète."
+
+msgid "Enter a valid UUID."
+msgstr "Saisissez un UUID valide."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr " :"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(champ masqué %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+"Les données du formulaire ManagementForm sont manquantes ou ont été "
+"manipulées"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Ne soumettez pas plus de %d formulaire."
+msgstr[1] "Ne soumettez pas plus de %d formulaires."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Veuillez soumettre au moins %d formulaire."
+msgstr[1] "Veuillez soumettre au moins %d formulaires."
+
+msgid "Order"
+msgstr "Ordre"
+
+msgid "Delete"
+msgstr "Supprimer"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Corrigez les données à double dans %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Corrigez les données à double dans %(field)s qui doit contenir des valeurs "
+"uniques."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Corrigez les données à double dans %(field_name)s qui doit contenir des "
+"valeurs uniques pour la partie %(lookup)s de %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Corrigez les valeurs à double ci-dessous."
+
+msgid "The inline value did not match the parent instance."
+msgstr "La valeur en ligne ne correspond pas à l’instance parente."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Sélectionnez un choix valide. Ce choix ne fait pas partie de ceux "
+"disponibles."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "« %(pk)s » n’est pas une valeur correcte."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"La valeur %(datetime)s n'a pas pu être interprétée dans le fuseau horaire "
+"%(current_timezone)s ; elle est peut-être ambigüe ou elle n'existe pas."
+
+msgid "Clear"
+msgstr "Effacer"
+
+msgid "Currently"
+msgstr "Actuellement"
+
+msgid "Change"
+msgstr "Modifier"
+
+msgid "Unknown"
+msgstr "Inconnu"
+
+msgid "Yes"
+msgstr "Oui"
+
+msgid "No"
+msgstr "Non"
+
+msgid "yes,no,maybe"
+msgstr "oui, non, peut-être"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d octet"
+msgstr[1] "%(size)d octets"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s Kio"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s Mio"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s Gio"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s Tio"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s Pio"
+
+msgid "p.m."
+msgstr "après-midi"
+
+msgid "a.m."
+msgstr "matin"
+
+msgid "PM"
+msgstr "Après-midi"
+
+msgid "AM"
+msgstr "Matin"
+
+msgid "midnight"
+msgstr "minuit"
+
+msgid "noon"
+msgstr "midi"
+
+msgid "Monday"
+msgstr "lundi"
+
+msgid "Tuesday"
+msgstr "mardi"
+
+msgid "Wednesday"
+msgstr "mercredi"
+
+msgid "Thursday"
+msgstr "jeudi"
+
+msgid "Friday"
+msgstr "vendredi"
+
+msgid "Saturday"
+msgstr "samedi"
+
+msgid "Sunday"
+msgstr "dimanche"
+
+msgid "Mon"
+msgstr "lun"
+
+msgid "Tue"
+msgstr "mar"
+
+msgid "Wed"
+msgstr "mer"
+
+msgid "Thu"
+msgstr "jeu"
+
+msgid "Fri"
+msgstr "ven"
+
+msgid "Sat"
+msgstr "sam"
+
+msgid "Sun"
+msgstr "dim"
+
+msgid "January"
+msgstr "janvier"
+
+msgid "February"
+msgstr "février"
+
+msgid "March"
+msgstr "mars"
+
+msgid "April"
+msgstr "avril"
+
+msgid "May"
+msgstr "mai"
+
+msgid "June"
+msgstr "juin"
+
+msgid "July"
+msgstr "juillet"
+
+msgid "August"
+msgstr "août"
+
+msgid "September"
+msgstr "septembre"
+
+msgid "October"
+msgstr "octobre"
+
+msgid "November"
+msgstr "novembre"
+
+msgid "December"
+msgstr "décembre"
+
+msgid "jan"
+msgstr "jan"
+
+msgid "feb"
+msgstr "fév"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "avr"
+
+msgid "may"
+msgstr "mai"
+
+msgid "jun"
+msgstr "jui"
+
+msgid "jul"
+msgstr "jul"
+
+msgid "aug"
+msgstr "aoû"
+
+msgid "sep"
+msgstr "sep"
+
+msgid "oct"
+msgstr "oct"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "déc"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "jan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "fév."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "mars"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "avr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "mai"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "juin"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "juil."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "août"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "sep."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "oct."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "déc."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Janvier"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Février"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Mars"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Avril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mai"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Juin"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Juillet"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Août"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Septembre"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Octobre"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Novembre"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Décembre"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Ceci n'est pas une adresse IPv6 valide."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s…"
+
+msgid "or"
+msgstr "ou"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d année"
+msgstr[1] "%d années"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mois"
+msgstr[1] "%d mois"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semaine"
+msgstr[1] "%d semaines"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d jour"
+msgstr[1] "%d jours"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d heure"
+msgstr[1] "%d heures"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minute"
+msgstr[1] "%d minutes"
+
+msgid "0 minutes"
+msgstr "0 minute"
+
+msgid "Forbidden"
+msgstr "Interdit"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "La vérification CSRF a échoué. La requête a été interrompue."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Vous voyez ce message parce que ce site HTTPS exige que le navigateur Web "
+"envoie un en-tête « Referer », ce qu'il n'a pas fait. Cet en-tête est exigé "
+"pour des raisons de sécurité, afin de s'assurer que le navigateur n'ait pas "
+"été piraté par un intervenant externe."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Si vous avez désactivé l'envoi des en-têtes « Referer » par votre "
+"navigateur, veuillez les réactiver, au moins pour ce site ou pour les "
+"connexions HTTPS, ou encore pour les requêtes de même origine (« same-"
+"origin »)."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Si vous utilisez la balise "
+"ou que vous incluez l’en-tête « Referrer-Policy: no-referrer », il est "
+"préférable de les enlever. La protection CSRF exige que l’en-tête "
+"``Referer`` effectue un contrôle de référant strict. Si vous vous souciez de "
+"la confidentialité, utilisez des alternatives comme pour les liens vers des sites tiers."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Vous voyez ce message parce que ce site exige la présence d'un cookie CSRF "
+"lors de l'envoi de formulaires. Ce cookie est nécessaire pour des raisons de "
+"sécurité, afin de s'assurer que le navigateur n'ait pas été piraté par un "
+"intervenant externe."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Si vous avez désactivé l'envoi des cookies par votre navigateur, veuillez "
+"les réactiver au moins pour ce site ou pour les requêtes de même origine (« "
+"same-origin »)."
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+"Des informations plus détaillées sont affichées lorsque la variable DEBUG "
+"vaut True."
+
+msgid "No year specified"
+msgstr "Aucune année indiquée"
+
+msgid "Date out of range"
+msgstr "Date hors limites"
+
+msgid "No month specified"
+msgstr "Aucun mois indiqué"
+
+msgid "No day specified"
+msgstr "Aucun jour indiqué"
+
+msgid "No week specified"
+msgstr "Aucune semaine indiquée"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Pas de %(verbose_name_plural)s disponible"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Pas de %(verbose_name_plural)s disponible dans le futur car %(class_name)s."
+"allow_future est faux (False)."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Le format « %(format)s » appliqué à la chaîne date « %(datestr)s » n'est pas "
+"valide"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Aucun objet %(verbose_name)s trouvé en réponse à la requête"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"Page ne vaut pas « last » et ne peut pas non plus être converti en un nombre "
+"entier."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Page non valide (%(page_number)s) : %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Liste vide et %(class_name)s.allow_empty est faux (False)."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Il n'est pas autorisé d'afficher le contenu de ce répertoire."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "« %(path)s » n'existe pas"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Index de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django : le cadriciel Web pour les perfectionnistes sous contrainte."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Afficher les notes de publication de "
+"Django %(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "L’installation s'est déroulée avec succès. Félicitations !"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Vous voyez cette page parce que votre fichier de réglages contient DEBUG=True et que vous n’avez pas encore "
+"configuré d’URL."
+
+msgid "Django Documentation"
+msgstr "Documentation de Django"
+
+msgid "Topics, references, & how-to's"
+msgstr "Thématiques, références et guides pratiques"
+
+msgid "Tutorial: A Polling App"
+msgstr "Tutoriel : une application de sondage"
+
+msgid "Get started with Django"
+msgstr "Premiers pas avec Django"
+
+msgid "Django Community"
+msgstr "Communauté Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "Se connecter, obtenir de l’aide ou contribuer"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..51adc0d
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..588fc96
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/formats.py
new file mode 100644
index 0000000..6db0b01
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fr/formats.py
@@ -0,0 +1,33 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = 'j F Y H:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'j N Y'
+SHORT_DATETIME_FORMAT = 'j N Y H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+DATE_INPUT_FORMATS = [
+ '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06'
+ '%d.%m.%Y', '%d.%m.%y', # Swiss [fr_CH), '25.10.2006', '25.10.06'
+ # '%d %B %Y', '%d %b %Y', # '25 octobre 2006', '25 oct. 2006'
+]
+DATETIME_INPUT_FORMATS = [
+ '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59'
+ '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200'
+ '%d/%m/%Y %H:%M', # '25/10/2006 14:30'
+ '%d/%m/%Y', # '25/10/2006'
+ '%d.%m.%Y %H:%M:%S', # Swiss [fr_CH), '25.10.2006 14:30:59'
+ '%d.%m.%Y %H:%M:%S.%f', # Swiss (fr_CH), '25.10.2006 14:30:59.000200'
+ '%d.%m.%Y %H:%M', # Swiss (fr_CH), '25.10.2006 14:30'
+ '%d.%m.%Y', # Swiss (fr_CH), '25.10.2006'
+]
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
+NUMBER_GROUPING = 3
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..258b891
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po
new file mode 100644
index 0000000..35c00bb
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po
@@ -0,0 +1,1191 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Western Frisian (http://www.transifex.com/django/django/"
+"language/fy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fy\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr ""
+
+msgid "Arabic"
+msgstr ""
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr ""
+
+msgid "Bulgarian"
+msgstr ""
+
+msgid "Belarusian"
+msgstr ""
+
+msgid "Bengali"
+msgstr ""
+
+msgid "Breton"
+msgstr ""
+
+msgid "Bosnian"
+msgstr ""
+
+msgid "Catalan"
+msgstr ""
+
+msgid "Czech"
+msgstr ""
+
+msgid "Welsh"
+msgstr ""
+
+msgid "Danish"
+msgstr ""
+
+msgid "German"
+msgstr ""
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr ""
+
+msgid "English"
+msgstr ""
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr ""
+
+msgid "Esperanto"
+msgstr ""
+
+msgid "Spanish"
+msgstr ""
+
+msgid "Argentinian Spanish"
+msgstr ""
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr ""
+
+msgid "Nicaraguan Spanish"
+msgstr ""
+
+msgid "Venezuelan Spanish"
+msgstr ""
+
+msgid "Estonian"
+msgstr ""
+
+msgid "Basque"
+msgstr ""
+
+msgid "Persian"
+msgstr ""
+
+msgid "Finnish"
+msgstr ""
+
+msgid "French"
+msgstr ""
+
+msgid "Frisian"
+msgstr ""
+
+msgid "Irish"
+msgstr ""
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr ""
+
+msgid "Hebrew"
+msgstr ""
+
+msgid "Hindi"
+msgstr ""
+
+msgid "Croatian"
+msgstr ""
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr ""
+
+msgid "Interlingua"
+msgstr ""
+
+msgid "Indonesian"
+msgstr ""
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr ""
+
+msgid "Italian"
+msgstr ""
+
+msgid "Japanese"
+msgstr ""
+
+msgid "Georgian"
+msgstr ""
+
+msgid "Kazakh"
+msgstr ""
+
+msgid "Khmer"
+msgstr ""
+
+msgid "Kannada"
+msgstr ""
+
+msgid "Korean"
+msgstr ""
+
+msgid "Luxembourgish"
+msgstr ""
+
+msgid "Lithuanian"
+msgstr ""
+
+msgid "Latvian"
+msgstr ""
+
+msgid "Macedonian"
+msgstr ""
+
+msgid "Malayalam"
+msgstr ""
+
+msgid "Mongolian"
+msgstr ""
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr ""
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr ""
+
+msgid "Dutch"
+msgstr ""
+
+msgid "Norwegian Nynorsk"
+msgstr ""
+
+msgid "Ossetic"
+msgstr ""
+
+msgid "Punjabi"
+msgstr ""
+
+msgid "Polish"
+msgstr ""
+
+msgid "Portuguese"
+msgstr ""
+
+msgid "Brazilian Portuguese"
+msgstr ""
+
+msgid "Romanian"
+msgstr ""
+
+msgid "Russian"
+msgstr ""
+
+msgid "Slovak"
+msgstr ""
+
+msgid "Slovenian"
+msgstr ""
+
+msgid "Albanian"
+msgstr ""
+
+msgid "Serbian"
+msgstr ""
+
+msgid "Serbian Latin"
+msgstr ""
+
+msgid "Swedish"
+msgstr ""
+
+msgid "Swahili"
+msgstr ""
+
+msgid "Tamil"
+msgstr ""
+
+msgid "Telugu"
+msgstr ""
+
+msgid "Thai"
+msgstr ""
+
+msgid "Turkish"
+msgstr ""
+
+msgid "Tatar"
+msgstr ""
+
+msgid "Udmurt"
+msgstr ""
+
+msgid "Ukrainian"
+msgstr ""
+
+msgid "Urdu"
+msgstr ""
+
+msgid "Vietnamese"
+msgstr ""
+
+msgid "Simplified Chinese"
+msgstr ""
+
+msgid "Traditional Chinese"
+msgstr ""
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Jou in falide wearde."
+
+msgid "Enter a valid URL."
+msgstr "Jou in falide URL."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr ""
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Jou in falida 'slug' gearsteld mei letters, nûmers, ûnderstreekjes of "
+"koppelteken."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Jou in falide IPv4-adres."
+
+msgid "Enter a valid IPv6 address."
+msgstr ""
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr ""
+
+msgid "Enter only digits separated by commas."
+msgstr "Jou allinnich sifers, skieden troch komma's."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "Dit fjild kin net leech wêze."
+
+msgid "This field cannot be blank."
+msgstr ""
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s mei dit %(field_label)s bestiet al."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr ""
+
+msgid "Integer"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr ""
+
+msgid "Comma-separated integers"
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr ""
+
+msgid "File path"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr ""
+
+msgid "IPv4 address"
+msgstr ""
+
+msgid "IP address"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+msgid "Positive integer"
+msgstr ""
+
+msgid "Positive small integer"
+msgstr ""
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr ""
+
+msgid "Small integer"
+msgstr ""
+
+msgid "Text"
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr ""
+
+msgid "URL"
+msgstr ""
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Image"
+msgstr ""
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr ""
+
+msgid "One-to-one relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr ""
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ""
+
+msgid "This field is required."
+msgstr "Dit fjild is fereaske."
+
+msgid "Enter a whole number."
+msgstr "Jou in folslein nûmer."
+
+msgid "Enter a number."
+msgstr "Jou in nûmer."
+
+msgid "Enter a valid date."
+msgstr "Jou in falide datum."
+
+msgid "Enter a valid time."
+msgstr "Jou in falide tiid."
+
+msgid "Enter a valid date/time."
+msgstr "Jou in falide datum.tiid."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Der is gjin bestân yntsjinne. Kontrolearje it kodearringstype op it "
+"formulier."
+
+msgid "No file was submitted."
+msgstr "Der is gjin bestân yntsjinne."
+
+msgid "The submitted file is empty."
+msgstr "It yntsjinne bestân is leech."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Laad in falide ôfbylding op. It bestân dy't jo opladen hawwe wie net in "
+"ôfbylding of in skansearre ôfbylding."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Selektearje in falide kar. %(value)s is net ien fan de beskikbere karren."
+
+msgid "Enter a list of values."
+msgstr "Jou in list mei weardes."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ""
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "Oarder"
+
+msgid "Delete"
+msgstr ""
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr ""
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+
+msgid "Please correct the duplicate values below."
+msgstr ""
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Selektearje in falide kar. Dizze kar is net ien fan de beskikbere karren."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+
+msgid "Clear"
+msgstr ""
+
+msgid "Currently"
+msgstr ""
+
+msgid "Change"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "yes,no,maybe"
+msgstr ""
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%s KB"
+msgstr ""
+
+#, python-format
+msgid "%s MB"
+msgstr ""
+
+#, python-format
+msgid "%s GB"
+msgstr ""
+
+#, python-format
+msgid "%s TB"
+msgstr ""
+
+#, python-format
+msgid "%s PB"
+msgstr ""
+
+msgid "p.m."
+msgstr ""
+
+msgid "a.m."
+msgstr ""
+
+msgid "PM"
+msgstr ""
+
+msgid "AM"
+msgstr ""
+
+msgid "midnight"
+msgstr ""
+
+msgid "noon"
+msgstr ""
+
+msgid "Monday"
+msgstr ""
+
+msgid "Tuesday"
+msgstr ""
+
+msgid "Wednesday"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "Saturday"
+msgstr ""
+
+msgid "Sunday"
+msgstr ""
+
+msgid "Mon"
+msgstr ""
+
+msgid "Tue"
+msgstr ""
+
+msgid "Wed"
+msgstr ""
+
+msgid "Thu"
+msgstr ""
+
+msgid "Fri"
+msgstr ""
+
+msgid "Sat"
+msgstr ""
+
+msgid "Sun"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "February"
+msgstr ""
+
+msgid "March"
+msgstr ""
+
+msgid "April"
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "June"
+msgstr ""
+
+msgid "July"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "October"
+msgstr ""
+
+msgid "November"
+msgstr ""
+
+msgid "December"
+msgstr ""
+
+msgid "jan"
+msgstr ""
+
+msgid "feb"
+msgstr ""
+
+msgid "mar"
+msgstr ""
+
+msgid "apr"
+msgstr ""
+
+msgid "may"
+msgstr ""
+
+msgid "jun"
+msgstr ""
+
+msgid "jul"
+msgstr ""
+
+msgid "aug"
+msgstr ""
+
+msgid "sep"
+msgstr ""
+
+msgid "oct"
+msgstr ""
+
+msgid "nov"
+msgstr ""
+
+msgid "dec"
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr ""
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr ""
+
+msgctxt "alt. month"
+msgid "January"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "February"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "March"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "April"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "May"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "June"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "July"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "August"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "September"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "October"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "November"
+msgstr ""
+
+msgctxt "alt. month"
+msgid "December"
+msgstr ""
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr ""
+
+msgid "or"
+msgstr ""
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ""
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "0 minutes"
+msgstr ""
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr ""
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr ""
+
+msgid "No day specified"
+msgstr ""
+
+msgid "No week specified"
+msgstr ""
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr ""
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr ""
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr ""
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr ""
+
+msgid "Directory indexes are not allowed here."
+msgstr ""
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr ""
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr ""
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..7b20e3a
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..669e7a3
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/formats.py
new file mode 100644
index 0000000..9dd995d
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/fy/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+# DATE_FORMAT =
+# TIME_FORMAT =
+# DATETIME_FORMAT =
+# YEAR_MONTH_FORMAT =
+# MONTH_DAY_FORMAT =
+# SHORT_DATE_FORMAT =
+# SHORT_DATETIME_FORMAT =
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+# DECIMAL_SEPARATOR =
+# THOUSAND_SEPARATOR =
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e37c641
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po
new file mode 100644
index 0000000..e348124
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po
@@ -0,0 +1,1252 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Jannis Leidel , 2011
+# John Moylan , 2013
+# John Stafford , 2013
+# Seán de Búrca , 2011
+# Michael Thornhill , 2011-2012,2015
+# Séamus Ó Cúile , 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ga\n"
+"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : "
+"4);\n"
+
+msgid "Afrikaans"
+msgstr "Afracáinis"
+
+msgid "Arabic"
+msgstr "Araibis"
+
+msgid "Asturian"
+msgstr "Astúiris"
+
+msgid "Azerbaijani"
+msgstr "Asarbaiseáinis"
+
+msgid "Bulgarian"
+msgstr "Bulgáiris"
+
+msgid "Belarusian"
+msgstr "Bealarúisis"
+
+msgid "Bengali"
+msgstr "Beangáilis"
+
+msgid "Breton"
+msgstr "Briotánach"
+
+msgid "Bosnian"
+msgstr "Boisnis"
+
+msgid "Catalan"
+msgstr "Catalóinis"
+
+msgid "Czech"
+msgstr "Seicis"
+
+msgid "Welsh"
+msgstr "Breatnais"
+
+msgid "Danish"
+msgstr "Danmhairgis "
+
+msgid "German"
+msgstr "Gearmáinis"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Gréigis"
+
+msgid "English"
+msgstr "Béarla"
+
+msgid "Australian English"
+msgstr "Béarla Astrálach"
+
+msgid "British English"
+msgstr "Béarla na Breataine"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Spáinnis"
+
+msgid "Argentinian Spanish"
+msgstr "Spáinnis na hAirgintíne"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "Spáinnis Mheicsiceo "
+
+msgid "Nicaraguan Spanish"
+msgstr "Spáinnis Nicearagua"
+
+msgid "Venezuelan Spanish"
+msgstr "Spáinnis Veiniséalach"
+
+msgid "Estonian"
+msgstr "Eastóinis"
+
+msgid "Basque"
+msgstr "Bascais"
+
+msgid "Persian"
+msgstr "Peirsis"
+
+msgid "Finnish"
+msgstr "Fionlainnis"
+
+msgid "French"
+msgstr "Fraincis"
+
+msgid "Frisian"
+msgstr "Freaslainnis"
+
+msgid "Irish"
+msgstr "Gaeilge"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Gailísis"
+
+msgid "Hebrew"
+msgstr "Eabhrais"
+
+msgid "Hindi"
+msgstr "Hiondúis"
+
+msgid "Croatian"
+msgstr "Cróitis"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Ungáiris"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Indinéisis"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Íoslainnis"
+
+msgid "Italian"
+msgstr "Iodáilis"
+
+msgid "Japanese"
+msgstr "Seapáinis"
+
+msgid "Georgian"
+msgstr "Seoirsis"
+
+msgid "Kazakh"
+msgstr "Casaicis"
+
+msgid "Khmer"
+msgstr "Ciméiris"
+
+msgid "Kannada"
+msgstr "Cannadais"
+
+msgid "Korean"
+msgstr "Cóiréis"
+
+msgid "Luxembourgish"
+msgstr "Lucsamburgach"
+
+msgid "Lithuanian"
+msgstr "Liotuáinis"
+
+msgid "Latvian"
+msgstr "Laitvis"
+
+msgid "Macedonian"
+msgstr "Macadóinis"
+
+msgid "Malayalam"
+msgstr "Mailéalaimis"
+
+msgid "Mongolian"
+msgstr "Mongóilis"
+
+msgid "Marathi"
+msgstr "Maraitis"
+
+msgid "Burmese"
+msgstr "Burmais"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Neipeailis"
+
+msgid "Dutch"
+msgstr "Ollainnis"
+
+msgid "Norwegian Nynorsk"
+msgstr "Ioruais Nynorsk"
+
+msgid "Ossetic"
+msgstr "Oiséitis"
+
+msgid "Punjabi"
+msgstr "Puinseáibis"
+
+msgid "Polish"
+msgstr "Polainnis"
+
+msgid "Portuguese"
+msgstr "Portaingéilis"
+
+msgid "Brazilian Portuguese"
+msgstr "Portaingéilis na Brasaíle"
+
+msgid "Romanian"
+msgstr "Rómáinis"
+
+msgid "Russian"
+msgstr "Rúisis"
+
+msgid "Slovak"
+msgstr "Slóvaicis"
+
+msgid "Slovenian"
+msgstr "Slóivéinis"
+
+msgid "Albanian"
+msgstr "Albáinis"
+
+msgid "Serbian"
+msgstr "Seirbis"
+
+msgid "Serbian Latin"
+msgstr "Seirbis (Laidineach)"
+
+msgid "Swedish"
+msgstr "Sualainnis"
+
+msgid "Swahili"
+msgstr ""
+
+msgid "Tamil"
+msgstr "Tamailis"
+
+msgid "Telugu"
+msgstr "Teileagúis"
+
+msgid "Thai"
+msgstr "Téalainnis"
+
+msgid "Turkish"
+msgstr "Tuircis"
+
+msgid "Tatar"
+msgstr ""
+
+msgid "Udmurt"
+msgstr ""
+
+msgid "Ukrainian"
+msgstr "Úcráinis"
+
+msgid "Urdu"
+msgstr "Urdais"
+
+msgid "Vietnamese"
+msgstr "Vítneamais"
+
+msgid "Simplified Chinese"
+msgstr "Sínis Simplithe"
+
+msgid "Traditional Chinese"
+msgstr "Sínis Traidisiúnta"
+
+msgid "Messages"
+msgstr "Teachtaireachtaí"
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr "Comhaid Statach"
+
+msgid "Syndication"
+msgstr "Sindeacáitiú"
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Iontráil luach bailí"
+
+msgid "Enter a valid URL."
+msgstr "Iontráil URL bailí."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr ""
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Iontráil 'slug' bailí a chuimsíonn litreacha, uimhreacha, fostríoca nó "
+"fleiscíní."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Iontráil seoladh IPv4 bailí."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Cuir seoladh bailí IPv6 isteach."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Cuir seoladh bailí IPv4 nó IPv6 isteach."
+
+msgid "Enter only digits separated by commas."
+msgstr "Ná hiontráil ach digití atá deighilte le camóga."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Cinntigh go bhfuil an luach seo %(limit_value)s (tá sé %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+"Cinntigh go bhfuil an luach seo níos lú ná nó cothrom le %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Cinntigh go bhfuil an luach seo níos mó ná nó cothrom le %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "agus"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "Ní cheadaítear luach nialasach sa réimse seo."
+
+msgid "This field cannot be blank."
+msgstr "Ní cheadaítear luach nialasach sa réimse seo."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Tá %(model_name)s leis an %(field_label)s seo ann cheana."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Réimse de Cineál: %(field_type)s"
+
+msgid "Integer"
+msgstr "Slánuimhir"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Mór (8 byte) slánuimhi"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Boole"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Teaghrán (suas go %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Slánuimhireacha camóg-scartha"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Dáta (gan am)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Dáta (le am)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Uimhir deachúlach"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr "Fad"
+
+msgid "Email address"
+msgstr "R-phost"
+
+msgid "File path"
+msgstr "Conair comhaid"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Snámhphointe"
+
+msgid "IPv4 address"
+msgstr "Seoladh IPv4"
+
+msgid "IP address"
+msgstr "Seoladh IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Boole (Fíor, Bréagach nó Dada)"
+
+msgid "Positive integer"
+msgstr "Slánuimhir dearfach"
+
+msgid "Positive small integer"
+msgstr "Slánuimhir beag dearfach"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (suas go %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Slánuimhir beag"
+
+msgid "Text"
+msgstr "Téacs"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Am"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "Comhaid"
+
+msgid "Image"
+msgstr "Íomhá"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Eochair Eachtracha (cineál a chinnfear de réir réimse a bhaineann)"
+
+msgid "One-to-one relationship"
+msgstr "Duine-le-duine caidreamh"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Go leor le go leor caidreamh"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Tá an réimse seo riachtanach."
+
+msgid "Enter a whole number."
+msgstr "Iontráil slánuimhir."
+
+msgid "Enter a number."
+msgstr "Iontráil uimhir."
+
+msgid "Enter a valid date."
+msgstr "Iontráil dáta bailí."
+
+msgid "Enter a valid time."
+msgstr "Iontráil am bailí."
+
+msgid "Enter a valid date/time."
+msgstr "Iontráil dáta/am bailí."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Níor seoladh comhad. Deimhnigh cineál an ionchódaithe ar an bhfoirm."
+
+msgid "No file was submitted."
+msgstr "Níor seoladh aon chomhad."
+
+msgid "The submitted file is empty."
+msgstr "Tá an comhad a seoladh folamh."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Cuir ceachtar isteach comhad nó an ticbhosca soiléir, ní féidir an dá "
+"sheiceáil."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Uasluchtaigh íomhá bhailí. Níorbh íomhá é an comhad a d'uasluchtaigh tú, nó "
+"b'íomhá thruaillithe é."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Déan rogha bhailí. Ní ceann de na roghanna é %(value)s."
+
+msgid "Enter a list of values."
+msgstr "Cuir liosta de luachanna isteach."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Order"
+msgstr "Ord"
+
+msgid "Delete"
+msgstr "Scrios"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Le do thoil ceartaigh an sonra dúbail le %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Ceart le do thoil na sonraí a dhúbailt le haghaidh %(field)s, chaithfidh a "
+"bheith uathúil."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Ceart le do thoil na sonraí a dhúbailt le haghaidh %(field_name)s ní mór a "
+"bheith uaithúil le haghaidh an %(lookup)s i %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Le do thoil ceartaigh na luachanna dúbail thíos."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Déan rogha bhailí. Ní ceann de na roghanna é do roghasa."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"Ní féidir an %(datetime)s a léirmhíniú i gcrios ama %(current_timezone)s; "
+"B'fhéidir go bhfuil sé débhríoch nó nach bhfuil sé ann."
+
+msgid "Clear"
+msgstr "Glan"
+
+msgid "Currently"
+msgstr "Faoi láthair"
+
+msgid "Change"
+msgstr "Athraigh"
+
+msgid "Unknown"
+msgstr "Anaithnid"
+
+msgid "Yes"
+msgstr "Tá"
+
+msgid "No"
+msgstr "Níl"
+
+msgid "yes,no,maybe"
+msgstr "tá, níl, b'fhéidir"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bheart"
+msgstr[1] "%(size)d bheart"
+msgstr[2] "%(size)d bheart"
+msgstr[3] "%(size)d mbeart"
+msgstr[4] "%(size)d beart"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "i.n."
+
+msgid "a.m."
+msgstr "r.n."
+
+msgid "PM"
+msgstr "IN"
+
+msgid "AM"
+msgstr "RN"
+
+msgid "midnight"
+msgstr "meán oíche"
+
+msgid "noon"
+msgstr "nóin"
+
+msgid "Monday"
+msgstr "Dé Luain"
+
+msgid "Tuesday"
+msgstr "Dé Máirt"
+
+msgid "Wednesday"
+msgstr "Dé Céadaoin"
+
+msgid "Thursday"
+msgstr "Déardaoin"
+
+msgid "Friday"
+msgstr "Dé hAoine"
+
+msgid "Saturday"
+msgstr "Dé Sathairn"
+
+msgid "Sunday"
+msgstr "Dé Domhnaigh"
+
+msgid "Mon"
+msgstr "L"
+
+msgid "Tue"
+msgstr "M"
+
+msgid "Wed"
+msgstr "C"
+
+msgid "Thu"
+msgstr "D"
+
+msgid "Fri"
+msgstr "A"
+
+msgid "Sat"
+msgstr "S"
+
+msgid "Sun"
+msgstr "D"
+
+msgid "January"
+msgstr "Eanáir"
+
+msgid "February"
+msgstr "Feabhra"
+
+msgid "March"
+msgstr "Márta"
+
+msgid "April"
+msgstr "Aibreán"
+
+msgid "May"
+msgstr "Bealtaine"
+
+msgid "June"
+msgstr "Meitheamh"
+
+msgid "July"
+msgstr "Iúil"
+
+msgid "August"
+msgstr "Lúnasa"
+
+msgid "September"
+msgstr "Meán Fómhair"
+
+msgid "October"
+msgstr "Deireadh Fómhair"
+
+msgid "November"
+msgstr "Samhain"
+
+msgid "December"
+msgstr "Nollaig"
+
+msgid "jan"
+msgstr "ean"
+
+msgid "feb"
+msgstr "feabh"
+
+msgid "mar"
+msgstr "márta"
+
+msgid "apr"
+msgstr "aib"
+
+msgid "may"
+msgstr "beal"
+
+msgid "jun"
+msgstr "meith"
+
+msgid "jul"
+msgstr "iúil"
+
+msgid "aug"
+msgstr "lún"
+
+msgid "sep"
+msgstr "mfómh"
+
+msgid "oct"
+msgstr "dfómh"
+
+msgid "nov"
+msgstr "samh"
+
+msgid "dec"
+msgstr "noll"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Ean."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Feabh."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Márta"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Aib."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Beal."
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Meith."
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Iúil"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Lún."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "MFómh."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "DFómh."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Samh."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Noll."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Mí Eanáir"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "Mí Feabhra"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Mí na Márta"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "Mí Aibreáin"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "Mí na Bealtaine"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "Mí an Mheithimh"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "Mí Iúil"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "Mí Lúnasa"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "Mí Mheán Fómhair"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "Mí Dheireadh Fómhair"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "Mí na Samhna"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "Mí na Nollag"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "nó"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d nóiméad"
+msgstr[1] "%d nóiméad"
+msgstr[2] "%d nóiméad"
+msgstr[3] "%d nóiméad"
+msgstr[4] "%d nóiméad"
+
+msgid "0 minutes"
+msgstr "0 nóiméad"
+
+msgid "Forbidden"
+msgstr "Toirmiscthe"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr "Tá tuilleadh eolais ar fáil le DEBUG=True."
+
+msgid "No year specified"
+msgstr "Bliain gan sonrú"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Mí gan sonrú"
+
+msgid "No day specified"
+msgstr "Lá gan sonrú"
+
+msgid "No week specified"
+msgstr "Seachtain gan sonrú"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Gan %(verbose_name_plural)s ar fáil"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Níl %(verbose_name_plural)s sa todhchaí ar fáil mar tá %(class_name)s."
+"allow_future Bréagach."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Teaghrán dáta neamhbhailí '%(datestr)s' nuair formáid '%(format)s' á húsáid"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Níl bhfuarthas %(verbose_name)s le hadhaigh an iarratas"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"Ní 'deireanach' é an leathanach, agus ní féidir é a thiontú go slánuimhir."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Leathanach neamhbhailí (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "Liosta folamh agus tá '%(class_name)s .allow_empty' Bréagach."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Níl innéacsanna chomhadlann cheadaítear anseo."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "Níl %(path)s ann."
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Innéacs de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..c9ea8d0
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..1bdfde4
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/formats.py
new file mode 100644
index 0000000..e47d873
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/ga/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F Y'
+TIME_FORMAT = 'H:i'
+# DATETIME_FORMAT =
+# YEAR_MONTH_FORMAT =
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'j M Y'
+# SHORT_DATETIME_FORMAT =
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..63f8547
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po
new file mode 100644
index 0000000..315ab61
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po
@@ -0,0 +1,1331 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Michael Bauer, 2014
+# GunChleoc, 2015-2017
+# GunChleoc, 2015
+# GunChleoc, 2014-2015
+# Michael Bauer, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 06:41+0000\n"
+"Last-Translator: GunChleoc\n"
+"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/"
+"language/gd/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gd\n"
+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
+"(n > 2 && n < 20) ? 2 : 3;\n"
+
+msgid "Afrikaans"
+msgstr "Afraganais"
+
+msgid "Arabic"
+msgstr "Arabais"
+
+msgid "Asturian"
+msgstr "Astùrais"
+
+msgid "Azerbaijani"
+msgstr "Asarbaideànais"
+
+msgid "Bulgarian"
+msgstr "Bulgarais"
+
+msgid "Belarusian"
+msgstr "Bealaruisis"
+
+msgid "Bengali"
+msgstr "Beangailis"
+
+msgid "Breton"
+msgstr "Breatnais"
+
+msgid "Bosnian"
+msgstr "Bosnais"
+
+msgid "Catalan"
+msgstr "Catalanais"
+
+msgid "Czech"
+msgstr "Seacais"
+
+msgid "Welsh"
+msgstr "Cuimris"
+
+msgid "Danish"
+msgstr "Danmhairgis"
+
+msgid "German"
+msgstr "Gearmailtis"
+
+msgid "Lower Sorbian"
+msgstr "Sòrbais Ìochdarach"
+
+msgid "Greek"
+msgstr "Greugais"
+
+msgid "English"
+msgstr "Beurla"
+
+msgid "Australian English"
+msgstr "Beurla Astràilia"
+
+msgid "British English"
+msgstr "Beurla Bhreatainn"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "Spàinntis"
+
+msgid "Argentinian Spanish"
+msgstr "Spàinntis na h-Argantaine"
+
+msgid "Colombian Spanish"
+msgstr "Spàinntis Choloimbia"
+
+msgid "Mexican Spanish"
+msgstr "Spàinntis Mheagsagach"
+
+msgid "Nicaraguan Spanish"
+msgstr "Spàinntis Niocaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "Spàinntis na Bheiniseala"
+
+msgid "Estonian"
+msgstr "Eastoinis"
+
+msgid "Basque"
+msgstr "Basgais"
+
+msgid "Persian"
+msgstr "Farsaidh"
+
+msgid "Finnish"
+msgstr "Fionnlannais"
+
+msgid "French"
+msgstr "Fraingis"
+
+msgid "Frisian"
+msgstr "Frìsis"
+
+msgid "Irish"
+msgstr "Gaeilge"
+
+msgid "Scottish Gaelic"
+msgstr "Gàidhlig"
+
+msgid "Galician"
+msgstr "Gailìsis"
+
+msgid "Hebrew"
+msgstr "Eabhra"
+
+msgid "Hindi"
+msgstr "Hindis"
+
+msgid "Croatian"
+msgstr "Cròthaisis"
+
+msgid "Upper Sorbian"
+msgstr "Sòrbais Uachdarach"
+
+msgid "Hungarian"
+msgstr "Ungairis"
+
+msgid "Interlingua"
+msgstr "Interlingua"
+
+msgid "Indonesian"
+msgstr "Innd-Innsis"
+
+msgid "Ido"
+msgstr "Ido"
+
+msgid "Icelandic"
+msgstr "Innis Tìlis"
+
+msgid "Italian"
+msgstr "Eadailtis"
+
+msgid "Japanese"
+msgstr "Seapanais"
+
+msgid "Georgian"
+msgstr "Cairtbheilis"
+
+msgid "Kazakh"
+msgstr "Casachais"
+
+msgid "Khmer"
+msgstr "Cmèar"
+
+msgid "Kannada"
+msgstr "Kannada"
+
+msgid "Korean"
+msgstr "Coirèanais"
+
+msgid "Luxembourgish"
+msgstr "Lugsamburgais"
+
+msgid "Lithuanian"
+msgstr "Liotuainis"
+
+msgid "Latvian"
+msgstr "Laitbheis"
+
+msgid "Macedonian"
+msgstr "Masadonais"
+
+msgid "Malayalam"
+msgstr "Malayalam"
+
+msgid "Mongolian"
+msgstr "Mongolais"
+
+msgid "Marathi"
+msgstr "Marathi"
+
+msgid "Burmese"
+msgstr "Burmais"
+
+msgid "Norwegian Bokmål"
+msgstr "Nirribhis (Bokmål)"
+
+msgid "Nepali"
+msgstr "Neapàlais"
+
+msgid "Dutch"
+msgstr "Duitsis"
+
+msgid "Norwegian Nynorsk"
+msgstr "Nirribhis (Nynorsk)"
+
+msgid "Ossetic"
+msgstr "Ossetic"
+
+msgid "Punjabi"
+msgstr "Panjabi"
+
+msgid "Polish"
+msgstr "Pòlainnis"
+
+msgid "Portuguese"
+msgstr "Portagailis"
+
+msgid "Brazilian Portuguese"
+msgstr "Portagailis Bhraisileach"
+
+msgid "Romanian"
+msgstr "Romàinis"
+
+msgid "Russian"
+msgstr "Ruisis"
+
+msgid "Slovak"
+msgstr "Slòbhacais"
+
+msgid "Slovenian"
+msgstr "Slòbhainis"
+
+msgid "Albanian"
+msgstr "Albàinis"
+
+msgid "Serbian"
+msgstr "Sèirbis"
+
+msgid "Serbian Latin"
+msgstr "Sèirbis (Laideann)"
+
+msgid "Swedish"
+msgstr "Suainis"
+
+msgid "Swahili"
+msgstr "Kiswahili"
+
+msgid "Tamil"
+msgstr "Taimilis"
+
+msgid "Telugu"
+msgstr "Telugu"
+
+msgid "Thai"
+msgstr "Tàidh"
+
+msgid "Turkish"
+msgstr "Turcais"
+
+msgid "Tatar"
+msgstr "Tatarais"
+
+msgid "Udmurt"
+msgstr "Udmurt"
+
+msgid "Ukrainian"
+msgstr "Ucràinis"
+
+msgid "Urdu"
+msgstr "Ùrdu"
+
+msgid "Vietnamese"
+msgstr "Bhiet-Namais"
+
+msgid "Simplified Chinese"
+msgstr "Sìnis Shimplichte"
+
+msgid "Traditional Chinese"
+msgstr "Sìnis Thradaiseanta"
+
+msgid "Messages"
+msgstr "Teachdaireachdan"
+
+msgid "Site Maps"
+msgstr "Mapaichean-làraich"
+
+msgid "Static Files"
+msgstr "Faidhlichean stadastaireachd"
+
+msgid "Syndication"
+msgstr "Siondacaideadh"
+
+msgid "That page number is not an integer"
+msgstr "Chan eil àireamh na duilleige seo 'na àireamh slàn"
+
+msgid "That page number is less than 1"
+msgstr "Tha àireamh na duilleige seo nas lugha na 1"
+
+msgid "That page contains no results"
+msgstr "Chan eil toradh aig an duilleag seo"
+
+msgid "Enter a valid value."
+msgstr "Cuir a-steach luach dligheach."
+
+msgid "Enter a valid URL."
+msgstr "Cuir a-steach URL dligheach."
+
+msgid "Enter a valid integer."
+msgstr "Cuir a-steach àireamh slàin dhligheach."
+
+msgid "Enter a valid email address."
+msgstr "Cuir a-steach seòladh puist-d dligheach."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Cuir a-steach “sluga” dligheach anns nach eil ach litrichean, àireamhan, fo-"
+"loidhnichean is tàthanan."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"Cuir a-steach “sluga” dligheach anns nach eil ach litrichean Unicode, "
+"àireamhan, fo-loidhnichean is tàthanan."
+
+msgid "Enter a valid IPv4 address."
+msgstr "Cuir a-steach seòladh IPv4 dligheach."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Cuir a-steach seòladh IPv6 dligheach."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Cuir a-steach seòladh IPv4 no IPv6 dligheach."
+
+msgid "Enter only digits separated by commas."
+msgstr "Na cuir a-steach ach àireamhan ’gan sgaradh le cromagan."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Dèan cinnteach gu bheil an luach seo %(limit_value)s (’s e %(show_value)s a "
+"th’ ann)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr ""
+"Dèan cinnteach gu bheil an luach seo nas lugha na no co-ionnan ri "
+"%(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr ""
+"Dèan cinnteach gu bheil an luach seo nas motha na no co-ionnan ri "
+"%(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ "
+"char as lugha (tha %(show_value)d aige an-dràsta)."
+msgstr[1] ""
+"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ "
+"char as lugha (tha %(show_value)d aige an-dràsta)."
+msgstr[2] ""
+"Dèan cinnteach gu bheil %(limit_value)d caractaran aig an luach seo air a’ "
+"char as lugha (tha %(show_value)d aige an-dràsta)."
+msgstr[3] ""
+"Dèan cinnteach gu bheil %(limit_value)d caractar aig an luach seo air a’ "
+"char as lugha (tha %(show_value)d aige an-dràsta)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ "
+"char as motha (tha %(show_value)d aige an-dràsta)."
+msgstr[1] ""
+"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ "
+"char as motha (tha %(show_value)d aige an-dràsta)."
+msgstr[2] ""
+"Dèan cinnteach gu bheil %(limit_value)d caractaran aig an luach seo air a’ "
+"char as motha (tha %(show_value)d aige an-dràsta)."
+msgstr[3] ""
+"Dèan cinnteach gu bheil %(limit_value)d caractar aig an luach seo air a’ "
+"char as motha (tha %(show_value)d aige an-dràsta)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan."
+msgstr[1] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan."
+msgstr[2] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamhan ann gu h-iomlan."
+msgstr[3] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann."
+msgstr[1] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann."
+msgstr[2] "Dèan cinnteach nach eil barrachd air %(max)s ionadan deicheach ann."
+msgstr[3] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing "
+"dheicheach."
+msgstr[1] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing "
+"dheicheach."
+msgstr[2] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamhan ann ron phuing "
+"dheicheach."
+msgstr[3] ""
+"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing "
+"dheicheach."
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"Chan eil an leudachan faidhle \"%(extension)s\" ceadaichte. Seo na "
+"leudachain a tha ceadaichte: \"%(allowed_extensions)s\"."
+
+msgid "Null characters are not allowed."
+msgstr "Chan eil caractaran null ceadaichte."
+
+msgid "and"
+msgstr "agus"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "Tha %(model_name)s lis a’ %(field_labels)s seo ann mar-thà."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "Chan eil an luach %(value)r ’na roghainn dhligheach."
+
+msgid "This field cannot be null."
+msgstr "Chan fhaod an raon seo a bhith ’na neoni."
+
+msgid "This field cannot be blank."
+msgstr "Chan fhaod an raon seo a bhith bàn."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "Tha %(model_name)s leis a’ %(field_label)s seo ann mar-thà."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"Chan fhaod %(field_label)s a bhith ann ach aon turas airson "
+"%(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Raon dhen t-seòrsa: %(field_type)s"
+
+msgid "Integer"
+msgstr "Àireamh shlàn"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "Feumaidh “%(value)s” a bhith ’na àireamh shlàn."
+
+msgid "Big (8 byte) integer"
+msgstr "Mòr-àireamh shlàn (8 baidht)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "Feumaidh “%(value)s” a bhith True no False."
+
+msgid "Boolean (Either True or False)"
+msgstr "Booleach (True no False)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Sreang (suas ri %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Àireamhan slàna sgaraichte le cromagan"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"Tha fòrmat cinn-là mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith "
+"san fhòrmat BBBB-MM-LL."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+"Tha fòrmat mar bu chòir (BBBB-MM-LL) aig an luach “%(value)s” ach tha an "
+"ceann-là mì-dligheach."
+
+msgid "Date (without time)"
+msgstr "Ceann-là (gun àm)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san "
+"fhòrmat BBBB-MM-LL HH:MM[:dd[.uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"Tha fòrmat mar bu chòir (BBBB-MM-LL HH:MM[:dd[.uuuuuu]][TZ]) aig an luach "
+"“%(value)s” ach tha an ceann-là/an t-àm mì-dligheach."
+
+msgid "Date (with time)"
+msgstr "Ceann-là (le àm)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "Feumaidh “%(value)s” a bhith ’na àireamh dheicheach."
+
+msgid "Decimal number"
+msgstr "Àireamh dheicheach"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san "
+"fhòrmat [DD] [HH:[MM:]]dd[.uuuuuu]."
+
+msgid "Duration"
+msgstr "Faid"
+
+msgid "Email address"
+msgstr "Seòladh puist-d"
+
+msgid "File path"
+msgstr "Slighe an fhaidhle"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "Feumaidh “%(value)s” a bhith ’na àireamh floid."
+
+msgid "Floating point number"
+msgstr "Àireamh le puing floid."
+
+msgid "IPv4 address"
+msgstr "Seòladh IPv4"
+
+msgid "IP address"
+msgstr "Seòladh IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "Feumaidh “%(value)s” a bhith None, True no False."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleach (True, False no None)"
+
+msgid "Positive integer"
+msgstr "Àireamh shlàn dhearbh"
+
+msgid "Positive small integer"
+msgstr "Beag-àireamh shlàn dhearbh"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Sluga (suas ri %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Beag-àireamh slàn"
+
+msgid "Text"
+msgstr "Teacsa"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san "
+"fhòrmat HH:MM[:dd[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"Tha fòrmat mar bu chòir (HH:MM[:dd[.uuuuuu]]) aig an luach “%(value)s” ach "
+"tha an t-àm mì-dligheach."
+
+msgid "Time"
+msgstr "Àm"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Dàta bìnearaidh amh"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "Chan eil “%(value)s” ’na UUID dligheach."
+
+msgid "File"
+msgstr "Faidhle"
+
+msgid "Image"
+msgstr "Dealbh"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "Chan eil ionstans dhe %(model)s le %(field)s %(value)r ann."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr ""
+" \t\n"
+"Iuchair chèin (thèid a sheòrsa a mhìneachadh leis an raon dàimheach)"
+
+msgid "One-to-one relationship"
+msgstr "Dàimh aonan gu aonan"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "Daimh %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "Daimhean %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "Dàimh iomadh rud gu iomadh rud"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Tha an raon seo riatanach."
+
+msgid "Enter a whole number."
+msgstr "Cuir a-steach àireamh shlàn."
+
+msgid "Enter a number."
+msgstr "Cuir a-steach àireamh."
+
+msgid "Enter a valid date."
+msgstr "Cuir a-steach ceann-là dligheach."
+
+msgid "Enter a valid time."
+msgstr "Cuir a-steach àm dligheach."
+
+msgid "Enter a valid date/time."
+msgstr "Cuir a-steach ceann-là ’s àm dligheach."
+
+msgid "Enter a valid duration."
+msgstr "Cuir a-steach faid dhligheach."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Cha deach faidhle a chur a-null. Dearbhaich seòrsa a’ chòdachaidh air an "
+"fhoirm."
+
+msgid "No file was submitted."
+msgstr "Cha deach faidhle a chur a-null."
+
+msgid "The submitted file is empty."
+msgstr "Tha am faidhle a chaidh a chur a-null falamh."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+"Dèan cinnteach nach eil barrachd air %(max)d charactar ann an ainm an "
+"fhaidhle (tha %(length)d aige)."
+msgstr[1] ""
+"Dèan cinnteach nach eil barrachd air %(max)d charactar ann an ainm an "
+"fhaidhle (tha %(length)d aige)."
+msgstr[2] ""
+"Dèan cinnteach nach eil barrachd air %(max)d caractaran ann an ainm an "
+"fhaidhle (tha %(length)d aige)."
+msgstr[3] ""
+"Dèan cinnteach nach eil barrachd air %(max)d caractar ann an ainm an "
+"fhaidhle (tha %(length)d aige)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Cuir a-null faidhle no cuir cromag sa bhogsa fhalamh, na dèan an dà chuidh "
+"dhiubh."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Luchdaich suas dealbh dligheach. Cha robh am faidhle a luchdaich thu suas "
+"’na dhealbh no bha an dealbh coirbte."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Tagh rud dligheach. Chan eil %(value)s ’na roghainn dhut."
+
+msgid "Enter a list of values."
+msgstr "Cuir a-steach liosta de luachan."
+
+msgid "Enter a complete value."
+msgstr "Cuir a-steach luach slàn."
+
+msgid "Enter a valid UUID."
+msgstr "Cuir a-steach UUID dligheach."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(Raon falaichte %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "Tha dàta an fhoirm stiùiridh a dhìth no chaidh beantainn ris"
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "Cuir a-null %d fhoirm no nas lugha dhiubh."
+msgstr[1] "Cuir a-null %d fhoirm no nas lugha dhiubh."
+msgstr[2] "Cuir a-null %d foirmean no nas lugha dhiubh."
+msgstr[3] "Cuir a-null %d foirm no nas lugha dhiubh."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "Cuir a-null %d fhoirm no barrachd dhiubh."
+msgstr[1] "Cuir a-null %d fhoirm no barrachd dhiubh."
+msgstr[2] "Cuir a-null %d foirmean no barrachd dhiubh."
+msgstr[3] "Cuir a-null %d foirm no barrachd dhiubh."
+
+msgid "Order"
+msgstr "Òrdugh"
+
+msgid "Delete"
+msgstr "Sguab às"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Ceartaich an dàta dùblaichte airson %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr ""
+"Ceartaich an dàta dùblaichte airson %(field)s, chan fhaod gach nì a bhith "
+"ann ach aon turas."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Ceartaich an dàta dùblaichte airson %(field_name)s nach fhaod a bhith ann "
+"ach aon turas airson %(lookup)s ann an %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Ceartaich na luachan dùblaichte gu h-ìosal."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+"Chan eil an luach am broinn na loidhne a’ freagairt ris an ionstans-pàraint."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Tagh rud dligheach. Chan eil an rud seo ’na roghainn dhut."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "Chan e luach dligheach a tha ann an “%(pk)s”."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"Cha chiall dha %(datetime)s san roinn-tìde %(current_timezone)s; dh’fhaoidte "
+"gu bheil e dà-sheaghach no nach eil e ann."
+
+msgid "Clear"
+msgstr "Falamhaich"
+
+msgid "Currently"
+msgstr "An-dràsta"
+
+msgid "Change"
+msgstr "Atharraich"
+
+msgid "Unknown"
+msgstr "Chan eil fhios"
+
+msgid "Yes"
+msgstr "Tha"
+
+msgid "No"
+msgstr "Chan eil"
+
+msgid "yes,no,maybe"
+msgstr "yes,no,maybe"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d baidht"
+msgstr[1] "%(size)d baidht"
+msgstr[2] "%(size)d baidht"
+msgstr[3] "%(size)d baidht"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "f"
+
+msgid "a.m."
+msgstr "m"
+
+msgid "PM"
+msgstr "f"
+
+msgid "AM"
+msgstr "m"
+
+msgid "midnight"
+msgstr "meadhan-oidhche"
+
+msgid "noon"
+msgstr "meadhan-latha"
+
+msgid "Monday"
+msgstr "DiLuain"
+
+msgid "Tuesday"
+msgstr "DiMàirt"
+
+msgid "Wednesday"
+msgstr "DiCiadain"
+
+msgid "Thursday"
+msgstr "DiarDaoin"
+
+msgid "Friday"
+msgstr "DihAoine"
+
+msgid "Saturday"
+msgstr "DiSathairne"
+
+msgid "Sunday"
+msgstr "DiDòmhnaich"
+
+msgid "Mon"
+msgstr "DiL"
+
+msgid "Tue"
+msgstr "DiM"
+
+msgid "Wed"
+msgstr "DiC"
+
+msgid "Thu"
+msgstr "Dia"
+
+msgid "Fri"
+msgstr "Dih"
+
+msgid "Sat"
+msgstr "DiS"
+
+msgid "Sun"
+msgstr "DiD"
+
+msgid "January"
+msgstr "Am Faoilleach"
+
+msgid "February"
+msgstr "An Gearran"
+
+msgid "March"
+msgstr "Am Màrt"
+
+msgid "April"
+msgstr "An Giblean"
+
+msgid "May"
+msgstr "An Cèitean"
+
+msgid "June"
+msgstr "An t-Ògmhios"
+
+msgid "July"
+msgstr "An t-Iuchar"
+
+msgid "August"
+msgstr "An Lùnastal"
+
+msgid "September"
+msgstr "An t-Sultain"
+
+msgid "October"
+msgstr "An Dàmhair"
+
+msgid "November"
+msgstr "An t-Samhain"
+
+msgid "December"
+msgstr "An Dùbhlachd"
+
+msgid "jan"
+msgstr "faoi"
+
+msgid "feb"
+msgstr "gearr"
+
+msgid "mar"
+msgstr "màrt"
+
+msgid "apr"
+msgstr "gibl"
+
+msgid "may"
+msgstr "cèit"
+
+msgid "jun"
+msgstr "ògmh"
+
+msgid "jul"
+msgstr "iuch"
+
+msgid "aug"
+msgstr "lùna"
+
+msgid "sep"
+msgstr "sult"
+
+msgid "oct"
+msgstr "dàmh"
+
+msgid "nov"
+msgstr "samh"
+
+msgid "dec"
+msgstr "dùbh"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "Faoi"
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "Gearr"
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "Màrt"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "Gibl"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "Cèit"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "Ògmh"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "Iuch"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "Lùna"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "Sult"
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "Dàmh"
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "Samh"
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "Dùbh"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "Am Faoilleach"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "An Gearran"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "Am Màrt"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "An Giblean"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "An Cèitean"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "An t-Ògmhios"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "An t-Iuchar"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "An Lùnastal"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "An t-Sultain"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "An Dàmhair"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "An t-Samhain"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "An Dùbhlachd"
+
+msgid "This is not a valid IPv6 address."
+msgstr "Chan eil seo ’na sheòladh IPv6 dligheach."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "no"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d bhliadhna"
+msgstr[1] "%d bhliadhna"
+msgstr[2] "%d bliadhnaichean"
+msgstr[3] "%d bliadhna"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mhìos"
+msgstr[1] "%d mhìos"
+msgstr[2] "%d mìosan"
+msgstr[3] "%d mìos"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d seachdain"
+msgstr[1] "%d sheachdain"
+msgstr[2] "%d seachdainean"
+msgstr[3] "%d seachdain"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d latha"
+msgstr[1] "%d latha"
+msgstr[2] "%d làithean"
+msgstr[3] "%d latha"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d uair"
+msgstr[1] "%d uair"
+msgstr[2] "%d uairean"
+msgstr[3] "%d uair"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d mhionaid"
+msgstr[1] "%d mhionaid"
+msgstr[2] "%d mionaidean"
+msgstr[3] "%d mionaid"
+
+msgid "0 minutes"
+msgstr "0 mionaid"
+
+msgid "Forbidden"
+msgstr "Toirmisgte"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "Dh’fhàillig le dearbhadh CSRF. chaidh sgur dhen iarrtas."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"Chì thu an teachdaireachd seo air sgàth ’s gu bheil an làrach-lìn HTTPS seo "
+"ag iarraidh air a’ bhrabhsair-lìn agad gun cuir e bann-cinn “Referer” thuice "
+"ach cha deach gin a chur a-null. Tha feum air a’ bhann-chinn seo a chum "
+"tèarainteachd ach nach cleachd treas-phàrtaidh am brabhsair agad gu droch-"
+"rùnach."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"Ma rèitich thu am brabhsair agad ach an cuir e bannan-cinn “Referer” à "
+"comas, cuir an comas iad a-rithist, co-dhiù airson na làraich seo no airson "
+"ceanglaichean HTTPS no airson iarrtasan “same-origin”."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"Ma tha thu a’ cleachdadh taga no a’ gabhail a-staigh bann-cinn “'Referrer-Policy: no-referrer” feuch "
+"an doir thu air falbh iad. Iarraidh an dìon CSRF bann-cinn “Referer” gus na "
+"referers a dhearbhadh gu teann. Ma tha thu iomagaineach a thaobh do "
+"prìobhaideachd, cleachd roghainnean eile mar "
+"airson ceangal gu làraichean-lìn threas-phàrtaidhean."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"Chì thu an teachdaireachd seo air sgàth ’s gu bheil an làrach-lìn seo ag "
+"iarraidh briosgaid CSRF nuair a chuireas tu foirm a-null. Tha feum air a’ "
+"bhriosgaid seo a chum tèarainteachd ach nach cleachd treas-phàrtaidh am "
+"brabhsair agad gu droch-rùnach."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"Ma rèitich thu am brabhsair agad ach an cuir e briosgaidean à comas, cuir an "
+"comas iad a-rithist, co-dhiù airson na làraich seo no airson iarrtasan “same-"
+"origin”."
+
+msgid "More information is available with DEBUG=True."
+msgstr "Gheibh thu barrachd fiosrachaidh le DEBUG=True."
+
+msgid "No year specified"
+msgstr "Cha deach bliadhna a shònrachadh"
+
+msgid "Date out of range"
+msgstr "Tha ceann-là taobh thar na rainse"
+
+msgid "No month specified"
+msgstr "Cha deach mìos a shònrachadh"
+
+msgid "No day specified"
+msgstr "Cha deach latha a shònrachadh"
+
+msgid "No week specified"
+msgstr "Cha deach seachdain a shònrachadh"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Chan eil %(verbose_name_plural)s ri fhaighinn"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Chan eil %(verbose_name_plural)s san àm ri teachd ri fhaighinn air sgàth ’s "
+"gun deach %(class_name)s.allow_future a shuidheachadh air False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr ""
+"Sreang cinn-là “%(datestr)s” mì-dhligheach airson an fhòrmait “%(format)s”"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Cha deach %(verbose_name)s a lorg a fhreagras dhan cheist"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr ""
+"Chan eil an duilleag ’na “last” is cha ghabh a h-iompachadh gu àireamh shlàn."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Duilleag mhì-dhligheach (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr ""
+"Tha liosta fhalamh ann agus chaidh “%(class_name)s.allow_empty” a "
+"shuidheachadh air False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Chan eil clàran-amais pasgain falamh ceadaichte an-seo."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "Chan eil “%(path)s” ann"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Clàr-amais dhe %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: am frèam-obrach-lìn leis a choileanas foirfichean cinn-ama."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"Seall na nòtaichean sgaoilidh airson Django "
+"%(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "Chaidh a stàladh! Meal do naidheachd!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"Chì thu an duilleag seo on a tha DEBUG=True ann am faidhle nan roghainnean agad agus cha do rèitich "
+"thu URL sam bith fhathast."
+
+msgid "Django Documentation"
+msgstr "Docamaideadh Django"
+
+msgid "Topics, references, & how-to's"
+msgstr "Cuspairean, iomraidhean ⁊ treòirichean"
+
+msgid "Tutorial: A Polling App"
+msgstr "Oideachadh: Aplacaid cunntais-bheachd"
+
+msgid "Get started with Django"
+msgstr "Dèan toiseach-tòiseachaidh le Django"
+
+msgid "Django Community"
+msgstr "Coimhearsnachd Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "Dèan ceangal, faigh taic no cuidich"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..7a6f39c
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..71880f4
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/formats.py
new file mode 100644
index 0000000..4a2db23
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gd/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F Y'
+TIME_FORMAT = 'h:ia'
+DATETIME_FORMAT = 'j F Y h:ia'
+# YEAR_MONTH_FORMAT =
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'j M Y'
+SHORT_DATETIME_FORMAT = 'j M Y h:ia'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1845798
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..efdfd38
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po
@@ -0,0 +1,1208 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# fasouto , 2011-2012
+# fonso , 2011,2013
+# fonso , 2013
+# fasouto , 2017
+# Jannis Leidel , 2011
+# Leandro Regueiro , 2013
+# Oscar Carballal , 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Galician (http://www.transifex.com/django/django/language/"
+"gl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "africáner"
+
+msgid "Arabic"
+msgstr "Árabe"
+
+msgid "Asturian"
+msgstr "Asturiano"
+
+msgid "Azerbaijani"
+msgstr "azerí"
+
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+msgid "Belarusian"
+msgstr "Bielorruso"
+
+msgid "Bengali"
+msgstr "Bengalí"
+
+msgid "Breton"
+msgstr "Bretón"
+
+msgid "Bosnian"
+msgstr "bosníaco"
+
+msgid "Catalan"
+msgstr "Catalán"
+
+msgid "Czech"
+msgstr "Checo"
+
+msgid "Welsh"
+msgstr "Galés"
+
+msgid "Danish"
+msgstr "Dinamarqués"
+
+msgid "German"
+msgstr "Alemán"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "Grego"
+
+msgid "English"
+msgstr "Inglés"
+
+msgid "Australian English"
+msgstr "Inglés australiano"
+
+msgid "British English"
+msgstr "inglés británico"
+
+msgid "Esperanto"
+msgstr "Esperanto"
+
+msgid "Spanish"
+msgstr "español"
+
+msgid "Argentinian Spanish"
+msgstr "español da Arxentina"
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "español de México"
+
+msgid "Nicaraguan Spanish"
+msgstr "español de Nicaragua"
+
+msgid "Venezuelan Spanish"
+msgstr "español de Venezuela"
+
+msgid "Estonian"
+msgstr "estoniano"
+
+msgid "Basque"
+msgstr "vasco"
+
+msgid "Persian"
+msgstr "Persa"
+
+msgid "Finnish"
+msgstr "finés"
+
+msgid "French"
+msgstr "Francés"
+
+msgid "Frisian"
+msgstr "Frisón"
+
+msgid "Irish"
+msgstr "irlandés"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "Galego"
+
+msgid "Hebrew"
+msgstr "Hebreo"
+
+msgid "Hindi"
+msgstr "Hindi"
+
+msgid "Croatian"
+msgstr "croata"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "Húngaro"
+
+msgid "Interlingua"
+msgstr "interlingua"
+
+msgid "Indonesian"
+msgstr "indonesio"
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "islandés"
+
+msgid "Italian"
+msgstr "Italiano"
+
+msgid "Japanese"
+msgstr "xaponés"
+
+msgid "Georgian"
+msgstr "xeorxiano"
+
+msgid "Kazakh"
+msgstr "casaco"
+
+msgid "Khmer"
+msgstr "camboxano"
+
+msgid "Kannada"
+msgstr "canará"
+
+msgid "Korean"
+msgstr "Coreano"
+
+msgid "Luxembourgish"
+msgstr "luxemburgués"
+
+msgid "Lithuanian"
+msgstr "lituano"
+
+msgid "Latvian"
+msgstr "letón"
+
+msgid "Macedonian"
+msgstr "macedonio"
+
+msgid "Malayalam"
+msgstr "mala"
+
+msgid "Mongolian"
+msgstr "mongol"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr "birmano"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "nepalés"
+
+msgid "Dutch"
+msgstr "holandés"
+
+msgid "Norwegian Nynorsk"
+msgstr "noruegués (nynorsk)"
+
+msgid "Ossetic"
+msgstr "osetio"
+
+msgid "Punjabi"
+msgstr "panxabiano"
+
+msgid "Polish"
+msgstr "polaco"
+
+msgid "Portuguese"
+msgstr "portugués"
+
+msgid "Brazilian Portuguese"
+msgstr "portugués do Brasil"
+
+msgid "Romanian"
+msgstr "romanés"
+
+msgid "Russian"
+msgstr "ruso"
+
+msgid "Slovak"
+msgstr "eslovaco"
+
+msgid "Slovenian"
+msgstr "esloveno"
+
+msgid "Albanian"
+msgstr "albanés"
+
+msgid "Serbian"
+msgstr "serbio"
+
+msgid "Serbian Latin"
+msgstr "serbio (alfabeto latino)"
+
+msgid "Swedish"
+msgstr "sueco"
+
+msgid "Swahili"
+msgstr "suahili"
+
+msgid "Tamil"
+msgstr "támil"
+
+msgid "Telugu"
+msgstr "telugu"
+
+msgid "Thai"
+msgstr "tai"
+
+msgid "Turkish"
+msgstr "turco"
+
+msgid "Tatar"
+msgstr "tártaro"
+
+msgid "Udmurt"
+msgstr "udmurt"
+
+msgid "Ukrainian"
+msgstr "ucraíno"
+
+msgid "Urdu"
+msgstr "urdu"
+
+msgid "Vietnamese"
+msgstr "vietnamita"
+
+msgid "Simplified Chinese"
+msgstr "chinés simplificado"
+
+msgid "Traditional Chinese"
+msgstr "chinés tradicional"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "Insira un valor válido."
+
+msgid "Enter a valid URL."
+msgstr "Insira un URL válido."
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr "Insira un enderezo de correo electrónico válido."
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Insira un 'slug' valido composto por letras, números, guións baixos ou "
+"medios."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "Insira unha dirección IPv4 válida."
+
+msgid "Enter a valid IPv6 address."
+msgstr "Insira unha dirección IPv6 válida"
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "Insira unha dirección IPv4 ou IPv6 válida"
+
+msgid "Enter only digits separated by commas."
+msgstr "Insira só díxitos separados por comas."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"Asegúrese de que este valor é %(limit_value)s (agora é %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "Asegure que este valor é menor ou igual a %(limit_value)s."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "Asegure que este valor é maior ou igual a %(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "Asegure que non hai mais de %(max)s díxito en total."
+msgstr[1] "Asegure que non hai mais de %(max)s díxitos en total."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "e"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "O valor %(value)r non é unha opción válida."
+
+msgid "This field cannot be null."
+msgstr "Este campo non pode ser nulo."
+
+msgid "This field cannot be blank."
+msgstr "Este campo non pode estar baleiro."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr ""
+"Xa existe un modelo %(model_name)s coa etiqueta de campo %(field_label)s."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "Campo de tipo: %(field_type)s"
+
+msgid "Integer"
+msgstr "Número enteiro"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "Enteiro grande (8 bytes)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "Valor booleano (verdadeiro ou falso)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadea (máximo %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "Números enteiros separados por comas"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "Data (sen a hora)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "Data (coa hora)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "Enderezo electrónico"
+
+msgid "File path"
+msgstr "Ruta de ficheiro"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "Número en coma flotante"
+
+msgid "IPv4 address"
+msgstr "Enderezo IPv4"
+
+msgid "IP address"
+msgstr "Enderezo IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (verdadeiro, falso ou ningún)"
+
+msgid "Positive integer"
+msgstr "Numero enteiro positivo"
+
+msgid "Positive small integer"
+msgstr "Enteiro pequeno positivo"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (ata %(max_length)s)"
+
+msgid "Small integer"
+msgstr "Enteiro pequeno"
+
+msgid "Text"
+msgstr "Texto"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "Hora"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "Datos binarios en bruto"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "Ficheiro"
+
+msgid "Image"
+msgstr "Imaxe"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Clave Estranxeira (tipo determinado por un campo relacionado)"
+
+msgid "One-to-one relationship"
+msgstr "Relación un a un"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "Relación moitos a moitos"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "Requírese este campo."
+
+msgid "Enter a whole number."
+msgstr "Insira un número enteiro."
+
+msgid "Enter a number."
+msgstr "Insira un número."
+
+msgid "Enter a valid date."
+msgstr "Insira unha data válida."
+
+msgid "Enter a valid time."
+msgstr "Insira unha hora válida."
+
+msgid "Enter a valid date/time."
+msgstr "Insira unha data/hora válida."
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Non se enviou ficheiro ningún. Comprobe o tipo de codificación do formulario."
+
+msgid "No file was submitted."
+msgstr "Non se enviou ficheiro ningún."
+
+msgid "The submitted file is empty."
+msgstr "O ficheiro enviado está baleiro."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr ""
+"Ou ben envíe un ficheiro, ou ben marque a casilla de eliminar, pero non "
+"ambas as dúas cousas."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Suba unha imaxe válida. O ficheiro subido non era unha imaxe ou esta estaba "
+"corrupta."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Escolla unha opción válida. %(value)s non se atopa entre as opcións "
+"dispoñibles."
+
+msgid "Enter a list of values."
+msgstr "Insira unha lista de valores."
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr "Insira un UUID válido."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "Orde"
+
+msgid "Delete"
+msgstr "Eliminar"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "Corrixa os datos duplicados no campo %(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "Corrixa os datos duplicados no campo %(field)s, que debe ser único."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"Corrixa os datos duplicados no campo %(field_name)s, que debe ser único para "
+"a busca %(lookup)s no campo %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "Corrixa os valores duplicados de abaixo."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Escolla unha opción válida. Esta opción non se atopa entre as opcións "
+"dispoñíbeis"
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(datetime)s non se puido interpretar na zona hora horaria "
+"%(current_timezone)s; pode ser ambiguo ou non existir."
+
+msgid "Clear"
+msgstr "Limpar"
+
+msgid "Currently"
+msgstr "Actualmente"
+
+msgid "Change"
+msgstr "Modificar"
+
+msgid "Unknown"
+msgstr "Descoñecido"
+
+msgid "Yes"
+msgstr "Si"
+
+msgid "No"
+msgstr "Non"
+
+msgid "yes,no,maybe"
+msgstr "si,non,quizais"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s KB"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s MB"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s GB"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s TB"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s PB"
+
+msgid "p.m."
+msgstr "p.m."
+
+msgid "a.m."
+msgstr "a.m."
+
+msgid "PM"
+msgstr "PM"
+
+msgid "AM"
+msgstr "AM"
+
+msgid "midnight"
+msgstr "medianoite"
+
+msgid "noon"
+msgstr "mediodía"
+
+msgid "Monday"
+msgstr "Luns"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "Mércores"
+
+msgid "Thursday"
+msgstr "Xoves"
+
+msgid "Friday"
+msgstr "Venres"
+
+msgid "Saturday"
+msgstr "Sábado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Mon"
+msgstr "lun"
+
+msgid "Tue"
+msgstr "mar"
+
+msgid "Wed"
+msgstr "mér"
+
+msgid "Thu"
+msgstr "xov"
+
+msgid "Fri"
+msgstr "ven"
+
+msgid "Sat"
+msgstr "sáb"
+
+msgid "Sun"
+msgstr "dom"
+
+msgid "January"
+msgstr "xaneiro"
+
+msgid "February"
+msgstr "febreiro"
+
+msgid "March"
+msgstr "marzo"
+
+msgid "April"
+msgstr "abril"
+
+msgid "May"
+msgstr "maio"
+
+msgid "June"
+msgstr "xuño"
+
+msgid "July"
+msgstr "xullo"
+
+msgid "August"
+msgstr "agosto"
+
+msgid "September"
+msgstr "setembro"
+
+msgid "October"
+msgstr "outubro"
+
+msgid "November"
+msgstr "novembro"
+
+msgid "December"
+msgstr "decembro"
+
+msgid "jan"
+msgstr "xan"
+
+msgid "feb"
+msgstr "feb"
+
+msgid "mar"
+msgstr "mar"
+
+msgid "apr"
+msgstr "abr"
+
+msgid "may"
+msgstr "mai"
+
+msgid "jun"
+msgstr "xuñ"
+
+msgid "jul"
+msgstr "xul"
+
+msgid "aug"
+msgstr "ago"
+
+msgid "sep"
+msgstr "set"
+
+msgid "oct"
+msgstr "out"
+
+msgid "nov"
+msgstr "nov"
+
+msgid "dec"
+msgstr "dec"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "xan."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "feb."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "mar."
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "abr."
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "maio"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "xuño"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "xul."
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "ago."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "set."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "out."
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "nov."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "dec."
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "xaneiro"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "febreiro"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "marzo"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "abril"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "maio"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "xuño"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "xullo"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "agosto"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "setembro"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "outubro"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "novembro"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "decembro"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "ou"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d ano"
+msgstr[1] "%d anos"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d mes"
+msgstr[1] "%d meses"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d días"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+msgid "0 minutes"
+msgstr "0 minutos"
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr "Pode ver máis información se establece DEBUG=True."
+
+msgid "No year specified"
+msgstr "Non se especificou ningún ano"
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "Non se especificou ningún mes"
+
+msgid "No day specified"
+msgstr "Non se especificou ningún día"
+
+msgid "No week specified"
+msgstr "Non se especificou ningunha semana"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "Non hai %(verbose_name_plural)s dispoñibles"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"Non hai dispoñibles %(verbose_name_plural)s futuros/as porque %(class_name)s."
+"allow_futuro é False"
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "A cadea de data '%(datestr)s' non é válida para o formato '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "Non se atopou ningún/ha %(verbose_name)s que coincidise coa consulta"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "A páxina non é 'last' nin se pode converter a int."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "Páxina non válida (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "A lista está baleira pero '%(class_name)s.allow_empty' é False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "Os índices de directorio non están permitidos aquí."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" non existe"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "Índice de %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..83fe2bc
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..7f853f1
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/formats.py
new file mode 100644
index 0000000..2dac959
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/gl/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = r'j \d\e F \d\e Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = r'j \d\e F \d\e Y \á\s H:i'
+YEAR_MONTH_FORMAT = r'F \d\e Y'
+MONTH_DAY_FORMAT = r'j \d\e F'
+SHORT_DATE_FORMAT = 'd-m-Y'
+SHORT_DATETIME_FORMAT = 'd-m-Y, H:i'
+FIRST_DAY_OF_WEEK = 1 # Monday
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = ','
+THOUSAND_SEPARATOR = '.'
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e1d0f02
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.po
new file mode 100644
index 0000000..1058a50
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.po
@@ -0,0 +1,1226 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# Alex Gaynor , 2011-2012
+# Jannis Leidel , 2011
+# Meir Kriheli , 2011-2015,2017
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-28 08:17+0000\n"
+"Last-Translator: Meir Kriheli \n"
+"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: he\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "אפריקאנס"
+
+msgid "Arabic"
+msgstr "ערבית"
+
+msgid "Asturian"
+msgstr "אסטורית"
+
+msgid "Azerbaijani"
+msgstr "אזרית"
+
+msgid "Bulgarian"
+msgstr "בולגרית"
+
+msgid "Belarusian"
+msgstr "בֶּלָרוּסִית"
+
+msgid "Bengali"
+msgstr "בנגאלית"
+
+msgid "Breton"
+msgstr "בְּרֶטוֹנִית"
+
+msgid "Bosnian"
+msgstr "בוסנית"
+
+msgid "Catalan"
+msgstr "קאטלונית"
+
+msgid "Czech"
+msgstr "צ'כית"
+
+msgid "Welsh"
+msgstr "וולשית"
+
+msgid "Danish"
+msgstr "דנית"
+
+msgid "German"
+msgstr "גרמנית"
+
+msgid "Lower Sorbian"
+msgstr "סורבית תחתונה"
+
+msgid "Greek"
+msgstr "יוונית"
+
+msgid "English"
+msgstr "אנגלית"
+
+msgid "Australian English"
+msgstr "אנגלית אוסטרלית"
+
+msgid "British English"
+msgstr "אנגלית בריטית"
+
+msgid "Esperanto"
+msgstr "אספרנטו"
+
+msgid "Spanish"
+msgstr "ספרדית"
+
+msgid "Argentinian Spanish"
+msgstr "ספרדית ארגנטינית"
+
+msgid "Colombian Spanish"
+msgstr "ספרדית קולומביאנית"
+
+msgid "Mexican Spanish"
+msgstr "ספרדית מקסיקנית"
+
+msgid "Nicaraguan Spanish"
+msgstr "ספרדית ניקרגואה"
+
+msgid "Venezuelan Spanish"
+msgstr "ספרדית ונצואלית"
+
+msgid "Estonian"
+msgstr "אסטונית"
+
+msgid "Basque"
+msgstr "בסקית"
+
+msgid "Persian"
+msgstr "פרסית"
+
+msgid "Finnish"
+msgstr "פינית"
+
+msgid "French"
+msgstr "צרפתית"
+
+msgid "Frisian"
+msgstr "פריזית"
+
+msgid "Irish"
+msgstr "אירית"
+
+msgid "Scottish Gaelic"
+msgstr "גאלית סקוטית"
+
+msgid "Galician"
+msgstr "גאליציאנית"
+
+msgid "Hebrew"
+msgstr "עברית"
+
+msgid "Hindi"
+msgstr "הינדי"
+
+msgid "Croatian"
+msgstr "קרואטית"
+
+msgid "Upper Sorbian"
+msgstr "סורבית עילית"
+
+msgid "Hungarian"
+msgstr "הונגרית"
+
+msgid "Interlingua"
+msgstr "אינטרלינגואה"
+
+msgid "Indonesian"
+msgstr "אינדונזית"
+
+msgid "Ido"
+msgstr "אידו"
+
+msgid "Icelandic"
+msgstr "איסלנדית"
+
+msgid "Italian"
+msgstr "איטלקית"
+
+msgid "Japanese"
+msgstr "יפנית"
+
+msgid "Georgian"
+msgstr "גיאורגית"
+
+msgid "Kazakh"
+msgstr "קזחית"
+
+msgid "Khmer"
+msgstr "חמר"
+
+msgid "Kannada"
+msgstr "קאנאדה"
+
+msgid "Korean"
+msgstr "קוריאנית"
+
+msgid "Luxembourgish"
+msgstr "לוקסמבורגית"
+
+msgid "Lithuanian"
+msgstr "ליטאית"
+
+msgid "Latvian"
+msgstr "לטבית"
+
+msgid "Macedonian"
+msgstr "מקדונית"
+
+msgid "Malayalam"
+msgstr "מלאיאלאם"
+
+msgid "Mongolian"
+msgstr "מונגולי"
+
+msgid "Marathi"
+msgstr "מראטהי"
+
+msgid "Burmese"
+msgstr "בּוּרְמֶזִית"
+
+msgid "Norwegian Bokmål"
+msgstr "נורבגית ספרותית"
+
+msgid "Nepali"
+msgstr "נפאלית"
+
+msgid "Dutch"
+msgstr "הולנדית"
+
+msgid "Norwegian Nynorsk"
+msgstr "נורבגית חדשה"
+
+msgid "Ossetic"
+msgstr "אוסטית"
+
+msgid "Punjabi"
+msgstr "פנג'אבי"
+
+msgid "Polish"
+msgstr "פולנית"
+
+msgid "Portuguese"
+msgstr "פורטוגזית"
+
+msgid "Brazilian Portuguese"
+msgstr "פורטוגזית ברזילאית"
+
+msgid "Romanian"
+msgstr "רומנית"
+
+msgid "Russian"
+msgstr "רוסית"
+
+msgid "Slovak"
+msgstr "סלובקית"
+
+msgid "Slovenian"
+msgstr "סלובנית"
+
+msgid "Albanian"
+msgstr "אלבנית"
+
+msgid "Serbian"
+msgstr "סרבית"
+
+msgid "Serbian Latin"
+msgstr "סרבית לטינית"
+
+msgid "Swedish"
+msgstr "שוודית"
+
+msgid "Swahili"
+msgstr "סווהילי"
+
+msgid "Tamil"
+msgstr "טמילית"
+
+msgid "Telugu"
+msgstr "טלגו"
+
+msgid "Thai"
+msgstr "תאילנדית"
+
+msgid "Turkish"
+msgstr "טורקית"
+
+msgid "Tatar"
+msgstr "טטרית"
+
+msgid "Udmurt"
+msgstr "אודמורטית"
+
+msgid "Ukrainian"
+msgstr "אוקראינית"
+
+msgid "Urdu"
+msgstr "אורדו"
+
+msgid "Vietnamese"
+msgstr "וייטנאמית"
+
+msgid "Simplified Chinese"
+msgstr "סינית פשוטה"
+
+msgid "Traditional Chinese"
+msgstr "סינית מסורתית"
+
+msgid "Messages"
+msgstr "הודעות"
+
+msgid "Site Maps"
+msgstr "מפות אתר"
+
+msgid "Static Files"
+msgstr "קבצים סטטיים"
+
+msgid "Syndication"
+msgstr "הפצת תכנים"
+
+msgid "That page number is not an integer"
+msgstr "מספר העמוד אינו מספר שלם"
+
+msgid "That page number is less than 1"
+msgstr "מספר העמוד קטן מ־1"
+
+msgid "That page contains no results"
+msgstr "עמוד זה אינו מכיל תוצאות"
+
+msgid "Enter a valid value."
+msgstr "יש להזין ערך חוקי."
+
+msgid "Enter a valid URL."
+msgstr "יש להזין URL חוקי."
+
+msgid "Enter a valid integer."
+msgstr "יש להזין מספר שלם חוקי."
+
+msgid "Enter a valid email address."
+msgstr "נא להזין כתובת דוא\"ל חוקית"
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr "יש להזין ערך המכיל אותיות, ספרות, קווים תחתונים ומקפים בלבד."
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+"יש להזין 'slug' חוקי המכיל אותיות יוניקוד, ספרות, קווים תחתונים ומקפים בלבד."
+
+msgid "Enter a valid IPv4 address."
+msgstr "יש להזין כתובת IPv4 חוקית."
+
+msgid "Enter a valid IPv6 address."
+msgstr "יש להזין כתובת IPv6 חוקית."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "יש להזין כתובת IPv4 או IPv6 חוקית."
+
+msgid "Enter only digits separated by commas."
+msgstr "יש להזין רק ספרות מופרדות בפסיקים."
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr "יש לוודא שערך זה הינו %(limit_value)s (כרגע %(show_value)s)."
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "יש לוודא שערך זה פחות מ או שווה ל־%(limit_value)s ."
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "יש לוודא שהערך גדול מ או שווה ל־%(limit_value)s."
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"נא לוודא שערך זה מכיל תו %(limit_value)d לכל הפחות (מכיל %(show_value)d)."
+msgstr[1] ""
+"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל הפחות (מכיל %(show_value)d)."
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+"נא לוודא שערך זה מכיל תו %(limit_value)d לכל היותר (מכיל %(show_value)d)."
+msgstr[1] ""
+"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל היותר (מכיל %(show_value)d)."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] "נא לוודא שאין יותר מספרה %(max)s בסה\"כ."
+msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות בסה\"כ."
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] "נא לוודא שאין יותר מספרה %(max)s אחרי הנקודה."
+msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות אחרי הנקודה."
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] "נא לוודא שאין יותר מספרה %(max)s לפני הנקודה העשרונית"
+msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות לפני הנקודה העשרונית"
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+"סיומת הקובץ '%(extension)s' אסורה. הסיומות המותרות הן: "
+"'%(allowed_extensions)s'."
+
+msgid "Null characters are not allowed."
+msgstr "תווי NULL אינם מותרים. "
+
+msgid "and"
+msgstr "ו"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr "%(model_name)s·עם·%(field_labels)s·אלו קיימים כבר."
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr "ערך %(value)r אינו אפשרות חוקית."
+
+msgid "This field cannot be null."
+msgstr "שדה זה אינו יכול להיות ריק."
+
+msgid "This field cannot be blank."
+msgstr "שדה זה אינו יכול להיות ריק."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "%(model_name)s·עם·%(field_label)s·זה קיימת כבר."
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+"%(field_label)s חייב להיות ייחודי עבור %(date_field_label)s %(lookup_type)s."
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "שדה מסוג: %(field_type)s"
+
+msgid "Integer"
+msgstr "מספר שלם"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr "הערך '%(value)s' חייב להיות מספר שלם."
+
+msgid "Big (8 byte) integer"
+msgstr "מספר שלם גדול (8 בתים)"
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr "הערך '%(value)s' חייב להיות אמת או שקר."
+
+msgid "Boolean (Either True or False)"
+msgstr "בוליאני (אמת או שקר)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "מחרוזת (עד %(max_length)s תווים)"
+
+msgid "Comma-separated integers"
+msgstr "מספרים שלמים מופרדים בפסיקים"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+"הערך '%(value)s' מכיל פורמט תאריך לא חוקי. חייב להיות בפורמט YYYY-MM-DD."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr "הערך '%(value)s' בפורמט הנכון (YYYY-MM-DD), אך אינו תאריך חוקי."
+
+msgid "Date (without time)"
+msgstr "תאריך (ללא שעה)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+"הערך '%(value)s' מכיל פורמט לא חוקי. הוא חייב להיות בפורמטYYYY-MM-DD HH:MM[:"
+"ss[.uuuuuu]][TZ]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+"הערך '%(value)s' הוא בפורמט הנכון (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) אך "
+"אינו מהווה תאריך/שעה חוקיים."
+
+msgid "Date (with time)"
+msgstr "תאריך (כולל שעה)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr "הערך '%(value)s' חייב להיות מספר עשרוני."
+
+msgid "Decimal number"
+msgstr "מספר עשרוני"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+"הערך '%(value)s' מכיל פורמט לא חוקי. הוא חייב להיות בפורמט [DD] [HH:"
+"[MM:]]ss[.uuuuuu]."
+
+msgid "Duration"
+msgstr "משך"
+
+msgid "Email address"
+msgstr "כתובת דוא\"ל"
+
+msgid "File path"
+msgstr "נתיב קובץ"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr "הערך '%(value)s' חייב להיות מספר עם נקודה צפה."
+
+msgid "Floating point number"
+msgstr "מספר עשרוני"
+
+msgid "IPv4 address"
+msgstr "כתובת IPv4"
+
+msgid "IP address"
+msgstr "כתובת IP"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr "הערך '%(value)s' חייב להיות None, אמת או שקר."
+
+msgid "Boolean (Either True, False or None)"
+msgstr "בוליאני (אמת, שקר או כלום)"
+
+msgid "Positive integer"
+msgstr "מספר שלם חיובי"
+
+msgid "Positive small integer"
+msgstr "מספר שלם חיובי קטן"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "Slug (עד %(max_length)s תווים)"
+
+msgid "Small integer"
+msgstr "מספר שלם קטן"
+
+msgid "Text"
+msgstr "טקסט"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+"הערך '%(value)s' מכיל פורמט לא חוקי. חייב להיות בפורמט HH:MM[:ss[.uuuuuu]]."
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+"הערך '%(value)s' בעל פורמט חוקי (HH:MM[:ss[.uuuuuu]]) אך אינו זמן חוקי."
+
+msgid "Time"
+msgstr "זמן"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Raw binary data"
+msgstr "מידע בינארי גולמי"
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr "'%(value)s' אינו UUID חוקי."
+
+msgid "File"
+msgstr "קובץ"
+
+msgid "Image"
+msgstr "תמונה"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr "פריט %(model)s עם %(field)s %(value)r אינו קיים."
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "Foreign Key (הסוג נקבע לפי השדה המקושר)"
+
+msgid "One-to-one relationship"
+msgstr "יחס של אחד לאחד"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr "קשר %(from)s-%(to)s"
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr "קשרי %(from)s-%(to)s"
+
+msgid "Many-to-many relationship"
+msgstr "יחס של רבים לרבים"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ":?.!"
+
+msgid "This field is required."
+msgstr "יש להזין תוכן בשדה זה."
+
+msgid "Enter a whole number."
+msgstr "נא להזין מספר שלם."
+
+msgid "Enter a number."
+msgstr "נא להזין מספר."
+
+msgid "Enter a valid date."
+msgstr "יש להזין תאריך חוקי."
+
+msgid "Enter a valid time."
+msgstr "יש להזין שעה חוקית."
+
+msgid "Enter a valid date/time."
+msgstr "יש להזין תאריך ושעה חוקיים."
+
+msgid "Enter a valid duration."
+msgstr "יש להזין משך חוקי."
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "לא נשלח שום קובץ. נא לבדוק את סוג הקידוד של הטופס."
+
+msgid "No file was submitted."
+msgstr "לא נשלח שום קובץ"
+
+msgid "The submitted file is empty."
+msgstr "הקובץ שנשלח ריק."
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] "נא לוודא ששם קובץ זה מכיל תו %(max)d לכל היותר (מכיל %(length)d)."
+msgstr[1] ""
+"נא לוודא ששם קובץ זה מכיל %(max)d תווים לכל היותר (מכיל %(length)d)."
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "נא לשים קובץ או סימן את התיבה לניקוי, לא שניהם."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "נא להעלות תמונה חוקית. הקובץ שהעלת אינו תמונה או מכיל תמונה מקולקלת."
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "יש לבחור אפשרות חוקית. %(value)s אינו בין האפשרויות הזמינות."
+
+msgid "Enter a list of values."
+msgstr "יש להזין רשימת ערכים"
+
+msgid "Enter a complete value."
+msgstr "יש להזין ערך שלם."
+
+msgid "Enter a valid UUID."
+msgstr "יש להזין UUID חוקי."
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ":"
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr "(שדה מוסתר %(name)s) %(error)s"
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr "מידע ManagementForm חסר או התעסקו איתו."
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] "נא לשלוח טופס %d לכל היותר."
+msgstr[1] "נא לשלוח %d טפסים לכל היותר."
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] "נא לשלוח טופס %d או יותר."
+msgstr[1] "נא לשלוח %d טפסים או יותר."
+
+msgid "Order"
+msgstr "מיון"
+
+msgid "Delete"
+msgstr "מחיקה"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "נא לתקן את הערכים הכפולים ל%(field)s."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "נא לתקן את הערכים הכפולים ל%(field)s, שערכים בו חייבים להיות ייחודיים."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"נא לתקן את הערכים הכפולים %(field_name)s, שחייבים להיות ייחודיים ל%(lookup)s "
+"של %(date_field)s."
+
+msgid "Please correct the duplicate values below."
+msgstr "נא לתקן את הערכים הכפולים למטה."
+
+msgid "The inline value did not match the parent instance."
+msgstr "הערך הפנימי אינו תואם לאב."
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "יש לבחור אפשרות חוקית; אפשרות זו אינה אחת מהזמינות."
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr "\"%(pk)s\" אינו ערך חוקי."
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"לא ניתן לפרש את %(datetime)s באזור זמן %(current_timezone)s; הוא עשוי להיות "
+"דו-משמעי או לא קיים."
+
+msgid "Clear"
+msgstr "לסלק"
+
+msgid "Currently"
+msgstr "עכשיו"
+
+msgid "Change"
+msgstr "שינוי"
+
+msgid "Unknown"
+msgstr "לא ידוע"
+
+msgid "Yes"
+msgstr "כן"
+
+msgid "No"
+msgstr "לא"
+
+msgid "yes,no,maybe"
+msgstr "כן,לא,אולי"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "בית %(size)d "
+msgstr[1] "%(size)d בתים"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s ק\"ב"
+
+#, python-format
+msgid "%s MB"
+msgstr "%s מ\"ב"
+
+#, python-format
+msgid "%s GB"
+msgstr "%s ג\"ב"
+
+#, python-format
+msgid "%s TB"
+msgstr "%s ט\"ב"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s פ\"ב"
+
+msgid "p.m."
+msgstr "אחר הצהריים"
+
+msgid "a.m."
+msgstr "בבוקר"
+
+msgid "PM"
+msgstr "אחר הצהריים"
+
+msgid "AM"
+msgstr "בבוקר"
+
+msgid "midnight"
+msgstr "חצות"
+
+msgid "noon"
+msgstr "12 בצהריים"
+
+msgid "Monday"
+msgstr "שני"
+
+msgid "Tuesday"
+msgstr "שלישי"
+
+msgid "Wednesday"
+msgstr "רביעי"
+
+msgid "Thursday"
+msgstr "חמישי"
+
+msgid "Friday"
+msgstr "שישי"
+
+msgid "Saturday"
+msgstr "שבת"
+
+msgid "Sunday"
+msgstr "ראשון"
+
+msgid "Mon"
+msgstr "שני"
+
+msgid "Tue"
+msgstr "שלישי"
+
+msgid "Wed"
+msgstr "רביעי"
+
+msgid "Thu"
+msgstr "חמישי"
+
+msgid "Fri"
+msgstr "שישי"
+
+msgid "Sat"
+msgstr "שבת"
+
+msgid "Sun"
+msgstr "ראשון"
+
+msgid "January"
+msgstr "ינואר"
+
+msgid "February"
+msgstr "פברואר"
+
+msgid "March"
+msgstr "מרץ"
+
+msgid "April"
+msgstr "אפריל"
+
+msgid "May"
+msgstr "מאי"
+
+msgid "June"
+msgstr "יוני"
+
+msgid "July"
+msgstr "יולי"
+
+msgid "August"
+msgstr "אוגוסט"
+
+msgid "September"
+msgstr "ספטמבר"
+
+msgid "October"
+msgstr "אוקטובר"
+
+msgid "November"
+msgstr "נובמבר"
+
+msgid "December"
+msgstr "דצמבר"
+
+msgid "jan"
+msgstr "ינו"
+
+msgid "feb"
+msgstr "פבר"
+
+msgid "mar"
+msgstr "מרץ"
+
+msgid "apr"
+msgstr "אפר"
+
+msgid "may"
+msgstr "מאי"
+
+msgid "jun"
+msgstr "יונ"
+
+msgid "jul"
+msgstr "יול"
+
+msgid "aug"
+msgstr "אוג"
+
+msgid "sep"
+msgstr "ספט"
+
+msgid "oct"
+msgstr "אוק"
+
+msgid "nov"
+msgstr "נוב"
+
+msgid "dec"
+msgstr "דצמ"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "יאנ'"
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "פבר'"
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "מרץ"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "אפריל"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "מאי"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "יוני"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "יולי"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "אוג'"
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "ספט'"
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "אוק'"
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "נוב'"
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "דצמ'"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "ינואר"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "פברואר"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "מרץ"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "אפריל"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "מאי"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "יוני"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "יולי"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "אוגוסט"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "ספטמבר"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "אוקטובר"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "נובמבר"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "דצמבר"
+
+msgid "This is not a valid IPv6 address."
+msgstr "זו אינה כתובת IPv6 חוקית."
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "או"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "שנה %d"
+msgstr[1] "%d שנים"
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "חודש %d"
+msgstr[1] "%d חודשים"
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "שבוע %d"
+msgstr[1] "%d שבועות"
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "יום %d"
+msgstr[1] "%d ימים"
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "שעה %d"
+msgstr[1] "%d שעות"
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "דקה %d"
+msgstr[1] "%d דקות"
+
+msgid "0 minutes"
+msgstr "0 דקות"
+
+msgid "Forbidden"
+msgstr "אסור"
+
+msgid "CSRF verification failed. Request aborted."
+msgstr "אימות CSRF נכשל. הבקשה בוטלה."
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+"הודעה זו מופיעה מאחר ואתר HTTPS זה דורש שליחת 'Referer header' על ידי הדפדפן "
+"שלך, אשר לא נשלח. הדבר נדרש מסיבות אבטחה, כדי לוודא שהדפדפן שלך לא נחטף על "
+"ידי אחרים."
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+"אם הגדרת את הדפדפן שלך לביטול 'Referer' headers, נא לאפשר אותם, לפחות עבור "
+"אתר זה, לחיבורי HTTPS או לבקשות 'same-origin'."
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+"אם תג בשימוש או header "
+"'Referrer-Policy: no-referrer', נא להסיר אותם. הגנת ה־CSRF דורשת את ה־"
+"header 'Referer' כדי לבצע בדיקה מפנה מדוקדקת. במקרה של דאגה לפרטיות, יש "
+"להשתמש בתחליפים כמו עבור קישורים לאתרים צד ג'."
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+"הודעה זו מופיעה מאחר ואתר זה דורש עוגיית CSRF כאשר שולחים טפסים. עוגיה זו "
+"נדרשת מסיבות אבטחה, כדי לוודא שהדפדפן שלך לא נחטף על ידי אחרים."
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+"אם הגדרת את הדפדפן שלך לנטרול עוגיות, נא לאפשר אותם שוב, לפחות עבור אתר זה "
+"או לבקשות 'same-origin'."
+
+msgid "More information is available with DEBUG=True."
+msgstr "מידע נוסף זמין עם "
+
+msgid "No year specified"
+msgstr "לא צויינה שנה"
+
+msgid "Date out of range"
+msgstr "תאריך מחוץ לטווח"
+
+msgid "No month specified"
+msgstr "לא צויין חודש"
+
+msgid "No day specified"
+msgstr "לא צויין יום"
+
+msgid "No week specified"
+msgstr "לא צויין שבוע"
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "לא נמצאו %(verbose_name_plural)s"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"לא נמצאו %(verbose_name_plural)s בזמן עתיד מאחר ש-%(class_name)s."
+"allow_future מוגדר False."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "מחרוזת תאריך לא חוקית '%(datestr)s' בהתחשב בתחביר '%(format)s'"
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr "לא נמצא/ה %(verbose_name)s התואם/ת לשאילתה"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "העמוד אינו 'last', או אינו ניתן להמרה למספר."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "עמוד לא חוקי (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "רשימה ריקה -ו'%(class_name)s.allow_empty' מוגדר False."
+
+msgid "Directory indexes are not allowed here."
+msgstr "אינדקסים על תיקיה אסורים כאן."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" אינו קיים"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "אינדקס של %(directory)s"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr "Django: תשתית הווב לפרפקציוניסטים עם תאריכי יעד."
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+"ראו הערות השחרור עבור Django %(version)s"
+
+msgid "The install worked successfully! Congratulations!"
+msgstr "ההתקנה עברה בהצלחה! מזל טוב!"
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+"עמוד זה מופיע בעקבות המצאות DEBUG=True בקובץ ההגדרות שלך ולא הגדרת שום URLs."
+
+msgid "Django Documentation"
+msgstr "תיעוד Django"
+
+msgid "Topics, references, & how-to's"
+msgstr "נושאים, הפניות ומדריכים"
+
+msgid "Tutorial: A Polling App"
+msgstr "מדריך ללומד: יישום לסקרים."
+
+msgid "Get started with Django"
+msgstr "התחילו לעבוד עם Django"
+
+msgid "Django Community"
+msgstr "קהילת Django"
+
+msgid "Connect, get help, or contribute"
+msgstr "יצירת קשר, קבלת עזרה או השתתפות"
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..6fdaf7e
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..3d19a96
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/formats.py
new file mode 100644
index 0000000..550d9bf
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/he/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j בF Y'
+TIME_FORMAT = 'H:i'
+DATETIME_FORMAT = 'j בF Y H:i'
+YEAR_MONTH_FORMAT = 'F Y'
+MONTH_DAY_FORMAT = 'j בF'
+SHORT_DATE_FORMAT = 'd/m/Y'
+SHORT_DATETIME_FORMAT = 'd/m/Y H:i'
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e946931
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po
new file mode 100644
index 0000000..6a49464
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po
@@ -0,0 +1,1193 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# alkuma , 2013
+# Chandan kumar , 2012
+# Jannis Leidel , 2011
+# Pratik , 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-15 16:15+0100\n"
+"PO-Revision-Date: 2017-11-16 01:13+0000\n"
+"Last-Translator: Jannis Leidel \n"
+"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Afrikaans"
+msgstr "अफ़्रीकांस"
+
+msgid "Arabic"
+msgstr "अरबी"
+
+msgid "Asturian"
+msgstr ""
+
+msgid "Azerbaijani"
+msgstr "आज़रबाइजानी"
+
+msgid "Bulgarian"
+msgstr "बलगारियन"
+
+msgid "Belarusian"
+msgstr "बेलारूसी"
+
+msgid "Bengali"
+msgstr "बंगाली"
+
+msgid "Breton"
+msgstr "ब्रेटन"
+
+msgid "Bosnian"
+msgstr "बोस्नियन"
+
+msgid "Catalan"
+msgstr "कटलान"
+
+msgid "Czech"
+msgstr "च्चेक"
+
+msgid "Welsh"
+msgstr "वेल्श"
+
+msgid "Danish"
+msgstr "दानिश"
+
+msgid "German"
+msgstr "जर्मन"
+
+msgid "Lower Sorbian"
+msgstr ""
+
+msgid "Greek"
+msgstr "ग्रीक"
+
+msgid "English"
+msgstr "अंग्रेज़ी "
+
+msgid "Australian English"
+msgstr ""
+
+msgid "British English"
+msgstr "ब्रिटिश अंग्रेजी"
+
+msgid "Esperanto"
+msgstr "एस्परेन्तो"
+
+msgid "Spanish"
+msgstr "स्पानिश"
+
+msgid "Argentinian Spanish"
+msgstr "अर्जेंटीना स्पैनिश "
+
+msgid "Colombian Spanish"
+msgstr ""
+
+msgid "Mexican Spanish"
+msgstr "मेक्सिकन स्पैनिश"
+
+msgid "Nicaraguan Spanish"
+msgstr "निकारागुआ स्पैनिश"
+
+msgid "Venezuelan Spanish"
+msgstr "वेनेज़ुएलाई स्पेनिश"
+
+msgid "Estonian"
+msgstr "एस्टोनियन"
+
+msgid "Basque"
+msgstr "बास्क"
+
+msgid "Persian"
+msgstr "पारसी"
+
+msgid "Finnish"
+msgstr "फ़िन्निश"
+
+msgid "French"
+msgstr "फ्रेंच"
+
+msgid "Frisian"
+msgstr "फ्रिसियन"
+
+msgid "Irish"
+msgstr "आयरिश"
+
+msgid "Scottish Gaelic"
+msgstr ""
+
+msgid "Galician"
+msgstr "गलिशियन"
+
+msgid "Hebrew"
+msgstr "हिब्रू"
+
+msgid "Hindi"
+msgstr "हिंदी"
+
+msgid "Croatian"
+msgstr "क्रोयेशियन"
+
+msgid "Upper Sorbian"
+msgstr ""
+
+msgid "Hungarian"
+msgstr "हंगेरियन"
+
+msgid "Interlingua"
+msgstr "इंतर्लिंगुआ"
+
+msgid "Indonesian"
+msgstr "इन्डोनेशियन "
+
+msgid "Ido"
+msgstr ""
+
+msgid "Icelandic"
+msgstr "आयिस्लान्डिक"
+
+msgid "Italian"
+msgstr "इटैलियन"
+
+msgid "Japanese"
+msgstr "जपानी"
+
+msgid "Georgian"
+msgstr "ज्योर्जियन"
+
+msgid "Kazakh"
+msgstr "कज़ाख"
+
+msgid "Khmer"
+msgstr "ख्मेर"
+
+msgid "Kannada"
+msgstr "कन्नड़"
+
+msgid "Korean"
+msgstr "कोरियन"
+
+msgid "Luxembourgish"
+msgstr "लक्संबर्गी"
+
+msgid "Lithuanian"
+msgstr "लिथुवेनियन"
+
+msgid "Latvian"
+msgstr "लात्वियन"
+
+msgid "Macedonian"
+msgstr "मेसिडोनियन"
+
+msgid "Malayalam"
+msgstr "मलयालम"
+
+msgid "Mongolian"
+msgstr "मंगोलियन"
+
+msgid "Marathi"
+msgstr ""
+
+msgid "Burmese"
+msgstr "बर्मीज़"
+
+msgid "Norwegian Bokmål"
+msgstr ""
+
+msgid "Nepali"
+msgstr "नेपाली"
+
+msgid "Dutch"
+msgstr "डच"
+
+msgid "Norwegian Nynorsk"
+msgstr "नार्वेजियन नायनॉर्स्क"
+
+msgid "Ossetic"
+msgstr "ओस्सेटिक"
+
+msgid "Punjabi"
+msgstr "पंजाबी"
+
+msgid "Polish"
+msgstr "पोलिश"
+
+msgid "Portuguese"
+msgstr "पुर्तगाली"
+
+msgid "Brazilian Portuguese"
+msgstr "ब्रजिलियन पुर्तगाली"
+
+msgid "Romanian"
+msgstr "रोमानियन"
+
+msgid "Russian"
+msgstr "रूसी"
+
+msgid "Slovak"
+msgstr "स्लोवाक"
+
+msgid "Slovenian"
+msgstr "स्लोवेनियन"
+
+msgid "Albanian"
+msgstr "अल्बेनियन्"
+
+msgid "Serbian"
+msgstr "सर्बियन"
+
+msgid "Serbian Latin"
+msgstr "सर्बियाई लैटिन"
+
+msgid "Swedish"
+msgstr "स्वीडिश"
+
+msgid "Swahili"
+msgstr "स्वाहिली"
+
+msgid "Tamil"
+msgstr "तमिल"
+
+msgid "Telugu"
+msgstr "तेलुगु"
+
+msgid "Thai"
+msgstr "थाई"
+
+msgid "Turkish"
+msgstr "तुर्किश"
+
+msgid "Tatar"
+msgstr "तातार"
+
+msgid "Udmurt"
+msgstr "उद्मर्त"
+
+msgid "Ukrainian"
+msgstr "यूक्रानियन"
+
+msgid "Urdu"
+msgstr "उर्दू"
+
+msgid "Vietnamese"
+msgstr "वियतनामी"
+
+msgid "Simplified Chinese"
+msgstr "सरल चीनी"
+
+msgid "Traditional Chinese"
+msgstr "पारम्परिक चीनी"
+
+msgid "Messages"
+msgstr ""
+
+msgid "Site Maps"
+msgstr ""
+
+msgid "Static Files"
+msgstr ""
+
+msgid "Syndication"
+msgstr ""
+
+msgid "That page number is not an integer"
+msgstr ""
+
+msgid "That page number is less than 1"
+msgstr ""
+
+msgid "That page contains no results"
+msgstr ""
+
+msgid "Enter a valid value."
+msgstr "एक मान्य मूल्य दर्ज करें"
+
+msgid "Enter a valid URL."
+msgstr "वैध यू.आर.एल भरें ।"
+
+msgid "Enter a valid integer."
+msgstr ""
+
+msgid "Enter a valid email address."
+msgstr "वैध डाक पता प्रविष्ट करें।"
+
+#. Translators: "letters" means latin letters: a-z and A-Z.
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr "एक वैध 'काउंटर' वर्णों, संख्याओं,रेखांकित चिन्ह ,या हाइफ़न से मिलाकर दर्ज करें ।"
+
+msgid ""
+"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or "
+"hyphens."
+msgstr ""
+
+msgid "Enter a valid IPv4 address."
+msgstr "वैध आइ.पि वी 4 पता भरें ।"
+
+msgid "Enter a valid IPv6 address."
+msgstr "वैध IPv6 पता दर्ज करें."
+
+msgid "Enter a valid IPv4 or IPv6 address."
+msgstr "वैध IPv4 या IPv6 पता दर्ज करें."
+
+msgid "Enter only digits separated by commas."
+msgstr "अल्पविराम अंक मात्र ही भरें ।"
+
+#, python-format
+msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
+msgstr ""
+"सुनिश्चित करें कि यह मान %(limit_value)s (यह\n"
+" %(show_value)s है) है ।"
+
+#, python-format
+msgid "Ensure this value is less than or equal to %(limit_value)s."
+msgstr "सुनिश्चित करें कि यह मान %(limit_value)s से कम या बराबर है ।"
+
+#, python-format
+msgid "Ensure this value is greater than or equal to %(limit_value)s."
+msgstr "सुनिश्चित करें यह मान %(limit_value)s से बड़ा या बराबर है ।"
+
+#, python-format
+msgid ""
+"Ensure this value has at least %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at least %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure this value has at most %(limit_value)d character (it has "
+"%(show_value)d)."
+msgid_plural ""
+"Ensure this value has at most %(limit_value)d characters (it has "
+"%(show_value)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s digit in total."
+msgid_plural "Ensure that there are no more than %(max)s digits in total."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Ensure that there are no more than %(max)s decimal place."
+msgid_plural "Ensure that there are no more than %(max)s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"Ensure that there are no more than %(max)s digit before the decimal point."
+msgid_plural ""
+"Ensure that there are no more than %(max)s digits before the decimal point."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid ""
+"File extension '%(extension)s' is not allowed. Allowed extensions are: "
+"'%(allowed_extensions)s'."
+msgstr ""
+
+msgid "Null characters are not allowed."
+msgstr ""
+
+msgid "and"
+msgstr "और"
+
+#, python-format
+msgid "%(model_name)s with this %(field_labels)s already exists."
+msgstr ""
+
+#, python-format
+msgid "Value %(value)r is not a valid choice."
+msgstr ""
+
+msgid "This field cannot be null."
+msgstr "यह मूल्य खाली नहीं हो सकता ।"
+
+msgid "This field cannot be blank."
+msgstr "इस फ़ील्ड रिक्त नहीं हो सकता है."
+
+#, python-format
+msgid "%(model_name)s with this %(field_label)s already exists."
+msgstr "इस %(field_label)s के साथ एक %(model_name)s पहले से ही उपस्थित है ।"
+
+#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'.
+#. Eg: "Title must be unique for pub_date year"
+#, python-format
+msgid ""
+"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s."
+msgstr ""
+
+#, python-format
+msgid "Field of type: %(field_type)s"
+msgstr "फील्ड के प्रकार: %(field_type)s"
+
+msgid "Integer"
+msgstr "पूर्णांक"
+
+#, python-format
+msgid "'%(value)s' value must be an integer."
+msgstr ""
+
+msgid "Big (8 byte) integer"
+msgstr "बड़ा (8 बाइट) पूर्णांक "
+
+#, python-format
+msgid "'%(value)s' value must be either True or False."
+msgstr ""
+
+msgid "Boolean (Either True or False)"
+msgstr "बूलियन (सही अथवा गलत)"
+
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "स्ट्रिंग (अधिकतम लम्बाई %(max_length)s)"
+
+msgid "Comma-separated integers"
+msgstr "अल्पविराम सीमांकित संख्या"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid "
+"date."
+msgstr ""
+
+msgid "Date (without time)"
+msgstr "तिथि (बिना समय)"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[."
+"uuuuuu]][TZ] format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]"
+"[TZ]) but it is an invalid date/time."
+msgstr ""
+
+msgid "Date (with time)"
+msgstr "तिथि (समय के साथ)"
+
+#, python-format
+msgid "'%(value)s' value must be a decimal number."
+msgstr ""
+
+msgid "Decimal number"
+msgstr "दशमलव संख्या"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[."
+"uuuuuu] format."
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Email address"
+msgstr "ईमेल पता"
+
+msgid "File path"
+msgstr "संचिका पथ"
+
+#, python-format
+msgid "'%(value)s' value must be a float."
+msgstr ""
+
+msgid "Floating point number"
+msgstr "चल बिन्दु संख्या"
+
+msgid "IPv4 address"
+msgstr "IPv4 पता"
+
+msgid "IP address"
+msgstr "आइ.पि पता"
+
+#, python-format
+msgid "'%(value)s' value must be either None, True or False."
+msgstr ""
+
+msgid "Boolean (Either True, False or None)"
+msgstr "बूलियन (सही, गलत या कुछ नहीं)"
+
+msgid "Positive integer"
+msgstr "धनात्मक पूर्णांक"
+
+msgid "Positive small integer"
+msgstr "धनात्मक छोटा पूर्णांक"
+
+#, python-format
+msgid "Slug (up to %(max_length)s)"
+msgstr "स्लग (%(max_length)s तक)"
+
+msgid "Small integer"
+msgstr "छोटा पूर्णांक"
+
+msgid "Text"
+msgstr "पाठ"
+
+#, python-format
+msgid ""
+"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] "
+"format."
+msgstr ""
+
+#, python-format
+msgid ""
+"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an "
+"invalid time."
+msgstr ""
+
+msgid "Time"
+msgstr "समय"
+
+msgid "URL"
+msgstr "यू.आर.एल"
+
+msgid "Raw binary data"
+msgstr ""
+
+#, python-format
+msgid "'%(value)s' is not a valid UUID."
+msgstr ""
+
+msgid "File"
+msgstr "फाइल"
+
+msgid "Image"
+msgstr "छवि"
+
+#, python-format
+msgid "%(model)s instance with %(field)s %(value)r does not exist."
+msgstr ""
+
+msgid "Foreign Key (type determined by related field)"
+msgstr "विदेशी कुंजी (संबंधित क्षेत्र के द्वारा प्रकार निर्धारित)"
+
+msgid "One-to-one relationship"
+msgstr "एक-एक संबंध"
+
+#, python-format
+msgid "%(from)s-%(to)s relationship"
+msgstr ""
+
+#, python-format
+msgid "%(from)s-%(to)s relationships"
+msgstr ""
+
+msgid "Many-to-many relationship"
+msgstr "बहुत से कई संबंध"
+
+#. Translators: If found as last label character, these punctuation
+#. characters will prevent the default label_suffix to be appended to the
+#. label
+msgid ":?.!"
+msgstr ""
+
+msgid "This field is required."
+msgstr "यह क्षेत्र अपेक्षित हैं"
+
+msgid "Enter a whole number."
+msgstr "एक पूर्ण संख्या दर्ज करें ।"
+
+msgid "Enter a number."
+msgstr "एक संख्या दर्ज करें ।"
+
+msgid "Enter a valid date."
+msgstr "वैध तिथि भरें ।"
+
+msgid "Enter a valid time."
+msgstr "वैध समय भरें ।"
+
+msgid "Enter a valid date/time."
+msgstr "वैध तिथि/समय भरें ।"
+
+msgid "Enter a valid duration."
+msgstr ""
+
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "कोई संचिका निवेदित नहीं हुई । कृपया कूटलेखन की जाँच करें ।"
+
+msgid "No file was submitted."
+msgstr "कोई संचिका निवेदित नहीं हुई ।"
+
+msgid "The submitted file is empty."
+msgstr "निवेदित संचिका खाली है ।"
+
+#, python-format
+msgid "Ensure this filename has at most %(max)d character (it has %(length)d)."
+msgid_plural ""
+"Ensure this filename has at most %(max)d characters (it has %(length)d)."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Please either submit a file or check the clear checkbox, not both."
+msgstr "कृपया या फ़ाइल प्रस्तुत करे या साफ जांचपेटी की जाँच करे,दोनों नहीं ."
+
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "वैध चित्र निवेदन करें । आप के द्वारा निवेदित संचिका अमान्य अथवा दूषित है ।"
+
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "मान्य इच्छा चयन करें । %(value)s लभ्य इच्छाओं में उप्लब्ध नहीं हैं ।"
+
+msgid "Enter a list of values."
+msgstr "मूल्य सूची दर्ज करें ।"
+
+msgid "Enter a complete value."
+msgstr ""
+
+msgid "Enter a valid UUID."
+msgstr ""
+
+#. Translators: This is the default suffix added to form field labels
+msgid ":"
+msgstr ""
+
+#, python-format
+msgid "(Hidden field %(name)s) %(error)s"
+msgstr ""
+
+msgid "ManagementForm data is missing or has been tampered with"
+msgstr ""
+
+#, python-format
+msgid "Please submit %d or fewer forms."
+msgid_plural "Please submit %d or fewer forms."
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "Please submit %d or more forms."
+msgid_plural "Please submit %d or more forms."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Order"
+msgstr "छाटें"
+
+msgid "Delete"
+msgstr "मिटाएँ"
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s."
+msgstr "कृपया %(field)s के लिए डुप्लिकेट डेटा को सही करे."
+
+#, python-format
+msgid "Please correct the duplicate data for %(field)s, which must be unique."
+msgstr "कृपया %(field)s के डुप्लिकेट डेटा जो अद्वितीय होना चाहिए को सही करें."
+
+#, python-format
+msgid ""
+"Please correct the duplicate data for %(field_name)s which must be unique "
+"for the %(lookup)s in %(date_field)s."
+msgstr ""
+"कृपया %(field_name)s के लिए डुप्लिकेट डेटा को सही करे जो %(date_field)s में "
+"%(lookup)s के लिए अद्वितीय होना चाहिए."
+
+msgid "Please correct the duplicate values below."
+msgstr "कृपया डुप्लिकेट मानों को सही करें."
+
+msgid "The inline value did not match the parent instance."
+msgstr ""
+
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "मान्य विकल्प चयन करें । यह विकल्प उपस्थित विकल्पों में नहीं है ।"
+
+#, python-format
+msgid "\"%(pk)s\" is not a valid value."
+msgstr ""
+
+#, python-format
+msgid ""
+"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it "
+"may be ambiguous or it may not exist."
+msgstr ""
+"%(current_timezone)s समय क्षेत्र में %(datetime)s का व्याख्या नहीं कर सकता है, यह "
+"अस्पष्ट हो सकता है या नहीं मौजूद हो सकते हैं."
+
+msgid "Clear"
+msgstr "रिक्त करें"
+
+msgid "Currently"
+msgstr "फिलहाल"
+
+msgid "Change"
+msgstr "बदलें"
+
+msgid "Unknown"
+msgstr "अनजान"
+
+msgid "Yes"
+msgstr "हाँ"
+
+msgid "No"
+msgstr "नहीं"
+
+msgid "yes,no,maybe"
+msgstr "हाँ, नहीं, शायद"
+
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d बाइट"
+msgstr[1] "%(size)d बाइट"
+
+#, python-format
+msgid "%s KB"
+msgstr "%s केबी "
+
+#, python-format
+msgid "%s MB"
+msgstr "%s मेबी "
+
+#, python-format
+msgid "%s GB"
+msgstr "%s जीबी "
+
+#, python-format
+msgid "%s TB"
+msgstr "%s टीबी"
+
+#, python-format
+msgid "%s PB"
+msgstr "%s पीबी"
+
+msgid "p.m."
+msgstr "बजे"
+
+msgid "a.m."
+msgstr "बजे"
+
+msgid "PM"
+msgstr "बजे"
+
+msgid "AM"
+msgstr "बजे"
+
+msgid "midnight"
+msgstr "मध्यरात्री"
+
+msgid "noon"
+msgstr "दोपहर"
+
+msgid "Monday"
+msgstr "सोमवार"
+
+msgid "Tuesday"
+msgstr "मंगलवार"
+
+msgid "Wednesday"
+msgstr "बुधवार"
+
+msgid "Thursday"
+msgstr "गुरूवार"
+
+msgid "Friday"
+msgstr "शुक्रवार"
+
+msgid "Saturday"
+msgstr "शनिवार"
+
+msgid "Sunday"
+msgstr "रविवार"
+
+msgid "Mon"
+msgstr "सोम"
+
+msgid "Tue"
+msgstr "मंगल"
+
+msgid "Wed"
+msgstr "बुध"
+
+msgid "Thu"
+msgstr "गुरू"
+
+msgid "Fri"
+msgstr "शुक्र"
+
+msgid "Sat"
+msgstr "शनि"
+
+msgid "Sun"
+msgstr "रवि"
+
+msgid "January"
+msgstr "जनवरी"
+
+msgid "February"
+msgstr "फ़रवरी"
+
+msgid "March"
+msgstr "मार्च"
+
+msgid "April"
+msgstr "अप्रैल"
+
+msgid "May"
+msgstr "मई"
+
+msgid "June"
+msgstr "जून"
+
+msgid "July"
+msgstr "जुलाई"
+
+msgid "August"
+msgstr "अगस्त"
+
+msgid "September"
+msgstr "सितमबर"
+
+msgid "October"
+msgstr "अक्टूबर"
+
+msgid "November"
+msgstr "नवमबर"
+
+msgid "December"
+msgstr "दिसमबर"
+
+msgid "jan"
+msgstr "जन"
+
+msgid "feb"
+msgstr "फ़र"
+
+msgid "mar"
+msgstr "मा"
+
+msgid "apr"
+msgstr "अप्र"
+
+msgid "may"
+msgstr "मई"
+
+msgid "jun"
+msgstr "जून"
+
+msgid "jul"
+msgstr "जुल"
+
+msgid "aug"
+msgstr "अग"
+
+msgid "sep"
+msgstr "सित"
+
+msgid "oct"
+msgstr "अक्ट"
+
+msgid "nov"
+msgstr "नव"
+
+msgid "dec"
+msgstr "दिस्"
+
+msgctxt "abbrev. month"
+msgid "Jan."
+msgstr "जनवरी."
+
+msgctxt "abbrev. month"
+msgid "Feb."
+msgstr "फ़रवरी."
+
+msgctxt "abbrev. month"
+msgid "March"
+msgstr "मार्च"
+
+msgctxt "abbrev. month"
+msgid "April"
+msgstr "अप्रैल"
+
+msgctxt "abbrev. month"
+msgid "May"
+msgstr "मई"
+
+msgctxt "abbrev. month"
+msgid "June"
+msgstr "जून"
+
+msgctxt "abbrev. month"
+msgid "July"
+msgstr "जुलाई"
+
+msgctxt "abbrev. month"
+msgid "Aug."
+msgstr "अग."
+
+msgctxt "abbrev. month"
+msgid "Sept."
+msgstr "सितम्बर."
+
+msgctxt "abbrev. month"
+msgid "Oct."
+msgstr "अक्टूबर"
+
+msgctxt "abbrev. month"
+msgid "Nov."
+msgstr "नवम्बर."
+
+msgctxt "abbrev. month"
+msgid "Dec."
+msgstr "दिसम्बर"
+
+msgctxt "alt. month"
+msgid "January"
+msgstr "जनवरी"
+
+msgctxt "alt. month"
+msgid "February"
+msgstr "फरवरी"
+
+msgctxt "alt. month"
+msgid "March"
+msgstr "मार्च"
+
+msgctxt "alt. month"
+msgid "April"
+msgstr "अप्रैल"
+
+msgctxt "alt. month"
+msgid "May"
+msgstr "मई"
+
+msgctxt "alt. month"
+msgid "June"
+msgstr "जून"
+
+msgctxt "alt. month"
+msgid "July"
+msgstr "जुलाई"
+
+msgctxt "alt. month"
+msgid "August"
+msgstr "अगस्त"
+
+msgctxt "alt. month"
+msgid "September"
+msgstr "सितंबर"
+
+msgctxt "alt. month"
+msgid "October"
+msgstr "अक्टूबर"
+
+msgctxt "alt. month"
+msgid "November"
+msgstr "नवंबर"
+
+msgctxt "alt. month"
+msgid "December"
+msgstr "दिसंबर"
+
+msgid "This is not a valid IPv6 address."
+msgstr ""
+
+#, python-format
+msgctxt "String to return when truncating text"
+msgid "%(truncated_text)s..."
+msgstr "%(truncated_text)s..."
+
+msgid "or"
+msgstr "अथवा"
+
+#. Translators: This string is used as a separator between list elements
+msgid ", "
+msgstr ", "
+
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "0 minutes"
+msgstr ""
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "CSRF verification failed. Request aborted."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this HTTPS site requires a 'Referer "
+"header' to be sent by your Web browser, but none was sent. This header is "
+"required for security reasons, to ensure that your browser is not being "
+"hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable 'Referer' headers, please re-"
+"enable them, at least for this site, or for HTTPS connections, or for 'same-"
+"origin' requests."
+msgstr ""
+
+msgid ""
+"If you are using the tag or "
+"including the 'Referrer-Policy: no-referrer' header, please remove them. The "
+"CSRF protection requires the 'Referer' header to do strict referer checking. "
+"If you're concerned about privacy, use alternatives like for links to third-party sites."
+msgstr ""
+
+msgid ""
+"You are seeing this message because this site requires a CSRF cookie when "
+"submitting forms. This cookie is required for security reasons, to ensure "
+"that your browser is not being hijacked by third parties."
+msgstr ""
+
+msgid ""
+"If you have configured your browser to disable cookies, please re-enable "
+"them, at least for this site, or for 'same-origin' requests."
+msgstr ""
+
+msgid "More information is available with DEBUG=True."
+msgstr ""
+
+msgid "No year specified"
+msgstr "कोई साल निर्दिष्ट नहीं किया गया "
+
+msgid "Date out of range"
+msgstr ""
+
+msgid "No month specified"
+msgstr "कोई महीने निर्दिष्ट नहीं किया गया "
+
+msgid "No day specified"
+msgstr "कोई दिन निर्दिष्ट नहीं किया गया "
+
+msgid "No week specified"
+msgstr "कोई सप्ताह निर्दिष्ट नहीं किया गया "
+
+#, python-format
+msgid "No %(verbose_name_plural)s available"
+msgstr "%(verbose_name_plural)s उपलब्ध नहीं है"
+
+#, python-format
+msgid ""
+"Future %(verbose_name_plural)s not available because %(class_name)s."
+"allow_future is False."
+msgstr ""
+"भविष्य %(verbose_name_plural)s उपलब्ध नहीं है क्योंकि %(class_name)s.allow_future "
+"गलत है."
+
+#, python-format
+msgid "Invalid date string '%(datestr)s' given format '%(format)s'"
+msgstr "तिथि स्ट्रिंग '%(datestr)s' दिया गया प्रारूप '%(format)s' अवैध है "
+
+#, python-format
+msgid "No %(verbose_name)s found matching the query"
+msgstr " इस प्रश्न %(verbose_name)s से मेल नहीं खाते है"
+
+msgid "Page is not 'last', nor can it be converted to an int."
+msgstr "पृष्ठ 'अंतिम' नहीं है और न ही यह एक पूर्णांक के लिए परिवर्तित किया जा सकता है."
+
+#, python-format
+msgid "Invalid page (%(page_number)s): %(message)s"
+msgstr "अवैध पन्ना (%(page_number)s): %(message)s"
+
+#, python-format
+msgid "Empty list and '%(class_name)s.allow_empty' is False."
+msgstr "रिक्त सूची और '%(class_name)s.allow_empty' गलत है."
+
+msgid "Directory indexes are not allowed here."
+msgstr "निर्देशिका अनुक्रमित की अनुमति यहाँ नहीं है."
+
+#, python-format
+msgid "\"%(path)s\" does not exist"
+msgstr "\"%(path)s\" मौजूद नहीं है"
+
+#, python-format
+msgid "Index of %(directory)s"
+msgstr "%(directory)s का अनुक्रमणिका"
+
+msgid "Django: the Web framework for perfectionists with deadlines."
+msgstr ""
+
+#, python-format
+msgid ""
+"View release notes for Django %(version)s"
+msgstr ""
+
+msgid "The install worked successfully! Congratulations!"
+msgstr ""
+
+#, python-format
+msgid ""
+"You are seeing this page because DEBUG=True is in your settings file and you have not configured any "
+"URLs."
+msgstr ""
+
+msgid "Django Documentation"
+msgstr ""
+
+msgid "Topics, references, & how-to's"
+msgstr ""
+
+msgid "Tutorial: A Polling App"
+msgstr ""
+
+msgid "Get started with Django"
+msgstr ""
+
+msgid "Django Community"
+msgstr ""
+
+msgid "Connect, get help, or contribute"
+msgstr ""
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__init__.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..4888903
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-37.pyc b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-37.pyc
new file mode 100644
index 0000000..28fd74f
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-37.pyc differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/formats.py b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/formats.py
new file mode 100644
index 0000000..799168d
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hi/formats.py
@@ -0,0 +1,21 @@
+# This file is distributed under the same license as the Django package.
+#
+# The *_FORMAT strings use the Django date format syntax,
+# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = 'j F Y'
+TIME_FORMAT = 'g:i A'
+# DATETIME_FORMAT =
+# YEAR_MONTH_FORMAT =
+MONTH_DAY_FORMAT = 'j F'
+SHORT_DATE_FORMAT = 'd-m-Y'
+# SHORT_DATETIME_FORMAT =
+# FIRST_DAY_OF_WEEK =
+
+# The *_INPUT_FORMATS strings use the Python strftime format syntax,
+# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
+# DATE_INPUT_FORMATS =
+# TIME_INPUT_FORMATS =
+# DATETIME_INPUT_FORMATS =
+DECIMAL_SEPARATOR = '.'
+THOUSAND_SEPARATOR = ','
+# NUMBER_GROUPING =
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e7cd598
Binary files /dev/null and b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo differ
diff --git a/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..084ef35
--- /dev/null
+++ b/geekshop/django_2.0/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po
@@ -0,0 +1,1277 @@
+# This file is distributed under the same license as the Django package.
+#
+# Translators:
+# aljosa , 2011,2013
+# berislavlopac , 2013
+# Bojan Mihelač