SILENT KILLERPanel

Current Path: > > opt > alt > python39 > > lib64 > python3.9 > >


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/alt/python39//lib64/python3.9//

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
asyncio Directory - -
collections Directory - -
concurrent Directory - -
config-3.9-x86_64-linux-gnu Directory - -
ctypes Directory - -
curses Directory - -
dbm Directory - -
distutils Directory - -
email Directory - -
encodings Directory - -
ensurepip Directory - -
html Directory - -
http Directory - -
importlib Directory - -
json Directory - -
lib-dynload Directory - -
lib2to3 Directory - -
logging Directory - -
multiprocessing Directory - -
pydoc_data Directory - -
site-packages Directory - -
sqlite3 Directory - -
unittest Directory - -
urllib Directory - -
venv Directory - -
wsgiref Directory - -
xml Directory - -
xmlrpc Directory - -
zoneinfo Directory - -
LICENSE.txt File 13937 bytes June 03 2025 18:47:52.
__future__.py File 5147 bytes June 03 2025 18:47:52.
__phello__.foo.py File 64 bytes June 03 2025 18:47:52.
_aix_support.py File 3389 bytes June 03 2025 18:47:52.
_bootlocale.py File 1801 bytes June 03 2025 18:47:52.
_bootsubprocess.py File 2675 bytes June 03 2025 18:47:52.
_collections_abc.py File 29374 bytes June 03 2025 18:47:52.
_compat_pickle.py File 8749 bytes June 03 2025 18:47:52.
_compression.py File 5340 bytes June 03 2025 18:47:52.
_markupbase.py File 14623 bytes June 03 2025 18:47:52.
_osx_support.py File 21773 bytes June 03 2025 18:47:52.
_py_abc.py File 6189 bytes June 03 2025 18:47:52.
_pydecimal.py File 228666 bytes June 03 2025 18:47:52.
_pyio.py File 93316 bytes June 03 2025 18:47:52.
_sitebuiltins.py File 3115 bytes June 03 2025 18:47:52.
_strptime.py File 25277 bytes June 03 2025 18:47:52.
_sysconfigdata__linux_x86_64-linux-gnu.py File 40536 bytes June 19 2025 12:09:48.
_sysconfigdata_d_linux_x86_64-linux-gnu.py File 40272 bytes June 19 2025 12:00:02.
_threading_local.py File 7220 bytes June 03 2025 18:47:52.
_weakrefset.py File 5923 bytes June 03 2025 18:47:52.
abc.py File 4920 bytes June 03 2025 18:47:52.
aifc.py File 32605 bytes June 03 2025 18:47:52.
antigravity.py File 500 bytes June 03 2025 18:47:52.
argparse.py File 98119 bytes June 03 2025 18:47:52.
ast.py File 56256 bytes June 03 2025 18:47:52.
asynchat.py File 11321 bytes June 03 2025 18:47:52.
asyncore.py File 20102 bytes June 03 2025 18:47:52.
base64.py File 19872 bytes June 03 2025 18:47:52.
bdb.py File 31389 bytes June 03 2025 18:47:52.
binhex.py File 14784 bytes June 03 2025 18:47:52.
bisect.py File 2350 bytes June 03 2025 18:47:52.
bz2.py File 12447 bytes June 03 2025 18:47:52.
cProfile.py File 6358 bytes June 03 2025 18:47:52.
calendar.py File 24832 bytes June 03 2025 18:47:52.
cgi.py File 33945 bytes June 03 2025 18:47:52.
cgitb.py File 12096 bytes June 03 2025 18:47:52.
chunk.py File 5435 bytes June 03 2025 18:47:52.
cmd.py File 14860 bytes June 03 2025 18:47:52.
code.py File 10622 bytes June 03 2025 18:47:52.
codecs.py File 36673 bytes June 03 2025 18:47:52.
codeop.py File 6326 bytes June 03 2025 18:47:52.
colorsys.py File 4064 bytes June 03 2025 18:47:52.
compileall.py File 20105 bytes June 03 2025 18:47:52.
configparser.py File 54584 bytes June 03 2025 18:47:52.
contextlib.py File 24624 bytes June 03 2025 18:47:52.
contextvars.py File 129 bytes June 03 2025 18:47:52.
copy.py File 8650 bytes June 03 2025 18:47:52.
copyreg.py File 7274 bytes June 03 2025 18:47:52.
crypt.py File 3819 bytes June 03 2025 18:47:52.
csv.py File 16144 bytes June 03 2025 18:47:52.
dataclasses.py File 49586 bytes June 03 2025 18:47:52.
datetime.py File 89177 bytes June 03 2025 18:47:52.
decimal.py File 320 bytes June 03 2025 18:47:52.
difflib.py File 83307 bytes June 03 2025 18:47:52.
dis.py File 20570 bytes June 03 2025 18:47:52.
doctest.py File 104568 bytes June 03 2025 18:47:52.
enum.py File 39440 bytes June 03 2025 18:47:52.
filecmp.py File 10024 bytes June 03 2025 18:47:52.
fileinput.py File 14791 bytes June 03 2025 18:47:52.
fnmatch.py File 6004 bytes June 03 2025 18:47:52.
formatter.py File 15143 bytes June 03 2025 18:47:52.
fractions.py File 24323 bytes June 03 2025 18:47:52.
ftplib.py File 35496 bytes June 03 2025 18:47:52.
functools.py File 38881 bytes June 03 2025 18:47:52.
genericpath.py File 5246 bytes June 03 2025 18:47:52.
getopt.py File 7489 bytes June 03 2025 18:47:52.
getpass.py File 5990 bytes June 03 2025 18:47:52.
gettext.py File 27266 bytes June 03 2025 18:47:52.
glob.py File 5823 bytes June 03 2025 18:47:52.
graphlib.py File 9573 bytes June 03 2025 18:47:52.
gzip.py File 21772 bytes June 03 2025 18:47:52.
hashlib.py File 10010 bytes June 03 2025 18:47:52.
heapq.py File 22877 bytes June 03 2025 18:47:52.
hmac.py File 7003 bytes June 03 2025 18:47:52.
imaplib.py File 55256 bytes June 03 2025 18:47:52.
imghdr.py File 3808 bytes June 03 2025 18:47:52.
imp.py File 10536 bytes June 03 2025 18:47:52.
inspect.py File 118235 bytes June 03 2025 18:47:52.
io.py File 3541 bytes June 03 2025 18:47:52.
ipaddress.py File 80924 bytes June 03 2025 18:47:52.
keyword.py File 1047 bytes June 03 2025 18:47:52.
linecache.py File 5461 bytes June 03 2025 18:47:52.
locale.py File 78271 bytes June 03 2025 18:47:52.
lzma.py File 13231 bytes June 03 2025 18:47:52.
mailbox.py File 78794 bytes June 03 2025 18:47:52.
mailcap.py File 9116 bytes June 03 2025 18:47:52.
mimetypes.py File 21564 bytes June 03 2025 18:47:52.
modulefinder.py File 24401 bytes June 03 2025 18:47:52.
netrc.py File 5566 bytes June 03 2025 18:47:52.
nntplib.py File 41023 bytes June 03 2025 18:47:52.
ntpath.py File 28259 bytes June 03 2025 18:47:52.
nturl2path.py File 2887 bytes June 03 2025 18:47:52.
numbers.py File 10338 bytes June 03 2025 18:47:52.
opcode.py File 5660 bytes June 03 2025 18:47:52.
operator.py File 10751 bytes June 03 2025 18:47:52.
optparse.py File 60369 bytes June 03 2025 18:47:52.
os.py File 39065 bytes June 03 2025 18:47:52.
pathlib.py File 51134 bytes June 03 2025 18:47:52.
pdb.py File 63250 bytes June 03 2025 18:47:52.
pickle.py File 64920 bytes June 03 2025 18:47:52.
pickletools.py File 93486 bytes June 03 2025 18:47:52.
pipes.py File 8916 bytes June 03 2025 18:47:52.
pkgutil.py File 24276 bytes June 03 2025 18:47:52.
platform.py File 40614 bytes June 03 2025 18:47:52.
plistlib.py File 28248 bytes June 03 2025 18:47:52.
poplib.py File 15198 bytes June 03 2025 18:47:52.
posixpath.py File 16273 bytes June 03 2025 18:47:52.
pprint.py File 22527 bytes June 03 2025 18:47:52.
profile.py File 22894 bytes June 03 2025 18:47:52.
pstats.py File 29326 bytes June 03 2025 18:47:52.
pty.py File 4807 bytes June 03 2025 18:47:52.
py_compile.py File 8203 bytes June 19 2025 11:56:56.
pyclbr.py File 15255 bytes June 03 2025 18:47:52.
pydoc.py File 109612 bytes June 03 2025 18:47:52.
queue.py File 11496 bytes June 03 2025 18:47:52.
quopri.py File 7279 bytes June 03 2025 18:47:52.
random.py File 31484 bytes June 03 2025 18:47:52.
re.py File 15861 bytes June 03 2025 18:47:52.
reprlib.py File 5267 bytes June 03 2025 18:47:52.
rlcompleter.py File 7648 bytes June 03 2025 18:47:52.
runpy.py File 13084 bytes June 03 2025 18:47:52.
sched.py File 6442 bytes June 03 2025 18:47:52.
secrets.py File 2036 bytes June 03 2025 18:47:52.
selectors.py File 19536 bytes June 03 2025 18:47:52.
shelve.py File 8527 bytes June 03 2025 18:47:52.
shlex.py File 13501 bytes June 03 2025 18:47:52.
shutil.py File 53030 bytes June 03 2025 18:47:52.
signal.py File 2438 bytes June 03 2025 18:47:52.
site.py File 21844 bytes June 03 2025 18:47:52.
smtpd.py File 34834 bytes June 03 2025 18:47:52.
smtplib.py File 45418 bytes June 03 2025 18:47:52.
sndhdr.py File 7099 bytes June 03 2025 18:47:52.
socket.py File 36915 bytes June 03 2025 18:47:52.
socketserver.py File 27296 bytes June 03 2025 18:47:52.
sre_compile.py File 27973 bytes June 03 2025 18:47:52.
sre_constants.py File 7177 bytes June 03 2025 18:47:52.
sre_parse.py File 40779 bytes June 03 2025 18:47:52.
ssl.py File 52530 bytes June 03 2025 18:47:52.
stat.py File 5485 bytes June 03 2025 18:47:52.
statistics.py File 38067 bytes June 03 2025 18:47:52.
string.py File 10566 bytes June 03 2025 18:47:52.
stringprep.py File 12917 bytes June 03 2025 18:47:52.
struct.py File 257 bytes June 03 2025 18:47:52.
subprocess.py File 83564 bytes June 03 2025 18:47:52.
sunau.py File 18158 bytes June 03 2025 18:47:52.
symbol.py File 2281 bytes June 19 2025 12:01:19.
symtable.py File 7905 bytes June 03 2025 18:47:52.
sysconfig.py File 24914 bytes June 03 2025 18:47:52.
tabnanny.py File 11419 bytes June 03 2025 18:47:52.
tarfile.py File 110849 bytes June 03 2025 18:47:52.
telnetlib.py File 23254 bytes June 03 2025 18:47:52.
tempfile.py File 27963 bytes June 03 2025 18:47:52.
textwrap.py File 19407 bytes June 03 2025 18:47:52.
this.py File 1003 bytes June 03 2025 18:47:52.
threading.py File 54176 bytes June 03 2025 18:47:52.
timeit.py File 13493 bytes June 03 2025 18:47:52.
token.py File 2368 bytes June 03 2025 18:47:52.
tokenize.py File 25883 bytes June 03 2025 18:47:52.
trace.py File 29220 bytes June 03 2025 18:47:52.
traceback.py File 24660 bytes June 03 2025 18:47:52.
tracemalloc.py File 18047 bytes June 03 2025 18:47:52.
tty.py File 879 bytes June 03 2025 18:47:52.
types.py File 9785 bytes June 03 2025 18:47:52.
typing.py File 77044 bytes June 03 2025 18:47:52.
uu.py File 7277 bytes June 19 2025 12:10:58.
uuid.py File 27324 bytes June 03 2025 18:47:52.
warnings.py File 19688 bytes June 03 2025 18:47:52.
wave.py File 18004 bytes June 03 2025 18:47:52.
weakref.py File 21560 bytes June 03 2025 18:47:52.
webbrowser.py File 24096 bytes June 03 2025 18:47:52.
xdrlib.py File 5913 bytes June 03 2025 18:47:52.
zipapp.py File 7535 bytes June 03 2025 18:47:52.
zipfile.py File 88240 bytes June 03 2025 18:47:52.
zipimport.py File 30765 bytes June 03 2025 18:47:52.

Reading File: //opt/alt/python39//lib64/python3.9///graphlib.py

__all__ = ["TopologicalSorter", "CycleError"]

_NODE_OUT = -1
_NODE_DONE = -2


class _NodeInfo:
    __slots__ = "node", "npredecessors", "successors"

    def __init__(self, node):
        # The node this class is augmenting.
        self.node = node

        # Number of predecessors, generally >= 0. When this value falls to 0,
        # and is returned by get_ready(), this is set to _NODE_OUT and when the
        # node is marked done by a call to done(), set to _NODE_DONE.
        self.npredecessors = 0

        # List of successor nodes. The list can contain duplicated elements as
        # long as they're all reflected in the successor's npredecessors attribute.
        self.successors = []


class CycleError(ValueError):
    """Subclass of ValueError raised by TopologicalSorter.prepare if cycles
    exist in the working graph.

    If multiple cycles exist, only one undefined choice among them will be reported
    and included in the exception. The detected cycle can be accessed via the second
    element in the *args* attribute of the exception instance and consists in a list
    of nodes, such that each node is, in the graph, an immediate predecessor of the
    next node in the list. In the reported list, the first and the last node will be
    the same, to make it clear that it is cyclic.
    """

    pass


class TopologicalSorter:
    """Provides functionality to topologically sort a graph of hashable nodes"""

    def __init__(self, graph=None):
        self._node2info = {}
        self._ready_nodes = None
        self._npassedout = 0
        self._nfinished = 0

        if graph is not None:
            for node, predecessors in graph.items():
                self.add(node, *predecessors)

    def _get_nodeinfo(self, node):
        if (result := self._node2info.get(node)) is None:
            self._node2info[node] = result = _NodeInfo(node)
        return result

    def add(self, node, *predecessors):
        """Add a new node and its predecessors to the graph.

        Both the *node* and all elements in *predecessors* must be hashable.

        If called multiple times with the same node argument, the set of dependencies
        will be the union of all dependencies passed in.

        It is possible to add a node with no dependencies (*predecessors* is not provided)
        as well as provide a dependency twice. If a node that has not been provided before
        is included among *predecessors* it will be automatically added to the graph with
        no predecessors of its own.

        Raises ValueError if called after "prepare".
        """
        if self._ready_nodes is not None:
            raise ValueError("Nodes cannot be added after a call to prepare()")

        # Create the node -> predecessor edges
        nodeinfo = self._get_nodeinfo(node)
        nodeinfo.npredecessors += len(predecessors)

        # Create the predecessor -> node edges
        for pred in predecessors:
            pred_info = self._get_nodeinfo(pred)
            pred_info.successors.append(node)

    def prepare(self):
        """Mark the graph as finished and check for cycles in the graph.

        If any cycle is detected, "CycleError" will be raised, but "get_ready" can
        still be used to obtain as many nodes as possible until cycles block more
        progress. After a call to this function, the graph cannot be modified and
        therefore no more nodes can be added using "add".
        """
        if self._ready_nodes is not None:
            raise ValueError("cannot prepare() more than once")

        self._ready_nodes = [
            i.node for i in self._node2info.values() if i.npredecessors == 0
        ]
        # ready_nodes is set before we look for cycles on purpose:
        # if the user wants to catch the CycleError, that's fine,
        # they can continue using the instance to grab as many
        # nodes as possible before cycles block more progress
        cycle = self._find_cycle()
        if cycle:
            raise CycleError(f"nodes are in a cycle", cycle)

    def get_ready(self):
        """Return a tuple of all the nodes that are ready.

        Initially it returns all nodes with no predecessors; once those are marked
        as processed by calling "done", further calls will return all new nodes that
        have all their predecessors already processed. Once no more progress can be made,
        empty tuples are returned.

        Raises ValueError if called without calling "prepare" previously.
        """
        if self._ready_nodes is None:
            raise ValueError("prepare() must be called first")

        # Get the nodes that are ready and mark them
        result = tuple(self._ready_nodes)
        n2i = self._node2info
        for node in result:
            n2i[node].npredecessors = _NODE_OUT

        # Clean the list of nodes that are ready and update
        # the counter of nodes that we have returned.
        self._ready_nodes.clear()
        self._npassedout += len(result)

        return result

    def is_active(self):
        """Return ``True`` if more progress can be made and ``False`` otherwise.

        Progress can be made if cycles do not block the resolution and either there
        are still nodes ready that haven't yet been returned by "get_ready" or the
        number of nodes marked "done" is less than the number that have been returned
        by "get_ready".

        Raises ValueError if called without calling "prepare" previously.
        """
        if self._ready_nodes is None:
            raise ValueError("prepare() must be called first")
        return self._nfinished < self._npassedout or bool(self._ready_nodes)

    def __bool__(self):
        return self.is_active()

    def done(self, *nodes):
        """Marks a set of nodes returned by "get_ready" as processed.

        This method unblocks any successor of each node in *nodes* for being returned
        in the future by a call to "get_ready".

        Raises :exec:`ValueError` if any node in *nodes* has already been marked as
        processed by a previous call to this method, if a node was not added to the
        graph by using "add" or if called without calling "prepare" previously or if
        node has not yet been returned by "get_ready".
        """

        if self._ready_nodes is None:
            raise ValueError("prepare() must be called first")

        n2i = self._node2info

        for node in nodes:

            # Check if we know about this node (it was added previously using add()
            if (nodeinfo := n2i.get(node)) is None:
                raise ValueError(f"node {node!r} was not added using add()")

            # If the node has not being returned (marked as ready) previously, inform the user.
            stat = nodeinfo.npredecessors
            if stat != _NODE_OUT:
                if stat >= 0:
                    raise ValueError(
                        f"node {node!r} was not passed out (still not ready)"
                    )
                elif stat == _NODE_DONE:
                    raise ValueError(f"node {node!r} was already marked done")
                else:
                    assert False, f"node {node!r}: unknown status {stat}"

            # Mark the node as processed
            nodeinfo.npredecessors = _NODE_DONE

            # Go to all the successors and reduce the number of predecessors, collecting all the ones
            # that are ready to be returned in the next get_ready() call.
            for successor in nodeinfo.successors:
                successor_info = n2i[successor]
                successor_info.npredecessors -= 1
                if successor_info.npredecessors == 0:
                    self._ready_nodes.append(successor)
            self._nfinished += 1

    def _find_cycle(self):
        n2i = self._node2info
        stack = []
        itstack = []
        seen = set()
        node2stacki = {}

        for node in n2i:
            if node in seen:
                continue

            while True:
                if node in seen:
                    # If we have seen already the node and is in the
                    # current stack we have found a cycle.
                    if node in node2stacki:
                        return stack[node2stacki[node] :] + [node]
                    # else go on to get next successor
                else:
                    seen.add(node)
                    itstack.append(iter(n2i[node].successors).__next__)
                    node2stacki[node] = len(stack)
                    stack.append(node)

                # Backtrack to the topmost stack entry with
                # at least another successor.
                while stack:
                    try:
                        node = itstack[-1]()
                        break
                    except StopIteration:
                        del node2stacki[stack.pop()]
                        itstack.pop()
                else:
                    break
        return None

    def static_order(self):
        """Returns an iterable of nodes in a topological order.

        The particular order that is returned may depend on the specific
        order in which the items were inserted in the graph.

        Using this method does not require to call "prepare" or "done". If any
        cycle is detected, :exc:`CycleError` will be raised.
        """
        self.prepare()
        while self.is_active():
            node_group = self.get_ready()
            yield from node_group
            self.done(*node_group)

SILENT KILLER Tool