__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

www-data@216.73.216.228: ~ $
# -*- coding: utf-8 -*-
#
# python-json-patch - An implementation of the JSON Patch format
# https://github.com/stefankoegl/python-json-patch
#
# Copyright (c) 2011 Stefan Kögl <stefan@skoegl.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

""" Apply JSON-Patches (RFC 6902) """

from __future__ import unicode_literals

import collections
import copy
import functools
import json
import sys
try:
    from types import MappingProxyType
except ImportError:
    # Python < 3.3
    MappingProxyType = dict

from jsonpointer import JsonPointer, JsonPointerException


_ST_ADD = 0
_ST_REMOVE = 1


try:
    from collections.abc import MutableMapping, MutableSequence

except ImportError:
    from collections import MutableMapping, MutableSequence
    str = unicode

# Will be parsed by setup.py to determine package metadata
__author__ = 'Stefan Kögl <stefan@skoegl.net>'
__version__ = '1.32'
__website__ = 'https://github.com/stefankoegl/python-json-patch'
__license__ = 'Modified BSD License'


# pylint: disable=E0611,W0404
if sys.version_info >= (3, 0):
    basestring = (bytes, str)  # pylint: disable=C0103,W0622


class JsonPatchException(Exception):
    """Base Json Patch exception"""


class InvalidJsonPatch(JsonPatchException):
    """ Raised if an invalid JSON Patch is created """


class JsonPatchConflict(JsonPatchException):
    """Raised if patch could not be applied due to conflict situation such as:
    - attempt to add object key when it already exists;
    - attempt to operate with nonexistence object key;
    - attempt to insert value to array at position beyond its size;
    - etc.
    """


class JsonPatchTestFailed(JsonPatchException, AssertionError):
    """ A Test operation failed """


def multidict(ordered_pairs):
    """Convert duplicate keys values to lists."""
    # read all values into lists
    mdict = collections.defaultdict(list)
    for key, value in ordered_pairs:
        mdict[key].append(value)

    return dict(
        # unpack lists that have only 1 item
        (key, values[0] if len(values) == 1 else values)
        for key, values in mdict.items()
    )


# The "object_pairs_hook" parameter is used to handle duplicate keys when
# loading a JSON object.
_jsonloads = functools.partial(json.loads, object_pairs_hook=multidict)


def apply_patch(doc, patch, in_place=False, pointer_cls=JsonPointer):
    """Apply list of patches to specified json document.

    :param doc: Document object.
    :type doc: dict

    :param patch: JSON patch as list of dicts or raw JSON-encoded string.
    :type patch: list or str

    :param in_place: While :const:`True` patch will modify target document.
                     By default patch will be applied to document copy.
    :type in_place: bool

    :param pointer_cls: JSON pointer class to use.
    :type pointer_cls: Type[JsonPointer]

    :return: Patched document object.
    :rtype: dict

    >>> doc = {'foo': 'bar'}
    >>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}]
    >>> other = apply_patch(doc, patch)
    >>> doc is not other
    True
    >>> other == {'foo': 'bar', 'baz': 'qux'}
    True
    >>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}]
    >>> apply_patch(doc, patch, in_place=True) == {'foo': 'bar', 'baz': 'qux'}
    True
    >>> doc == other
    True
    """

    if isinstance(patch, basestring):
        patch = JsonPatch.from_string(patch, pointer_cls=pointer_cls)
    else:
        patch = JsonPatch(patch, pointer_cls=pointer_cls)
    return patch.apply(doc, in_place)


def make_patch(src, dst, pointer_cls=JsonPointer):
    """Generates patch by comparing two document objects. Actually is
    a proxy to :meth:`JsonPatch.from_diff` method.

    :param src: Data source document object.
    :type src: dict

    :param dst: Data source document object.
    :type dst: dict

    :param pointer_cls: JSON pointer class to use.
    :type pointer_cls: Type[JsonPointer]

    >>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
    >>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]}
    >>> patch = make_patch(src, dst)
    >>> new = patch.apply(src)
    >>> new == dst
    True
    """

    return JsonPatch.from_diff(src, dst, pointer_cls=pointer_cls)


class PatchOperation(object):
    """A single operation inside a JSON Patch."""

    def __init__(self, operation, pointer_cls=JsonPointer):
        self.pointer_cls = pointer_cls

        if not operation.__contains__('path'):
            raise InvalidJsonPatch("Operation must have a 'path' member")

        if isinstance(operation['path'], self.pointer_cls):
            self.location = operation['path'].path
            self.pointer = operation['path']
        else:
            self.location = operation['path']
            try:
                self.pointer = self.pointer_cls(self.location)
            except TypeError as ex:
                raise InvalidJsonPatch("Invalid 'path'")

        self.operation = operation

    def apply(self, obj):
        """Abstract method that applies a patch operation to the specified object."""
        raise NotImplementedError('should implement the patch operation.')

    def __hash__(self):
        return hash(frozenset(self.operation.items()))

    def __eq__(self, other):
        if not isinstance(other, PatchOperation):
            return False
        return self.operation == other.operation

    def __ne__(self, other):
        return not(self == other)

    @property
    def path(self):
        return '/'.join(self.pointer.parts[:-1])

    @property
    def key(self):
        try:
            return int(self.pointer.parts[-1])
        except ValueError:
            return self.pointer.parts[-1]

    @key.setter
    def key(self, value):
        self.pointer.parts[-1] = str(value)
        self.location = self.pointer.path
        self.operation['path'] = self.location


class RemoveOperation(PatchOperation):
    """Removes an object property or an array element."""

    def apply(self, obj):
        subobj, part = self.pointer.to_last(obj)
        try:
            del subobj[part]
        except (KeyError, IndexError) as ex:
            msg = "can't remove a non-existent object '{0}'".format(part)
            raise JsonPatchConflict(msg)

        return obj

    def _on_undo_remove(self, path, key):
        if self.path == path:
            if self.key >= key:
                self.key += 1
            else:
                key -= 1
        return key

    def _on_undo_add(self, path, key):
        if self.path == path:
            if self.key > key:
                self.key -= 1
            else:
                key -= 1
        return key


class AddOperation(PatchOperation):
    """Adds an object property or an array element."""

    def apply(self, obj):
        try:
            value = self.operation["value"]
        except KeyError as ex:
            raise InvalidJsonPatch(
                "The operation does not contain a 'value' member")

        subobj, part = self.pointer.to_last(obj)

        if isinstance(subobj, MutableSequence):
            if part == '-':
                subobj.append(value)  # pylint: disable=E1103

            elif part > len(subobj) or part < 0:
                raise JsonPatchConflict("can't insert outside of list")

            else:
                subobj.insert(part, value)  # pylint: disable=E1103

        elif isinstance(subobj, MutableMapping):
            if part is None:
                obj = value  # we're replacing the root
            else:
                subobj[part] = value

        else:
            if part is None:
                raise TypeError("invalid document type {0}".format(type(subobj)))
            else:
                raise JsonPatchConflict("unable to fully resolve json pointer {0}, part {1}".format(self.location, part))
        return obj

    def _on_undo_remove(self, path, key):
        if self.path == path:
            if self.key > key:
                self.key += 1
            else:
                key += 1
        return key

    def _on_undo_add(self, path, key):
        if self.path == path:
            if self.key > key:
                self.key -= 1
            else:
                key += 1
        return key


class ReplaceOperation(PatchOperation):
    """Replaces an object property or an array element by a new value."""

    def apply(self, obj):
        try:
            value = self.operation["value"]
        except KeyError as ex:
            raise InvalidJsonPatch(
                "The operation does not contain a 'value' member")

        subobj, part = self.pointer.to_last(obj)

        if part is None:
            return value

        if part == "-":
            raise InvalidJsonPatch("'path' with '-' can't be applied to 'replace' operation")

        if isinstance(subobj, MutableSequence):
            if part >= len(subobj) or part < 0:
                raise JsonPatchConflict("can't replace outside of list")

        elif isinstance(subobj, MutableMapping):
            if part not in subobj:
                msg = "can't replace a non-existent object '{0}'".format(part)
                raise JsonPatchConflict(msg)
        else:
            if part is None:
                raise TypeError("invalid document type {0}".format(type(subobj)))
            else:
                raise JsonPatchConflict("unable to fully resolve json pointer {0}, part {1}".format(self.location, part))

        subobj[part] = value
        return obj

    def _on_undo_remove(self, path, key):
        return key

    def _on_undo_add(self, path, key):
        return key


class MoveOperation(PatchOperation):
    """Moves an object property or an array element to a new location."""

    def apply(self, obj):
        try:
            if isinstance(self.operation['from'], self.pointer_cls):
                from_ptr = self.operation['from']
            else:
                from_ptr = self.pointer_cls(self.operation['from'])
        except KeyError as ex:
            raise InvalidJsonPatch(
                "The operation does not contain a 'from' member")

        subobj, part = from_ptr.to_last(obj)
        try:
            value = subobj[part]
        except (KeyError, IndexError) as ex:
            raise JsonPatchConflict(str(ex))

        # If source and target are equal, this is a no-op
        if self.pointer == from_ptr:
            return obj

        if isinstance(subobj, MutableMapping) and \
                self.pointer.contains(from_ptr):
            raise JsonPatchConflict('Cannot move values into their own children')

        obj = RemoveOperation({
            'op': 'remove',
            'path': self.operation['from']
        }, pointer_cls=self.pointer_cls).apply(obj)

        obj = AddOperation({
            'op': 'add',
            'path': self.location,
            'value': value
        }, pointer_cls=self.pointer_cls).apply(obj)

        return obj

    @property
    def from_path(self):
        from_ptr = self.pointer_cls(self.operation['from'])
        return '/'.join(from_ptr.parts[:-1])

    @property
    def from_key(self):
        from_ptr = self.pointer_cls(self.operation['from'])
        try:
            return int(from_ptr.parts[-1])
        except TypeError:
            return from_ptr.parts[-1]

    @from_key.setter
    def from_key(self, value):
        from_ptr = self.pointer_cls(self.operation['from'])
        from_ptr.parts[-1] = str(value)
        self.operation['from'] = from_ptr.path

    def _on_undo_remove(self, path, key):
        if self.from_path == path:
            if self.from_key >= key:
                self.from_key += 1
            else:
                key -= 1
        if self.path == path:
            if self.key > key:
                self.key += 1
            else:
                key += 1
        return key

    def _on_undo_add(self, path, key):
        if self.from_path == path:
            if self.from_key > key:
                self.from_key -= 1
            else:
                key -= 1
        if self.path == path:
            if self.key > key:
                self.key -= 1
            else:
                key += 1
        return key


class TestOperation(PatchOperation):
    """Test value by specified location."""

    def apply(self, obj):
        try:
            subobj, part = self.pointer.to_last(obj)
            if part is None:
                val = subobj
            else:
                val = self.pointer.walk(subobj, part)
        except JsonPointerException as ex:
            raise JsonPatchTestFailed(str(ex))

        try:
            value = self.operation['value']
        except KeyError as ex:
            raise InvalidJsonPatch(
                "The operation does not contain a 'value' member")

        if val != value:
            msg = '{0} ({1}) is not equal to tested value {2} ({3})'
            raise JsonPatchTestFailed(msg.format(val, type(val),
                                                 value, type(value)))

        return obj


class CopyOperation(PatchOperation):
    """ Copies an object property or an array element to a new location """

    def apply(self, obj):
        try:
            from_ptr = self.pointer_cls(self.operation['from'])
        except KeyError as ex:
            raise InvalidJsonPatch(
                "The operation does not contain a 'from' member")

        subobj, part = from_ptr.to_last(obj)
        try:
            value = copy.deepcopy(subobj[part])
        except (KeyError, IndexError) as ex:
            raise JsonPatchConflict(str(ex))

        obj = AddOperation({
            'op': 'add',
            'path': self.location,
            'value': value
        }, pointer_cls=self.pointer_cls).apply(obj)

        return obj


class JsonPatch(object):
    json_dumper = staticmethod(json.dumps)
    json_loader = staticmethod(_jsonloads)

    operations = MappingProxyType({
        'remove': RemoveOperation,
        'add': AddOperation,
        'replace': ReplaceOperation,
        'move': MoveOperation,
        'test': TestOperation,
        'copy': CopyOperation,
    })

    """A JSON Patch is a list of Patch Operations.

    >>> patch = JsonPatch([
    ...     {'op': 'add', 'path': '/foo', 'value': 'bar'},
    ...     {'op': 'add', 'path': '/baz', 'value': [1, 2, 3]},
    ...     {'op': 'remove', 'path': '/baz/1'},
    ...     {'op': 'test', 'path': '/baz', 'value': [1, 3]},
    ...     {'op': 'replace', 'path': '/baz/0', 'value': 42},
    ...     {'op': 'remove', 'path': '/baz/1'},
    ... ])
    >>> doc = {}
    >>> result = patch.apply(doc)
    >>> expected = {'foo': 'bar', 'baz': [42]}
    >>> result == expected
    True

    JsonPatch object is iterable, so you can easily access each patch
    statement in a loop:

    >>> lpatch = list(patch)
    >>> expected = {'op': 'add', 'path': '/foo', 'value': 'bar'}
    >>> lpatch[0] == expected
    True
    >>> lpatch == patch.patch
    True

    Also JsonPatch could be converted directly to :class:`bool` if it contains
    any operation statements:

    >>> bool(patch)
    True
    >>> bool(JsonPatch([]))
    False

    This behavior is very handy with :func:`make_patch` to write more readable
    code:

    >>> old = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
    >>> new = {'baz': 'qux', 'numbers': [1, 4, 7]}
    >>> patch = make_patch(old, new)
    >>> if patch:
    ...     # document have changed, do something useful
    ...     patch.apply(old)    #doctest: +ELLIPSIS
    {...}
    """
    def __init__(self, patch, pointer_cls=JsonPointer):
        self.patch = patch
        self.pointer_cls = pointer_cls

        # Verify that the structure of the patch document
        # is correct by retrieving each patch element.
        # Much of the validation is done in the initializer
        # though some is delayed until the patch is applied.
        for op in self.patch:
            self._get_operation(op)

    def __str__(self):
        """str(self) -> self.to_string()"""
        return self.to_string()

    def __bool__(self):
        return bool(self.patch)

    __nonzero__ = __bool__

    def __iter__(self):
        return iter(self.patch)

    def __hash__(self):
        return hash(tuple(self._ops))

    def __eq__(self, other):
        if not isinstance(other, JsonPatch):
            return False
        return self._ops == other._ops

    def __ne__(self, other):
        return not(self == other)

    @classmethod
    def from_string(cls, patch_str, loads=None, pointer_cls=JsonPointer):
        """Creates JsonPatch instance from string source.

        :param patch_str: JSON patch as raw string.
        :type patch_str: str

        :param loads: A function of one argument that loads a serialized
                      JSON string.
        :type loads: function

        :param pointer_cls: JSON pointer class to use.
        :type pointer_cls: Type[JsonPointer]

        :return: :class:`JsonPatch` instance.
        """
        json_loader = loads or cls.json_loader
        patch = json_loader(patch_str)
        return cls(patch, pointer_cls=pointer_cls)

    @classmethod
    def from_diff(
            cls, src, dst, optimization=True, dumps=None,
            pointer_cls=JsonPointer,
    ):
        """Creates JsonPatch instance based on comparison of two document
        objects. Json patch would be created for `src` argument against `dst`
        one.

        :param src: Data source document object.
        :type src: dict

        :param dst: Data source document object.
        :type dst: dict

        :param dumps: A function of one argument that produces a serialized
                      JSON string.
        :type dumps: function

        :param pointer_cls: JSON pointer class to use.
        :type pointer_cls: Type[JsonPointer]

        :return: :class:`JsonPatch` instance.

        >>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
        >>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]}
        >>> patch = JsonPatch.from_diff(src, dst)
        >>> new = patch.apply(src)
        >>> new == dst
        True
        """
        json_dumper = dumps or cls.json_dumper
        builder = DiffBuilder(src, dst, json_dumper, pointer_cls=pointer_cls)
        builder._compare_values('', None, src, dst)
        ops = list(builder.execute())
        return cls(ops, pointer_cls=pointer_cls)

    def to_string(self, dumps=None):
        """Returns patch set as JSON string."""
        json_dumper = dumps or self.json_dumper
        return json_dumper(self.patch)

    @property
    def _ops(self):
        return tuple(map(self._get_operation, self.patch))

    def apply(self, obj, in_place=False):
        """Applies the patch to a given object.

        :param obj: Document object.
        :type obj: dict

        :param in_place: Tweaks the way how patch would be applied - directly to
                         specified `obj` or to its copy.
        :type in_place: bool

        :return: Modified `obj`.
        """

        if not in_place:
            obj = copy.deepcopy(obj)

        for operation in self._ops:
            obj = operation.apply(obj)

        return obj

    def _get_operation(self, operation):
        if 'op' not in operation:
            raise InvalidJsonPatch("Operation does not contain 'op' member")

        op = operation['op']

        if not isinstance(op, basestring):
            raise InvalidJsonPatch("Operation must be a string")

        if op not in self.operations:
            raise InvalidJsonPatch("Unknown operation {0!r}".format(op))

        cls = self.operations[op]
        return cls(operation, pointer_cls=self.pointer_cls)


class DiffBuilder(object):

    def __init__(self, src_doc, dst_doc, dumps=json.dumps, pointer_cls=JsonPointer):
        self.dumps = dumps
        self.pointer_cls = pointer_cls
        self.index_storage = [{}, {}]
        self.index_storage2 = [[], []]
        self.__root = root = []
        self.src_doc = src_doc
        self.dst_doc = dst_doc
        root[:] = [root, root, None]

    def store_index(self, value, index, st):
        typed_key = (value, type(value))
        try:
            storage = self.index_storage[st]
            stored = storage.get(typed_key)
            if stored is None:
                storage[typed_key] = [index]
            else:
                storage[typed_key].append(index)

        except TypeError:
            self.index_storage2[st].append((typed_key, index))

    def take_index(self, value, st):
        typed_key = (value, type(value))
        try:
            stored = self.index_storage[st].get(typed_key)
            if stored:
                return stored.pop()

        except TypeError:
            storage = self.index_storage2[st]
            for i in range(len(storage)-1, -1, -1):
                if storage[i][0] == typed_key:
                    return storage.pop(i)[1]

    def insert(self, op):
        root = self.__root
        last = root[0]
        last[1] = root[0] = [last, root, op]
        return root[0]

    def remove(self, index):
        link_prev, link_next, _ = index
        link_prev[1] = link_next
        link_next[0] = link_prev
        index[:] = []

    def iter_from(self, start):
        root = self.__root
        curr = start[1]
        while curr is not root:
            yield curr[2]
            curr = curr[1]

    def __iter__(self):
        root = self.__root
        curr = root[1]
        while curr is not root:
            yield curr[2]
            curr = curr[1]

    def execute(self):
        root = self.__root
        curr = root[1]
        while curr is not root:
            if curr[1] is not root:
                op_first, op_second = curr[2], curr[1][2]
                if op_first.location == op_second.location and \
                        type(op_first) == RemoveOperation and \
                        type(op_second) == AddOperation:
                    yield ReplaceOperation({
                        'op': 'replace',
                        'path': op_second.location,
                        'value': op_second.operation['value'],
                    }, pointer_cls=self.pointer_cls).operation
                    curr = curr[1][1]
                    continue

            yield curr[2].operation
            curr = curr[1]

    def _item_added(self, path, key, item):
        index = self.take_index(item, _ST_REMOVE)
        if index is not None:
            op = index[2]
            if type(op.key) == int and type(key) == int:
                for v in self.iter_from(index):
                    op.key = v._on_undo_remove(op.path, op.key)

            self.remove(index)
            if op.location != _path_join(path, key):
                new_op = MoveOperation({
                    'op': 'move',
                    'from': op.location,
                    'path': _path_join(path, key),
                }, pointer_cls=self.pointer_cls)
                self.insert(new_op)
        else:
            new_op = AddOperation({
                'op': 'add',
                'path': _path_join(path, key),
                'value': item,
            }, pointer_cls=self.pointer_cls)
            new_index = self.insert(new_op)
            self.store_index(item, new_index, _ST_ADD)

    def _item_removed(self, path, key, item):
        new_op = RemoveOperation({
            'op': 'remove',
            'path': _path_join(path, key),
        }, pointer_cls=self.pointer_cls)
        index = self.take_index(item, _ST_ADD)
        new_index = self.insert(new_op)
        if index is not None:
            op = index[2]
            # We can't rely on the op.key type since PatchOperation casts
            # the .key property to int and this path wrongly ends up being taken
            # for numeric string dict keys while the intention is to only handle lists.
            # So we do an explicit check on the item affected by the op instead.
            added_item = op.pointer.to_last(self.dst_doc)[0]
            if type(added_item) == list:
                for v in self.iter_from(index):
                    op.key = v._on_undo_add(op.path, op.key)

            self.remove(index)
            if new_op.location != op.location:
                new_op = MoveOperation({
                    'op': 'move',
                    'from': new_op.location,
                    'path': op.location,
                }, pointer_cls=self.pointer_cls)
                new_index[2] = new_op

            else:
                self.remove(new_index)

        else:
            self.store_index(item, new_index, _ST_REMOVE)

    def _item_replaced(self, path, key, item):
        self.insert(ReplaceOperation({
            'op': 'replace',
            'path': _path_join(path, key),
            'value': item,
        }, pointer_cls=self.pointer_cls))

    def _compare_dicts(self, path, src, dst):
        src_keys = set(src.keys())
        dst_keys = set(dst.keys())
        added_keys = dst_keys - src_keys
        removed_keys = src_keys - dst_keys

        for key in removed_keys:
            self._item_removed(path, str(key), src[key])

        for key in added_keys:
            self._item_added(path, str(key), dst[key])

        for key in src_keys & dst_keys:
            self._compare_values(path, key, src[key], dst[key])

    def _compare_lists(self, path, src, dst):
        len_src, len_dst = len(src), len(dst)
        max_len = max(len_src, len_dst)
        min_len = min(len_src, len_dst)
        for key in range(max_len):
            if key < min_len:
                old, new = src[key], dst[key]
                if old == new:
                    continue

                elif isinstance(old, MutableMapping) and \
                    isinstance(new, MutableMapping):
                    self._compare_dicts(_path_join(path, key), old, new)

                elif isinstance(old, MutableSequence) and \
                        isinstance(new, MutableSequence):
                    self._compare_lists(_path_join(path, key), old, new)

                else:
                    self._item_removed(path, key, old)
                    self._item_added(path, key, new)

            elif len_src > len_dst:
                self._item_removed(path, len_dst, src[key])

            else:
                self._item_added(path, key, dst[key])

    def _compare_values(self, path, key, src, dst):
        if isinstance(src, MutableMapping) and \
                isinstance(dst, MutableMapping):
            self._compare_dicts(_path_join(path, key), src, dst)

        elif isinstance(src, MutableSequence) and \
                isinstance(dst, MutableSequence):
            self._compare_lists(_path_join(path, key), src, dst)

        # To ensure we catch changes to JSON, we can't rely on a simple
        # src == dst, because it would not recognize the difference between
        # 1 and True, among other things. Using json.dumps is the most
        # fool-proof way to ensure we catch type changes that matter to JSON
        # and ignore those that don't. The performance of this could be
        # improved by doing more direct type checks, but we'd need to be
        # careful to accept type changes that don't matter when JSONified.
        elif self.dumps(src) == self.dumps(dst):
            return

        else:
            self._item_replaced(path, key, dst)


def _path_join(path, key):
    if key is None:
        return path

    return path + '/' + str(key).replace('~', '~0').replace('/', '~1')

Filemanager

Name Type Size Permission Actions
ConfigArgParse-1.7.egg-info Folder 0755
Cryptodome Folder 0755
Jetson-stubs Folder 0755
MarkupSafe-2.1.5.egg-info Folder 0755
MySQLdb-stubs Folder 0755
OpenEXR-1.3.10.egg-info Folder 0755
OpenGL Folder 0755
OpenSSL Folder 0755
OpenSSL-stubs Folder 0755
PIL Folder 0755
PyGObject-3.50.0.dist-info Folder 0755
PyICU-2.14.egg-info Folder 0755
PyInstaller-stubs Folder 0755
PyQt5 Folder 0755
PyQt5-5.15.11.dist-info Folder 0755
PyQt5_sip-12.17.0.dist-info Folder 0755
PyYAML-6.0.2.dist-info Folder 0755
RPi Folder 0755
RPi-stubs Folder 0755
RPiKeyboardConfig Folder 0755
RTIMULib-7.2.1.egg-info Folder 0755
Send2Trash-1.8.3.dist-info Folder 0755
Xlib-stubs Folder 0755
__pycache__ Folder 0755
_cffi_backend-stubs Folder 0755
_distutils_hack Folder 0755
_win32typing-stubs Folder 0755
_yaml Folder 0755
acme Folder 0755
acme-4.0.0.egg-info Folder 0755
aiofiles-stubs Folder 0755
antlr4-stubs Folder 0755
anyio Folder 0755
anyio-4.8.0.dist-info Folder 0755
apt Folder 0755
apt_inst-stubs Folder 0755
apt_listchanges Folder 0755
apt_listchanges-4.8.dist-info Folder 0755
apt_pkg-stubs Folder 0755
aptsources Folder 0755
arrow Folder 0755
arrow-1.3.0.dist-info Folder 0755
assertpy-stubs Folder 0755
astroid Folder 0755
astroid-3.3.8.dist-info Folder 0755
asttokens Folder 0755
asttokens-3.0.0.dist-info Folder 0755
atheris-stubs Folder 0755
attr Folder 0755
attrs Folder 0755
attrs-25.3.0.dist-info Folder 0755
augeas Folder 0755
autocommand Folder 0755
autocommand-2.2.2.dist-info Folder 0755
av Folder 0755
av-14.2.0.dist-info Folder 0755
aws_xray_sdk-stubs Folder 0755
babel Folder 0755
babel-2.17.0.egg-info Folder 0755
bcrypt Folder 0755
bcrypt-4.2.0.dist-info Folder 0755
beautifulsoup4-4.13.4.dist-info Folder 0755
bleach-stubs Folder 0755
blinker Folder 0755
blinker-1.9.0.dist-info Folder 0755
boltons-stubs Folder 0755
braintree-stubs Folder 0755
bs4 Folder 0755
bs4-stubs Folder 0755
bugbear-stubs Folder 0755
cachetools-stubs Folder 0755
cairo Folder 0755
caldav-stubs Folder 0755
capturer-stubs Folder 0755
certbot Folder 0755
certbot-4.0.0.egg-info Folder 0755
certbot_apache Folder 0755
certbot_apache-4.0.0.egg-info Folder 0755
certifi Folder 0755
certifi-2025.1.31.egg-info Folder 0755
cffi-stubs Folder 0755
chardet Folder 0755
chardet-5.2.0.dist-info Folder 0755
charset_normalizer Folder 0755
charset_normalizer-3.4.2.dist-info Folder 0755
chevron-stubs Folder 0755
click Folder 0755
click-8.1.8.dist-info Folder 0755
click_default_group-stubs Folder 0755
click_spinner-stubs Folder 0755
cloud_init-25.2.egg-info Folder 0755
cloudinit Folder 0755
colorama-stubs Folder 0755
colorzero Folder 0755
colorzero-2.0.egg-info Folder 0755
commctrl-stubs Folder 0755
commonmark-stubs Folder 0755
configobj Folder 0755
configobj-5.0.9.dist-info Folder 0755
consolemenu-stubs Folder 0755
corus-stubs Folder 0755
croniter-stubs Folder 0755
cronlog-stubs Folder 0755
crontab-stubs Folder 0755
crontabs-stubs Folder 0755
cryptography Folder 0755
cryptography-43.0.0.dist-info Folder 0755
cssselect Folder 0755
cssselect-1.3.0.egg-info Folder 0755
cupshelpers Folder 0755
cupshelpers-1.0.egg-info Folder 0755
datemath-stubs Folder 0755
dateparser-stubs Folder 0755
dateparser_data-stubs Folder 0755
dateutil Folder 0755
dateutil-stubs Folder 0755
dbus Folder 0755
dbus_python-1.4.0.egg-info Folder 0755
dde-stubs Folder 0755
decorator-stubs Folder 0755
defusedxml-stubs Folder 0755
deprecated-stubs Folder 0755
dill Folder 0755
dill-0.4.0.dist-info Folder 0755
distro Folder 0755
distro-1.9.0.dist-info Folder 0755
distutils-stubs Folder 0755
dns Folder 0755
dnspython-2.7.0.dist-info Folder 0755
docker-stubs Folder 0755
dockerfile_parse-stubs Folder 0755
docutils Folder 0755
docutils-0.21.2.dist-info Folder 0755
docutils-stubs Folder 0755
editdistance-stubs Folder 0755
entrypoints-stubs Folder 0755
exifread-stubs Folder 0755
fanstatic-stubs Folder 0755
farmhash-stubs Folder 0755
first-stubs Folder 0755
flake8-stubs Folder 0755
flake8_builtins-stubs Folder 0755
flake8_docstrings-stubs Folder 0755
flake8_rst_docstrings-stubs Folder 0755
flake8_simplify-stubs Folder 0755
flake8_typing_imports-stubs Folder 0755
flask_cors-stubs Folder 0755
flask_migrate-stubs Folder 0755
flask_socketio-stubs Folder 0755
fpdf-stubs Folder 0755
fqdn Folder 0755
fqdn-1.5.1.egg-info Folder 0755
freetype Folder 0755
freetype_py-2.5.1.dist-info Folder 0755
gdb-stubs Folder 0755
gevent-stubs Folder 0755
gi Folder 0755
google-stubs Folder 0755
gpg Folder 0755
gpg-1.24.2.egg-info Folder 0755
gpiod Folder 0755
gpiod-2.2.0.dist-info Folder 0755
gpiozero Folder 0755
gpiozero-2.0.1.egg-info Folder 0755
gpiozerocli Folder 0755
greenlet-stubs Folder 0755
h11 Folder 0755
h11-0.14.0.egg-info Folder 0755
h2 Folder 0755
h2-4.2.0.dist-info Folder 0755
hdbcli-stubs Folder 0755
hpack Folder 0755
hpack-4.0.0.egg-info Folder 0755
html5lib Folder 0755
html5lib-stubs Folder 0755
html5lib_modern-1.2.egg-info Folder 0755
httpcore Folder 0755
httpcore-1.0.7.dist-info Folder 0755
httplib2-stubs Folder 0755
httpx Folder 0755
httpx-0.28.1.dist-info Folder 0755
humanfriendly-stubs Folder 0755
hvac-stubs Folder 0755
hyperframe Folder 0755
hyperframe-6.0.0.egg-info Folder 0755
ibm_db-stubs Folder 0755
icalendar-stubs Folder 0755
icu Folder 0755
idna Folder 0755
idna-3.10.dist-info Folder 0755
inflect Folder 0755
inflect-7.3.1.dist-info Folder 0755
influxdb_client-stubs Folder 0755
inifile-stubs Folder 0755
isapi-stubs Folder 0755
isoduration Folder 0755
isoduration-20.11.0.egg-info Folder 0755
isort Folder 0755
isort-6.0.1.dist-info Folder 0755
jack-stubs Folder 0755
jaraco Folder 0755
jaraco.functools-4.1.0.dist-info Folder 0755
jaraco.text-4.0.0.dist-info Folder 0755
jaraco_context-6.0.1.dist-info Folder 0755
jedi Folder 0755
jedi-0.19.1.egg-info Folder 0755
jenkins-stubs Folder 0755
jinja2 Folder 0755
jinja2-3.1.6.dist-info Folder 0755
jks-stubs Folder 0755
jmespath-stubs Folder 0755
jose-stubs Folder 0755
josepy Folder 0755
josepy-2.0.0.dist-info Folder 0755
jsonpatch-1.32.egg-info Folder 0755
jsonpointer-2.4.egg-info Folder 0755
jsonschema Folder 0755
jsonschema-4.19.2.dist-info Folder 0755
jsonschema-stubs Folder 0755
jsonschema_specifications Folder 0755
jsonschema_specifications-2023.12.1.dist-info Folder 0755
jwcrypto-stubs Folder 0755
jwt Folder 0755
keyboard-stubs Folder 0755
ldap3-stubs Folder 0755
lgpio-0.2.2.0.egg-info Folder 0755
libarchive Folder 0755
libarchive_c-5.1.egg-info Folder 0755
libcamera Folder 0755
libevdev Folder 0755
libevdev-0.11.egg-info Folder 0755
linkify_it Folder 0755
linkify_it_py-2.0.3.dist-info Folder 0755
logilab Folder 0755
logilab_common-2.1.0.egg-info Folder 0755
lupa-stubs Folder 0755
lxml Folder 0755
lxml-5.4.0.egg-info Folder 0755
lzstring-stubs Folder 0755
m3u8-stubs Folder 0755
markdown Folder 0755
markdown-3.7.dist-info Folder 0755
markdown-stubs Folder 0755
markdown_it Folder 0755
markdown_it_py-3.0.0.dist-info Folder 0755
markupsafe Folder 0755
mccabe-0.7.0.egg-info Folder 0755
mdurl Folder 0755
mdurl-0.1.2.dist-info Folder 0755
meson-1.7.0.egg-info Folder 0755
mesonbuild Folder 0755
mmapfile-stubs Folder 0755
mmsystem-stubs Folder 0755
mock-stubs Folder 0755
more_itertools Folder 0755
more_itertools-10.7.0.dist-info Folder 0755
mypy Folder 0755
mypy-1.15.0.dist-info Folder 0755
mypy_extensions-1.0.0.egg-info Folder 0755
mypy_extensions-stubs Folder 0755
mypyc Folder 0755
nanoid-stubs Folder 0755
netaddr-stubs Folder 0755
netifaces-stubs Folder 0755
netplan Folder 0755
networkx-stubs Folder 0755
nmap-stubs Folder 0755
ntsecuritycon-stubs Folder 0755
numpy Folder 0755
numpy-2.2.4.dist-info Folder 0755
oauthlib Folder 0755
oauthlib-3.2.2.dist-info Folder 0755
oauthlib-stubs Folder 0755
objgraph-stubs Folder 0755
odbc-stubs Folder 0755
olefile Folder 0755
olefile-0.47.egg-info Folder 0755
olefile-stubs Folder 0755
openpyxl-stubs Folder 0755
opentracing-stubs Folder 0755
orjson Folder 0755
orjson-3.10.7.dist-info Folder 0755
packaging Folder 0755
packaging-25.0.dist-info Folder 0755
paramiko-stubs Folder 0755
parsedatetime Folder 0755
parsedatetime-2.6.egg-info Folder 0755
parsimonious-stubs Folder 0755
parso Folder 0755
parso-0.8.4.egg-info Folder 0755
passlib-stubs Folder 0755
passpy-stubs Folder 0755
peewee-stubs Folder 0755
pep8ext_naming-stubs Folder 0755
perfmon-stubs Folder 0755
pexpect Folder 0755
pexpect-4.9.0.egg-info Folder 0755
pexpect-stubs Folder 0755
pgzero Folder 0755
pgzero-1.2.1.dist-info Folder 0755
picamera2 Folder 0755
picamera2-0.3.36.dist-info Folder 0755
pidng Folder 0755
pidng-4.0.9.egg-info Folder 0755
piexif Folder 0755
piexif-1.1.3.egg-info Folder 0755
pika-stubs Folder 0755
pillow-11.1.0.egg-info Folder 0755
pip Folder 0755
pip-25.1.1.dist-info Folder 0755
pkg_resources Folder 0755
pkg_resources-stubs Folder 0755
platformdirs Folder 0755
platformdirs-4.3.7.dist-info Folder 0755
playhouse-stubs Folder 0755
polib-stubs Folder 0755
portpicker-stubs Folder 0755
psutil Folder 0755
psutil-7.0.0.dist-info Folder 0755
psutil-stubs Folder 0755
psycopg2-stubs Folder 0755
ptyprocess Folder 0755
ptyprocess-0.7.0.dist-info Folder 0755
pyOpenSSL-25.0.0.egg-info Folder 0755
pyRFC3339-2.0.1.dist-info Folder 0755
pyasn1-stubs Folder 0755
pyaudio-stubs Folder 0755
pyautogui-stubs Folder 0755
pycairo-1.27.0.dist-info Folder 0755
pycocotools-stubs Folder 0755
pycryptodomex-3.20.0.egg-info Folder 0755
pycups-2.0.4.dist-info Folder 0755
pycurl-stubs Folder 0755
pyflakes-stubs Folder 0755
pygame Folder 0755
pygame-2.6.1.egg-info Folder 0755
pygit2-stubs Folder 0755
pygments Folder 0755
pygments-2.18.0.dist-info Folder 0755
pygments-stubs Folder 0755
pygtkcompat Folder 0755
pyi_splash-stubs Folder 0755
pyjwt-2.10.1.dist-info Folder 0755
pykms Folder 0755
pylint Folder 0755
pylint-3.3.4.dist-info Folder 0755
pymysql-stubs Folder 0755
pynput-stubs Folder 0755
pyopengl-3.1.9.dist-info Folder 0755
pyrfc3339 Folder 0755
pyrfc3339-stubs Folder 0755
pyscreeze-stubs Folder 0755
pyserial-3.5.egg-info Folder 0755
pysftp-stubs Folder 0755
pysmbc-1.0.25.1.egg-info Folder 0755
pytest_lazyfixture-stubs Folder 0755
python_apt-3.0.0.egg-info Folder 0755
python_augeas-1.2.0.egg-info Folder 0755
python_dateutil-2.9.0.dist-info Folder 0755
python_http_client-stubs Folder 0755
python_prctl-1.8.1.egg-info Folder 0755
pythoncom-stubs Folder 0755
pythonwin-stubs Folder 0755
pytz Folder 0755
pytz-2025.2.egg-info Folder 0755
pytz-stubs Folder 0755
pyudev Folder 0755
pyudev-0.24.3.egg-info Folder 0755
pywintypes-stubs Folder 0755
qrbill-stubs Folder 0755
qrcode-stubs Folder 0755
referencing Folder 0755
referencing-0.36.2.dist-info Folder 0755
regex-stubs Folder 0755
regutil-stubs Folder 0755
reportlab Folder 0755
reportlab-4.3.1.egg-info Folder 0755
reportlab-stubs Folder 0755
requests Folder 0755
requests-2.32.3.dist-info Folder 0755
requests-stubs Folder 0755
requests_oauthlib-stubs Folder 0755
retry-stubs Folder 0755
rfc3339_validator-0.1.4.egg-info Folder 0755
rfc3986_validator-0.1.1.egg-info Folder 0755
rfc3987-1.3.8.egg-info Folder 0755
rich Folder 0755
rich-13.9.4.dist-info Folder 0755
rlPyCairo Folder 0755
rlPyCairo-0.3.0.egg-info Folder 0755
roman-5.0.dist-info Folder 0755
rpds Folder 0755
rpds_py-0.21.0.dist-info Folder 0755
rpi_keyboard_config-1.0.egg-info Folder 0755
rpi_lgpio-0.6.egg-info Folder 0755
s2clientprotocol-stubs Folder 0755
samba Folder 0755
sass-stubs Folder 0755
sassutils-stubs Folder 0755
seaborn-stubs Folder 0755
send2trash Folder 0755
send2trash-stubs Folder 0755
sense_hat Folder 0755
sense_hat-2.6.1.egg-info Folder 0755
serial Folder 0755
serial-stubs Folder 0755
servicemanager-stubs Folder 0755
setuptools Folder 0755
setuptools-78.1.1.egg-info Folder 0755
setuptools-stubs Folder 0755
shapely-stubs Folder 0755
simplejpeg Folder 0755
simplejpeg-1.8.1.egg-info Folder 0755
simplejson-stubs Folder 0755
singledispatch-stubs Folder 0755
six-stubs Folder 0755
slumber-stubs Folder 0755
smbc Folder 0755
smbus-1.1.egg-info Folder 0755
smbus2 Folder 0755
smbus2-0.4.3.egg-info Folder 0755
sniffio Folder 0755
sniffio-1.3.1.dist-info Folder 0755
soupsieve Folder 0755
soupsieve-2.7.dist-info Folder 0755
spidev-3.6.egg-info Folder 0755
ssh_import_id Folder 0755
ssh_import_id-5.10.egg-info Folder 0755
sspicon-stubs Folder 0755
str2bool-stubs Folder 0755
tabulate-stubs Folder 0755
tensorflow-stubs Folder 0755
tgcrypto-stubs Folder 0755
thonny Folder 0755
thonny-4.1.7.egg-info Folder 0755
timer-stubs Folder 0755
toml-stubs Folder 0755
tomlkit Folder 0755
tomlkit-0.13.2.dist-info Folder 0755
toposort-stubs Folder 0755
tqdm Folder 0755
tqdm-4.67.1.dist-info Folder 0755
tqdm-stubs Folder 0755
translationstring-stubs Folder 0755
tree_sitter_languages-stubs Folder 0755
ttkthemes-stubs Folder 0755
typeguard Folder 0755
typeguard-4.4.2.dist-info Folder 0755
types_Deprecated-1.2.15.dist-info Folder 0755
types_ExifRead-3.0.dist-info Folder 0755
types_Flask_Cors-5.0.dist-info Folder 0755
types_Flask_Migrate-4.0.dist-info Folder 0755
types_Flask_SocketIO-5.4.dist-info Folder 0755
types_JACK_Client-0.5.dist-info Folder 0755
types_Jetson.GPIO-2.1.dist-info Folder 0755
types_Markdown-3.7.dist-info Folder 0755
types_PyAutoGUI-0.9.dist-info Folder 0755
types_PyMySQL-1.1.dist-info Folder 0755
types_PyScreeze-1.0.1.dist-info Folder 0755
types_PyYAML-6.0.dist-info Folder 0755
types_Pygments-2.18.dist-info Folder 0755
types_RPi.GPIO-0.7.dist-info Folder 0755
types_Send2Trash-1.8.dist-info Folder 0755
types_TgCrypto-1.2.dist-info Folder 0755
types_WTForms-3.2.1.dist-info Folder 0755
types_WebOb-1.8.dist-info Folder 0755
types_aiofiles-24.1.dist-info Folder 0755
types_antlr4_python3_runtime-4.13.dist-info Folder 0755
types_assertpy-1.1.dist-info Folder 0755
types_atheris-2.3.dist-info Folder 0755
types_aws_xray_sdk-2.14.dist-info Folder 0755
types_beautifulsoup4-4.12.dist-info Folder 0755
types_bleach-6.2.dist-info Folder 0755
types_boltons-24.1.dist-info Folder 0755
types_braintree-4.31.dist-info Folder 0755
types_cachetools-5.5.dist-info Folder 0755
types_caldav-1.3.dist-info Folder 0755
types_capturer-3.0.dist-info Folder 0755
types_cffi-1.16.dist-info Folder 0755
types_chevron-0.14.dist-info Folder 0755
types_click_default_group-1.2.dist-info Folder 0755
types_click_spinner-0.1.dist-info Folder 0755
types_colorama-0.4.dist-info Folder 0755
types_commonmark-0.9.dist-info Folder 0755
types_console_menu-0.8.dist-info Folder 0755
types_corus-0.10.dist-info Folder 0755
types_croniter-5.0.1.dist-info Folder 0755
types_dateparser-1.2.dist-info Folder 0755
types_decorator-5.1.dist-info Folder 0755
types_defusedxml-0.7.dist-info Folder 0755
types_docker-7.1.dist-info Folder 0755
types_dockerfile_parse-2.0.dist-info Folder 0755
types_docutils-0.21.dist-info Folder 0755
types_editdistance-0.8.dist-info Folder 0755
types_entrypoints-0.4.dist-info Folder 0755
types_fanstatic-1.4.dist-info Folder 0755
types_first-2.0.dist-info Folder 0755
types_flake8-7.1.dist-info Folder 0755
types_flake8_bugbear-24.12.12.dist-info Folder 0755
types_flake8_builtins-2.5.dist-info Folder 0755
types_flake8_docstrings-1.7.dist-info Folder 0755
types_flake8_rst_docstrings-0.3.dist-info Folder 0755
types_flake8_simplify-0.21.dist-info Folder 0755
types_flake8_typing_imports-1.16.dist-info Folder 0755
types_fpdf2-2.8.2.dist-info Folder 0755
types_gdb-15.0.dist-info Folder 0755
types_gevent-24.11.dist-info Folder 0755
types_google_cloud_ndb-2.3.dist-info Folder 0755
types_greenlet-3.1.dist-info Folder 0755
types_hdbcli-2.23.dist-info Folder 0755
types_html5lib-1.1.dist-info Folder 0755
types_httplib2-0.22.dist-info Folder 0755
types_humanfriendly-10.0.dist-info Folder 0755
types_hvac-2.3.dist-info Folder 0755
types_ibm_db-3.2.4.dist-info Folder 0755
types_icalendar-6.1.dist-info Folder 0755
types_influxdb_client-1.45.dist-info Folder 0755
types_inifile-0.4.dist-info Folder 0755
types_jmespath-1.0.dist-info Folder 0755
types_jsonschema-4.23.dist-info Folder 0755
types_jwcrypto-1.5.dist-info Folder 0755
types_keyboard-0.13.dist-info Folder 0755
types_ldap3-2.9.dist-info Folder 0755
types_libsass-0.23.dist-info Folder 0755
types_lupa-2.2.dist-info Folder 0755
types_lzstring-1.0.dist-info Folder 0755
types_m3u8-6.0.dist-info Folder 0755
types_mock-5.1.dist-info Folder 0755
types_mypy_extensions-1.0.dist-info Folder 0755
types_mysqlclient-2.2.dist-info Folder 0755
types_nanoid-2.0.0.dist-info Folder 0755
types_netaddr-1.3.dist-info Folder 0755
types_netifaces-0.11.dist-info Folder 0755
types_networkx-3.4.2.dist-info Folder 0755
types_oauthlib-3.2.dist-info Folder 0755
types_objgraph-3.6.dist-info Folder 0755
types_olefile-0.47.dist-info Folder 0755
types_openpyxl-3.1.5.dist-info Folder 0755
types_opentracing-2.4.dist-info Folder 0755
types_paramiko-3.5.dist-info Folder 0755
types_parsimonious-0.10.dist-info Folder 0755
types_passlib-1.7.dist-info Folder 0755
types_passpy-1.0.dist-info Folder 0755
types_peewee-3.17.8.dist-info Folder 0755
types_pep8_naming-0.14.dist-info Folder 0755
types_pexpect-4.9.dist-info Folder 0755
types_pika_ts-1.3.dist-info Folder 0755
types_polib-1.2.dist-info Folder 0755
types_portpicker-1.6.dist-info Folder 0755
types_protobuf-5.29.1.dist-info Folder 0755
types_psutil-6.1.dist-info Folder 0755
types_psycopg2-2.9.10.dist-info Folder 0755
types_pyOpenSSL-24.1.dist-info Folder 0755
types_pyRFC3339-2.0.1.dist-info Folder 0755
types_pyasn1-0.6.dist-info Folder 0755
types_pyaudio-0.2.dist-info Folder 0755
types_pycocotools-2.0.dist-info Folder 0755
types_pycurl-7.45.4.dist-info Folder 0755
types_pyfarmhash-0.4.dist-info Folder 0755
types_pyflakes-3.2.dist-info Folder 0755
types_pygit2-1.15.dist-info Folder 0755
types_pyinstaller-6.11.dist-info Folder 0755
types_pyjks-20.0.dist-info Folder 0755
types_pynput-1.7.7.dist-info Folder 0755
types_pyserial-3.5.dist-info Folder 0755
types_pysftp-0.2.dist-info Folder 0755
types_pytest_lazy_fixture-0.6.dist-info Folder 0755
types_python_crontab-3.2.dist-info Folder 0755
types_python_datemath-3.0.1.dist-info Folder 0755
types_python_dateutil-2.9.dist-info Folder 0755
types_python_http_client-3.3.7.dist-info Folder 0755
types_python_jenkins-1.8.dist-info Folder 0755
types_python_jose-3.3.dist-info Folder 0755
types_python_nmap-0.7.dist-info Folder 0755
types_python_xlib-0.33.dist-info Folder 0755
types_pytz-2024.2.dist-info Folder 0755
types_pywin32-308.dist-info Folder 0755
types_pyxdg-0.28.dist-info Folder 0755
types_qrbill-1.1.dist-info Folder 0755
types_qrcode-8.0.dist-info Folder 0755
types_regex-2024.11.6.dist-info Folder 0755
types_reportlab-4.2.5.dist-info Folder 0755
types_requests-2.32.dist-info Folder 0755
types_requests_oauthlib-2.0.dist-info Folder 0755
types_retry-0.9.dist-info Folder 0755
types_s2clientprotocol-5.dist-info Folder 0755
types_seaborn-0.13.2.dist-info Folder 0755
types_setuptools-75.6.dist-info Folder 0755
types_shapely-2.0.dist-info Folder 0755
types_simplejson-3.19.dist-info Folder 0755
types_singledispatch-4.1.dist-info Folder 0755
types_six-1.17.dist-info Folder 0755
types_slumber-0.7.dist-info Folder 0755
types_str2bool-1.1.dist-info Folder 0755
types_tabulate-0.9.dist-info Folder 0755
types_tensorflow-2.18.0.dist-info Folder 0755
types_toml-0.10.dist-info Folder 0755
types_toposort-1.10.dist-info Folder 0755
types_tqdm-4.67.dist-info Folder 0755
types_translationstring-1.4.dist-info Folder 0755
types_tree_sitter_languages-1.10.dist-info Folder 0755
types_ttkthemes-3.2.dist-info Folder 0755
types_uWSGI-2.0.dist-info Folder 0755
types_ujson-5.10.dist-info Folder 0755
types_unidiff-0.7.dist-info Folder 0755
types_untangle-1.2.dist-info Folder 0755
types_usersettings-1.1.dist-info Folder 0755
types_vobject-0.9.9.dist-info Folder 0755
types_waitress-3.0.1.dist-info Folder 0755
types_whatthepatch-1.0.dist-info Folder 0755
types_workalendar-17.0.dist-info Folder 0755
types_wurlitzer-3.1.dist-info Folder 0755
types_xdgenvpy-3.0.dist-info Folder 0755
types_xmltodict-0.14.dist-info Folder 0755
types_zstd-1.5.dist-info Folder 0755
types_zxcvbn-4.4.dist-info Folder 0755
typing_extensions-4.13.2.dist-info Folder 0755
uc_micro Folder 0755
uc_micro_py-1.0.3.dist-info Folder 0755
ujson-stubs Folder 0755
unidiff-stubs Folder 0755
untangle-stubs Folder 0755
uritemplate Folder 0755
uritemplate-4.1.1.egg-info Folder 0755
urllib3 Folder 0755
urllib3-2.3.0.dist-info Folder 0755
usersettings-stubs Folder 0755
uwsgi-stubs Folder 0755
uwsgidecorators-stubs Folder 0755
validate Folder 0755
videodev2 Folder 0755
videodev2-0.0.4.egg-info Folder 0755
vobject-stubs Folder 0755
waitress-stubs Folder 0755
webcolors Folder 0755
webcolors-1.13.dist-info Folder 0755
webencodings Folder 0755
webencodings-0.5.1.egg-info Folder 0755
webob-stubs Folder 0755
whatthepatch-stubs Folder 0755
wheel Folder 0755
wheel-0.46.1.dist-info Folder 0755
win2kras-stubs Folder 0755
win32-stubs Folder 0755
win32api-stubs Folder 0755
win32clipboard-stubs Folder 0755
win32com-stubs Folder 0755
win32comext-stubs Folder 0755
win32con-stubs Folder 0755
win32console-stubs Folder 0755
win32cred-stubs Folder 0755
win32crypt-stubs Folder 0755
win32cryptcon-stubs Folder 0755
win32event-stubs Folder 0755
win32evtlog-stubs Folder 0755
win32evtlogutil-stubs Folder 0755
win32file-stubs Folder 0755
win32gui-stubs Folder 0755
win32gui_struct-stubs Folder 0755
win32help-stubs Folder 0755
win32inet-stubs Folder 0755
win32inetcon-stubs Folder 0755
win32job-stubs Folder 0755
win32lz-stubs Folder 0755
win32net-stubs Folder 0755
win32netcon-stubs Folder 0755
win32pdh-stubs Folder 0755
win32pdhquery-stubs Folder 0755
win32pipe-stubs Folder 0755
win32print-stubs Folder 0755
win32process-stubs Folder 0755
win32profile-stubs Folder 0755
win32ras-stubs Folder 0755
win32security-stubs Folder 0755
win32service-stubs Folder 0755
win32serviceutil-stubs Folder 0755
win32timezone-stubs Folder 0755
win32trace-stubs Folder 0755
win32transaction-stubs Folder 0755
win32ts-stubs Folder 0755
win32ui-stubs Folder 0755
win32uiole-stubs Folder 0755
win32verstamp-stubs Folder 0755
win32wnet-stubs Folder 0755
winerror-stubs Folder 0755
winioctlcon-stubs Folder 0755
winnt-stubs Folder 0755
winperf-stubs Folder 0755
winxpgui-stubs Folder 0755
winxptheme-stubs Folder 0755
workalendar-stubs Folder 0755
wtforms-stubs Folder 0755
wurlitzer-stubs Folder 0755
xdg-stubs Folder 0755
xdgenvpy-stubs Folder 0755
xmltodict-stubs Folder 0755
yaml Folder 0755
yaml-stubs Folder 0755
zipp Folder 0755
zipp-3.21.0.dist-info Folder 0755
zstd-stubs Folder 0755
zxcvbn-stubs Folder 0755
3204bda914b7f2c6f497__mypyc.cpython-313-aarch64-linux-gnu.so File 28.22 MB 0644
Imath.py File 8.93 KB 0644
OpenEXR.cpython-313-aarch64-linux-gnu.so File 68.91 KB 0644
RTIMU.cpython-313-aarch64-linux-gnu.so File 201.53 KB 0644
_augeas.abi3.so File 67.37 KB 0644
_cffi_backend.cpython-313-aarch64-linux-gnu.so File 269.63 KB 0644
_dbus_bindings.cpython-313-aarch64-linux-gnu.so File 215.88 KB 0644
_dbus_glib_bindings.cpython-313-aarch64-linux-gnu.so File 66.34 KB 0644
_ldb_text.py File 3.45 KB 0644
_lgpio.cpython-313-aarch64-linux-gnu.so File 134.31 KB 0644
_prctl.cpython-313-aarch64-linux-gnu.so File 66.5 KB 0644
_smbc.cpython-313-aarch64-linux-gnu.so File 70.04 KB 0644
_tdb_text.py File 3.16 KB 0644
apt_inst.cpython-313-aarch64-linux-gnu.so File 70.41 KB 0644
apt_pkg.cpython-313-aarch64-linux-gnu.so File 419.16 KB 0644
configargparse.py File 63.09 KB 0644
cups.cpython-313-aarch64-linux-gnu.so File 203.66 KB 0644
cupsext.cpython-313-aarch64-linux-gnu.so File 68.96 KB 0644
debconf.py File 7.86 KB 0644
distutils-precedence.pth File 151 B 0644
hpmudext.cpython-313-aarch64-linux-gnu.so File 66.67 KB 0644
jsonpatch.py File 28.14 KB 0644
jsonpointer.py File 10.71 KB 0644
language_support_pkgs.py File 9.91 KB 0644
ldb.cpython-313-aarch64-linux-gnu.so File 137.64 KB 0644
lgpio.py File 67.99 KB 0644
ljpegCompress.cpython-313-aarch64-linux-gnu.so File 66.23 KB 0644
logilab_common-2.1.0-nspkg.pth File 472 B 0644
mccabe.py File 10.4 KB 0644
mypy_extensions.py File 6.08 KB 0644
pcardext.cpython-313-aarch64-linux-gnu.so File 66.48 KB 0644
pgzrun.py File 827 B 0644
prctl.py File 7.35 KB 0644
rfc3339_validator.py File 1015 B 0644
rfc3986_validator.py File 4.29 KB 0644
rfc3987.py File 21.35 KB 0644
roman.py File 3.99 KB 0644
scanext.cpython-313-aarch64-linux-gnu.so File 67.16 KB 0644
smbus.cpython-313-aarch64-linux-gnu.so File 66.98 KB 0644
spidev.cpython-313-aarch64-linux-gnu.so File 67.64 KB 0644
talloc.cpython-313-aarch64-linux-gnu.so File 67.46 KB 0644
tdb.cpython-313-aarch64-linux-gnu.so File 68.12 KB 0644
typing_extensions.py File 168.61 KB 0644
Filemanager