PKZ!OAXTdircolors/__init__.py# dircolors module, just import the main Dircolors class # # Copyright 2019 Allen Wild # SPDX-License-Identifier: Apache-2.0 """ Python library to colorize filenames in a terminal based on their type """ __version__ = '0.0.3' from .dircolors import Dircolors PKx!OIdircolors/_defaults.py""" Default dircolors data, and the reference .dircolors file. Generated from dircolors in GNU coreutils version 8.31 """ __all__ = ['DEFAULT_DIRCOLORS', 'DEFAULT_LS_COLORS'] # the output of `dircolors -p` DEFAULT_DIRCOLORS = r""" # Configuration file for dircolors, a utility to help you set the # LS_COLORS environment variable used by GNU ls with the --color option. # Copyright (C) 1996-2019 Free Software Foundation, Inc. # Copying and distribution of this file, with or without modification, # are permitted provided the copyright notice and this notice are preserved. # The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the # slackware version of dircolors) are recognized but ignored. # Below are TERM entries, which can be a glob patterns, to match # against the TERM environment variable to determine if it is colorizable. TERM Eterm TERM ansi TERM *color* TERM con[0-9]*x[0-9]* TERM cons25 TERM console TERM cygwin TERM dtterm TERM gnome TERM hurd TERM jfbterm TERM konsole TERM kterm TERM linux TERM linux-c TERM mlterm TERM putty TERM rxvt* TERM screen* TERM st TERM terminator TERM tmux* TERM vt100 TERM xterm* # Below are the color init strings for the basic file types. # One can use codes for 256 or more colors supported by modern terminals. # The default color codes use the capabilities of an 8 color terminal # with some additional attributes as per the following codes: # Attribute codes: # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed # Text color codes: # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white # Background color codes: # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white #NORMAL 00 # no color code at all #FILE 00 # regular file: use no color at all RESET 0 # reset to "normal" color DIR 01;34 # directory LINK 01;36 # symbolic link. (If you set this to 'target' instead of a # numerical value, the color is as for the file pointed to.) MULTIHARDLINK 00 # regular file with more than one link FIFO 40;33 # pipe SOCK 01;35 # socket DOOR 01;35 # door BLK 40;33;01 # block device driver CHR 40;33;01 # character device driver ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ... MISSING 00 # ... and the files they point to SETUID 37;41 # file that is setuid (u+s) SETGID 30;43 # file that is setgid (g+s) CAPABILITY 30;41 # file with capability STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w) OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable # This is for files with execute permission: EXEC 01;32 # List any file extensions like '.gz' or '.tar' that you would like ls # to colorize below. Put the extension, a space, and the color init string. # (and any comments you want to add after a '#') # If you use DOS-style suffixes, you may want to uncomment the following: #.cmd 01;32 # executables (bright green) #.exe 01;32 #.com 01;32 #.btm 01;32 #.bat 01;32 # Or if you want to colorize scripts even if they do not have the # executable bit actually set. #.sh 01;32 #.csh 01;32 # archives or compressed (bright red) .tar 01;31 .tgz 01;31 .arc 01;31 .arj 01;31 .taz 01;31 .lha 01;31 .lz4 01;31 .lzh 01;31 .lzma 01;31 .tlz 01;31 .txz 01;31 .tzo 01;31 .t7z 01;31 .zip 01;31 .z 01;31 .dz 01;31 .gz 01;31 .lrz 01;31 .lz 01;31 .lzo 01;31 .xz 01;31 .zst 01;31 .tzst 01;31 .bz2 01;31 .bz 01;31 .tbz 01;31 .tbz2 01;31 .tz 01;31 .deb 01;31 .rpm 01;31 .jar 01;31 .war 01;31 .ear 01;31 .sar 01;31 .rar 01;31 .alz 01;31 .ace 01;31 .zoo 01;31 .cpio 01;31 .7z 01;31 .rz 01;31 .cab 01;31 .wim 01;31 .swm 01;31 .dwm 01;31 .esd 01;31 # image formats .jpg 01;35 .jpeg 01;35 .mjpg 01;35 .mjpeg 01;35 .gif 01;35 .bmp 01;35 .pbm 01;35 .pgm 01;35 .ppm 01;35 .tga 01;35 .xbm 01;35 .xpm 01;35 .tif 01;35 .tiff 01;35 .png 01;35 .svg 01;35 .svgz 01;35 .mng 01;35 .pcx 01;35 .mov 01;35 .mpg 01;35 .mpeg 01;35 .m2v 01;35 .mkv 01;35 .webm 01;35 .ogm 01;35 .mp4 01;35 .m4v 01;35 .mp4v 01;35 .vob 01;35 .qt 01;35 .nuv 01;35 .wmv 01;35 .asf 01;35 .rm 01;35 .rmvb 01;35 .flc 01;35 .avi 01;35 .fli 01;35 .flv 01;35 .gl 01;35 .dl 01;35 .xcf 01;35 .xwd 01;35 .yuv 01;35 .cgm 01;35 .emf 01;35 # https://wiki.xiph.org/MIME_Types_and_File_Extensions .ogv 01;35 .ogx 01;35 # audio formats .aac 00;36 .au 00;36 .flac 00;36 .m4a 00;36 .mid 00;36 .midi 00;36 .mka 00;36 .mp3 00;36 .mpc 00;36 .ogg 00;36 .ra 00;36 .wav 00;36 # https://wiki.xiph.org/MIME_Types_and_File_Extensions .oga 00;36 .opus 00;36 .spx 00;36 .xspf 00;36 """ # the above converted to LS_COLORS by dircolors, but with the trailing ':' stripped DEFAULT_LS_COLORS = r""" rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01: mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31: *.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31: *.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31: *.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31: *.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31: *.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31: *.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35: *.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35: *.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35: *.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35: *.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35: *.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35: *.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36: *.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36: *.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36""".replace('\n', '') PKx!Ox[:_dircolors/_util.py# private utility functions for pydircolors # # Copyright 2019 Allen Wild # SPDX-License-Identifier: Apache-2.0 """ private/internal utility functions for pydircolors """ import os __all__ = ['stat_at', 'readlink_at'] def stat_at(file, cwd=None, follow_symlinks=False): """ helper function to call os.stat on a file relative to a given directory. cwd should be a string, and will be opened as read-only (then closed), or an integer for an already-open directory file descriptor (which won't be closed). os.open or os.stat may raise various errors, which are passed on. """ if isinstance(cwd, str): dirfd = os.open(cwd, os.O_RDONLY) need_to_close = True elif cwd is None or isinstance(cwd, int): dirfd = cwd need_to_close = False else: raise ValueError('cwd must be str, int, or None') try: return os.stat(file, dir_fd=dirfd, follow_symlinks=follow_symlinks) finally: if need_to_close: os.close(dirfd) def readlink_at(file, cwd=None): """ helper function to call os.readlink on a file relative to a given directory. cwd should be a string, and will be opened as read-only (then closed), or an integer for an already-open directory file descriptor (which won't be closed). os.open or os.readlink may raise various errors, which are passed on. """ if isinstance(cwd, str): dirfd = os.open(cwd, os.O_RDONLY) need_to_close = True elif cwd is None or isinstance(cwd, int): dirfd = cwd need_to_close = False else: raise ValueError('cwd must be str, int, or None') try: return os.readlink(file, dir_fd=dirfd) finally: if need_to_close: os.close(dirfd) PKx!O9--dircolors/dircolors.py# Dircolors, a Python library for colorizing and formatting filenames like GNU Coreutils' # ls and dircolors programs. # Requires python 3.3 or later # # Copyright 2019 Allen Wild # SPDX-License-Identifier: Apache-2.0 """ dircolors, a Python library to colorize filenames based on their type for terminal use, like GNU ls and dircolors. """ from collections import OrderedDict from io import StringIO, TextIOBase import os import stat from ._defaults import DEFAULT_DIRCOLORS from ._util import * __all__ = ['Dircolors'] _CODE_MAP = OrderedDict() def _init_code_map(): """ mapping between the key name in the .dircolors file and the two letter code found in the LS_COLORS environment variable. Used for parsing .dircolors files. """ # This code is wrapped in a function so we can disable pylint's whitespace check # on a limited scope. # pylint: disable=bad-whitespace _CODE_MAP['RESET'] = 'rs' _CODE_MAP['DIR'] = 'di' _CODE_MAP['LINK'] = 'ln' _CODE_MAP['MULTIHARDLINK'] = 'mh' _CODE_MAP['FIFO'] = 'pi' _CODE_MAP['SOCK'] = 'so' _CODE_MAP['DOOR'] = 'do' _CODE_MAP['BLK'] = 'bd' _CODE_MAP['CHR'] = 'cd' _CODE_MAP['ORPHAN'] = 'or' _CODE_MAP['MISSING'] = 'mi' _CODE_MAP['SETUID'] = 'su' _CODE_MAP['SETGID'] = 'sg' _CODE_MAP['CAPABILITY'] = 'ca' _CODE_MAP['STICKY_OTHER_WRITABLE'] = 'tw' _CODE_MAP['OTHER_WRITABLE'] = 'ow' _CODE_MAP['STICKY'] = 'st' _CODE_MAP['EXEC'] = 'ex' _init_code_map() del _init_code_map class Dircolors: """ Main dircolors class. Contains a database of formats corresponding to file types, modes, and extensions. Use the format() method to check a file and color it appropriately. """ def __init__(self, load=True): """ Initialize a Dircolors object. If load=True (the default), then try to load dircolors info from the LS_COLORS environment variable. If no data is obtained from LS_COLORS, load the defaults. If load=False, don't even load defaults. """ self._loaded = False self._codes = OrderedDict() self._extensions = OrderedDict() if load: if not self.load_from_environ(): self.load_defaults() def __bool__(self): """ convenience method for checking whether this Dircolors object has loaded a database. Can be used like d = Dircolors() if d: d.format(somefile) """ return self._loaded @property def loaded(self): """ return a boolean indicating whether some valid dircolors data has been loaded """ return self._loaded def clear(self): """ Clear the loaded data """ self._loaded = False self._codes.clear() self._extensions.clear() def load_from_lscolors(self, lscolors): """ Load the dircolors database from a string in the same format as the LS_COLORS environment variable. Returns True if data was successfully loaded, False otherwise (e.g. if envvar is unset). Regardless, the current database will be cleared """ self.clear() if not lscolors: return False for item in lscolors.split(':'): try: code, color = item.split('=', 1) except ValueError: continue # no key=value, just ignore if code.startswith('*.'): self._extensions[code[1:]] = color else: self._codes[code] = color if self._codes or self._extensions: self._loaded = True return self._loaded def load_from_environ(self, envvar='LS_COLORS'): """ Load the dircolors database from an environment variable. By default, use LS_COLORS like the GNU Coreutils `ls` program. Returns True if data was successfully loaded, False otherwise (e.g. if envvar is unset). Regardless, the current database will be cleared. """ return self.load_from_lscolors(os.environ.get(envvar)) def load_from_dircolors(self, database, strict=False): """ Load the dircolors database from a GNU-compatible .dircolors file. May raise any of the usual OSError exceptions if filename doesn't exist or otherwise can't be read. database can be a string representing a filename, or a file-like object opened in text mode (i.e. a subclass of io.TextIOBase). To load from the contents of a .dircolors file, wrap it in an io.StringIO object. If strict is True, raise ValueError on the first unparsed line Returns a boolean indicating whether any data was loaded. The current database will always be cleared. """ self.clear() if isinstance(database, str): file = open(database, 'r') elif isinstance(database, TextIOBase): file = database else: raise ValueError('database must be str or io.TextIOBase, not %s'%type(database)) try: for line in file: # remove comments and skip empty lines line = line.split('#')[0].strip() if not line: continue # make sure there's two space-separated fields split = line.split() if len(split) != 2: if strict: raise ValueError('Warning: unable to parse dircolors line "%s"'%line) continue key, val = split if key == 'TERM': continue # ignore TERM directives elif key in _CODE_MAP: self._codes[_CODE_MAP[key]] = val elif key.startswith('.'): self._extensions[key] = val elif strict: raise ValueError('Warning: unable to parse dircolors line "%s"'%line) # elif not strict, skip if self._codes or self._extensions: self._loaded = True return self._loaded finally: file.close() def load_defaults(self): """ Load the default database. """ self.clear() return self.load_from_dircolors(StringIO(DEFAULT_DIRCOLORS), True) def generate_lscolors(self): """ Output the database in the format used by the LS_COLORS environment variable. """ if not self._loaded: return '' def gen_pairs(): for pair in self._codes.items(): yield pair for pair in self._extensions.items(): # change .xyz to *.xyz yield '*' + pair[0], pair[1] return ':'.join('%s=%s'%pair for pair in gen_pairs()) def _format_code(self, text, code): """ format text with an lscolors code. Return text unmodified if code isn't found in the database """ val = self._codes.get(code, None) if val: return '\033[%sm%s\033[%sm'%(val, text, self._codes.get('rs', '0')) return text def _format_ext(self, text, ext): """ Format text according to the given file extension. ext must have a leading '.' text need not actually end in '.ext' """ val = self._extensions.get(ext, '0') if val: return '\033[%sm%s\033[%sm'%(val, text, self._codes.get('rs', '0')) return text def format_mode(self, text, mode): """ Format and color the given text based on the given file mode. `mode` can be an integer, usually the st_mode field of an os.stat_result object obtained from os.stat() or similar function. It can also be an os.stat_result object, and the st_mode field will be extracted automatically. `text` is an arbitrary string which will be colored according to the bits set in `mode` and the colors database loaded in this Dircolors object. If `mode` represents a symlink, it will be formatted as such with no dereferencing (since this function doesn't know the file name) """ if not self._loaded: return text if isinstance(mode, int): pass elif isinstance(mode, os.stat_result): mode = mode.st_mode else: raise ValueError('mode must be int or os.stat_result, not %s'%type(mode)) if stat.S_ISDIR(mode): if (mode & (stat.S_ISVTX | stat.S_IWOTH)) == (stat.S_ISVTX | stat.S_IWOTH): # sticky and world-writable return self._format_code(text, 'tw') if mode & stat.S_ISVTX: # sticky but not world-writable return self._format_code(text, 'st') if mode & stat.S_IWOTH: # world-writable but not sticky return self._format_code(text, 'ow') # normal directory return self._format_code(text, 'di') # special file? # pylint: disable=bad-whitespace special_types = ( (stat.S_IFLNK, 'ln'), # symlink (stat.S_IFIFO, 'pi'), # pipe (FIFO) (stat.S_IFSOCK, 'so'), # socket (stat.S_IFBLK, 'bd'), # block device (stat.S_IFCHR, 'cd'), # character device (stat.S_ISUID, 'su'), # setuid (stat.S_ISGID, 'sg'), # setgid ) for mask, code in special_types: if (mode & mask) == mask: return self._format_code(text, code) # executable file? if mode & (stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH): return self._format_code(text, 'ex') # regular file, format according to its extension _, ext = os.path.splitext(text) if ext: return self._format_ext(text, ext) return text def format(self, file, cwd=None, follow_symlinks=False, show_target=False): """ Format and color the file given by the name `file`. If `cwd` is not None, it should be a string for the directory relative to which `file` is looked up, or an integer representing a directory descriptor (usually from `os.open()`). Use follow_symlinks to dereference symlinks entirely. Use show_target=True with follow_symlinks=False to format both the link name and its target in the format: linkname -> target With linkname formatted as a link color, and the link target formatted as its respective type. If the link target is another link, it will not be recursively dereferenced. """ if not self.loaded: return file try: statbuf = stat_at(file, cwd, follow_symlinks) except OSError as e: return '%s [Error stat-ing: %s]'%(file, e.strerror) mode = statbuf.st_mode if (not follow_symlinks) and show_target and stat.S_ISLNK(mode): target_path = readlink_at(file, cwd) try: stat_at(target_path, cwd) # check for broken link target = self.format(target_path, cwd, False, False) except OSError: # format as "orphan" target = self._format_code(target_path, 'or') + ' [broken link]' return self._format_code(file, 'ln') + ' -> ' + target return self.format_mode(file, mode) PKx!O`ffdircolors/pyls/__init__.py# dircolors.pyls package """ pyls - a simple implementation of `ls` used to test python-dircolors """ PKx!Odircolors/pyls/__main__.py# pyls - a simple implementation of `ls` used to test python-dircolors # # Copyright 2019 Allen Wild # SPDX-License-Identifier: Apache-2.0 """ dircolors.pyls module __main__ wrapper """ from .pyls import main if __name__ == '__main__': main() PKx!OPdircolors/pyls/pyls.py# pyls - a simple implementation of `ls` used to test python-dircolors # # Copyright 2019 Allen Wild # SPDX-License-Identifier: Apache-2.0 """ pyls - a simple implementation of `ls` used to test python-dircolors """ import argparse import os import sys from ..dircolors import Dircolors def main(): """ pyls main function """ # pylint: disable=invalid-name parser = argparse.ArgumentParser(prog='pyls', description='Python implementation of the "ls" command for testing dircolors') parser.add_argument('files', nargs='*', metavar='FILE', help='File or directories to list') args = parser.parse_args() files = args.files if not files: files = ['.'] dc = Dircolors() for f in files: try: if os.path.isdir(f) and not os.path.islink(f): if f != '.' and len(files) > 1: print(dc.format(f) + ':') for ff in sorted(os.listdir(f)): print(dc.format(ff, f, show_target=True)) print() else: print(dc.format(f, show_target=True)) except OSError as e: print('%s: error: %s'%(f, e), file=sys.stderr) PK!H&-1*dircolors-0.0.3.dist-info/entry_points.txtN+I/N.,()*)M,J/*qUnbfPK O^,^,%dircolors-0.0.3.dist-info/LICENSE.txt Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. PK!HPOdircolors-0.0.3.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,szd&Y)r$[)T&UrPK!H"dircolors-0.0.3.dist-info/METADATAX]s۸}ǯ@':eͬZ;udDIәlGHHBL,Z ek;_,< "ȄJ3:9ew3)XǺœ$9c(gCF\,7<PIV\p/mJ8q[,u)9)(z_tQ~[Sv*Ϧe7VR;l|/w첂%v/s_y5P Z 9?uCH4(S)+$z2gpZԪɕ^j?KgOCfv]9VMY`/{+g3~'܊~~/ҚGϗHփXQ ~+BlDsp{O''~oNܗ OǭcxHnCO3\TXSH7\9{zQM+Tl͎|VV^n[3<#D)'<_W:%\#U*h--{^/rT]ݓϰ}b}ie- "'x֫瑹1_U >D? 8B4%#A^iD* UEF;K^A0 YH %\k]hۚ 3!{pDtO~| m?6RH HGeE_AђLAa0x1_E',qdG Ԡ((hYc̢?Wf?6ᄖ;iD@ %$-ْ|d˵s[ȕ~YCkzҸqÖ3 c7ӳi)vo}jNy±V[#%eF]ΨJIJ]3iclx Q7y*I7-I r[PE*נnJ ϹffjFb}h ܉Wo OH8eEJ!Dw>X"7q$*Ib@XMy'C78V5OA\]RdёU4'l~zdט<!鰘Kb+|j `ȍyhze? ^Gv'(QQGR:HS3& rRٯf`u YJDb@rHD: y2%H&VaI\z?يHY:t"& @4:bH~·a0XEQD-Nkӹm;ԊB/W77rrE"G 3R^G MbA灠FGqO.f1+29 14u~"kOVNhhOG~mce[HiS "}'/kYzJxaKLKDx+yQ_zi-.; c!P2V8ePPO;޵ C_F Moǘfsr͛7-;t][dg[݂|G :Spv8_'0(`@6 }km_SÿR2LzE%҉x]2!̒鉭p$XM6&cVTV`ٝYja]aA ڳ ?MT#ճ`v !1W _x^KCkYON|l0:{urk1q-;1ؔ^~X.-얆=cn2Zz=AԸB-sAz;*ueВ迤^OJH{ 8Nqs<*ENMM%(;7o>UnVBf}Q V!Awqk&6ˌWj2:9 c 2emfӟzߙ}[%s{sn.O(tdB;Kf7t17[')ja#oͫ7@Q/\ĖqR!zq0Rʷ($H)/ߏf[~6!h0 &G"Ðe@#XCANN˭OH 48x{`P)p1  PK!H8< dircolors-0.0.3.dist-info/RECORD}I@ư7r`YFPB!kl $$5奫/]ŨAj46c} sh-z!Y'⊑)j&_aHl9$ rWZGCY r\[ '."mf>TZ}XknPPre%:(ȎIB<׎kJ7sQ+mj(&f#GѤUL֏jbrّ:wsc|f#Arޙv2F߈UD_}y|qYyOC=-5 b$+1d6?#qNV0$V|CmbNI=tspkP{md#ܦSzQkωnea4aE(텋񊹒֌NL.ϙ+8 >xLǃ?+Vd5A2r){,;-}Pv)W6egגYV`i wn~B