Warning: Permanently added '2620:52:3:1:dead:beef:cafe:c115' (ED25519) to the list of known hosts.

You can reproduce this build on your computer by running:

  sudo dnf install copr-rpmbuild
  /usr/bin/copr-rpmbuild --verbose --drop-resultdir --task-url https://copr.fedorainfracloud.org/backend/get-build-task/8582359-fedora-40-x86_64 --chroot fedora-40-x86_64


Version: 1.2
PID: 8774
Logging PID: 8775
Task:
{'allow_user_ssh': False,
 'appstream': True,
 'background': False,
 'bootstrap': 'on',
 'build_id': 8582359,
 'buildroot_pkgs': [],
 'chroot': 'fedora-40-x86_64',
 'enable_net': True,
 'fedora_review': False,
 'git_hash': 'a33946dd9dd2a461de49198b52f16507cf831cb4',
 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/elkhan/PyCharm/pycharm-community',
 'isolation': 'default',
 'memory_reqs': 2048,
 'package_name': 'pycharm-community',
 'package_version': '2024.3.2-1',
 'project_dirname': 'PyCharm',
 'project_name': 'PyCharm',
 'project_owner': 'elkhan',
 'repo_priority': None,
 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/elkhan/PyCharm/fedora-40-x86_64/',
            'id': 'copr_base',
            'name': 'Copr repository',
            'priority': None}],
 'sandbox': 'elkhan/PyCharm--elkhan',
 'source_json': {},
 'source_type': None,
 'ssh_public_keys': None,
 'storage': None,
 'submitter': 'elkhan',
 'tags': [],
 'task_id': '8582359-fedora-40-x86_64',
 'timeout': 18000,
 'uses_devel_repo': False,
 'with_opts': [],
 'without_opts': []}

Running: git clone https://copr-dist-git.fedorainfracloud.org/git/elkhan/PyCharm/pycharm-community /var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community --depth 500 --no-single-branch --recursive

cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/elkhan/PyCharm/pycharm-community', '/var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community', '--depth', '500', '--no-single-branch', '--recursive']
cwd: .
rc: 0
stdout: 
stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community'...

Running: git checkout a33946dd9dd2a461de49198b52f16507cf831cb4 --

cmd: ['git', 'checkout', 'a33946dd9dd2a461de49198b52f16507cf831cb4', '--']
cwd: /var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community
rc: 0
stdout: 
stderr: Note: switching to 'a33946dd9dd2a461de49198b52f16507cf831cb4'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at a33946d automatic import of pycharm-community

Running: dist-git-client sources
/usr/bin/tail: /var/lib/copr-rpmbuild/main.log: file truncated
100  751M  100  751M    0     0  15.1M      0  0:00:49  0:00:49 --:--:-- 14.5M
INFO: Reading stdout from command: md5sum pycharm-community-2024.3.2.tar.gz

Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community/pycharm-community.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1738090623.831555 -r /var/lib/copr-rpmbuild/results/configs/child.cfg
INFO: mock.py version 6.0 starting (python version = 3.13.0, NVR = mock-6.0-1.fc41), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community/pycharm-community.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1738090623.831555 -r /var/lib/copr-rpmbuild/results/configs/child.cfg
Start(bootstrap): init plugins
INFO: tmpfs initialized
INFO: selinux enabled
INFO: chroot_scan: initialized
INFO: compress_logs: initialized
Finish(bootstrap): init plugins
Start: init plugins
INFO: tmpfs initialized
INFO: selinux enabled
INFO: chroot_scan: initialized
INFO: compress_logs: initialized
Finish: init plugins
INFO: Signal handler active
Start: run
INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community/pycharm-community.spec)  Config(fedora-40-x86_64)
Start: clean chroot
Finish: clean chroot
Mock Version: 6.0
INFO: Mock Version: 6.0
Start(bootstrap): chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-40-x86_64-bootstrap-1738090623.831555/root.
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start(bootstrap): cleaning package manager metadata
Finish(bootstrap): cleaning package manager metadata
INFO: Package manager dnf5 detected and used (fallback)
Start(bootstrap): installing dnf5 tooling
Updating and loading repositories:
 updates                                100% |  16.9 MiB/s |  12.6 MiB |  00m01s
 fedora                                 100% |  18.0 MiB/s |  20.8 MiB |  00m01s
 Copr repository                        100% |  43.2 KiB/s |   3.8 KiB |  00m00s
Repositories loaded.
Package                        Arch   Version                     Repository      Size
Installing:
 dnf5                          x86_64 5.1.17-3.fc40               updates      1.7 MiB
 dnf5-plugins                  x86_64 5.1.17-3.fc40               updates      1.1 MiB
Installing dependencies:
 alternatives                  x86_64 1.27-1.fc40                 updates     66.3 KiB
 audit-libs                    x86_64 4.0.3-1.fc40                updates    347.4 KiB
 basesystem                    noarch 11-20.fc40                  fedora       0.0   B
 bash                          x86_64 5.2.26-3.fc40               fedora       8.1 MiB
 bzip2-libs                    x86_64 1.0.8-18.fc40               fedora      80.7 KiB
 ca-certificates               noarch 2024.2.69_v8.0.401-1.0.fc40 updates      2.4 MiB
 coreutils                     x86_64 9.4-9.fc40                  updates      5.8 MiB
 coreutils-common              x86_64 9.4-9.fc40                  updates     11.4 MiB
 crypto-policies               noarch 20241011-1.git5930b9a.fc40  updates    158.0 KiB
 curl                          x86_64 8.6.0-10.fc40               updates    738.6 KiB
 cyrus-sasl-lib                x86_64 2.1.28-19.fc40              fedora       2.3 MiB
 dnf-data                      noarch 4.22.0-1.fc40               updates     38.7 KiB
 elfutils-default-yama-scope   noarch 0.192-7.fc40                updates      1.8 KiB
 elfutils-libelf               x86_64 0.192-7.fc40                updates      1.2 MiB
 elfutils-libs                 x86_64 0.192-7.fc40                updates    670.3 KiB
 fedora-gpg-keys               noarch 40-2                        updates    124.7 KiB
 fedora-release                noarch 40-40                       updates      0.0   B
 fedora-release-common         noarch 40-40                       updates     19.2 KiB
 fedora-release-identity-basic noarch 40-40                       updates    654.0   B
 fedora-repos                  noarch 40-2                        updates      4.9 KiB
 file-libs                     x86_64 5.45-4.fc40                 fedora       9.9 MiB
 filesystem                    x86_64 3.18-8.fc40                 fedora     106.0   B
 findutils                     x86_64 1:4.9.0-9.fc40              updates      1.5 MiB
 fmt                           x86_64 10.2.1-5.fc40               updates    371.4 KiB
 gawk                          x86_64 5.3.0-3.fc40                fedora       1.7 MiB
 gdbm-libs                     x86_64 1:1.23-6.fc40               fedora     121.9 KiB
 glib2                         x86_64 2.80.3-1.fc40               updates     14.6 MiB
 glibc                         x86_64 2.39-37.fc40                updates      6.6 MiB
 glibc-common                  x86_64 2.39-37.fc40                updates      1.0 MiB
 glibc-minimal-langpack        x86_64 2.39-37.fc40                updates      0.0   B
 gmp                           x86_64 1:6.2.1-8.fc40              fedora     794.6 KiB
 gnutls                        x86_64 3.8.6-1.fc40                updates      3.2 MiB
 grep                          x86_64 3.11-7.fc40                 fedora       1.0 MiB
 json-c                        x86_64 0.17-3.fc40                 fedora      82.4 KiB
 keyutils-libs                 x86_64 1.6.3-3.fc40                fedora      54.4 KiB
 krb5-libs                     x86_64 1.21.3-2.fc40               updates      2.3 MiB
 libacl                        x86_64 2.3.2-1.fc40                fedora      40.0 KiB
 libarchive                    x86_64 3.7.2-7.fc40                updates    922.6 KiB
 libattr                       x86_64 2.5.2-3.fc40                fedora      28.5 KiB
 libblkid                      x86_64 2.40.2-1.fc40               updates    258.6 KiB
 libbrotli                     x86_64 1.1.0-3.fc40                fedora     829.5 KiB
 libcap                        x86_64 2.69-8.fc40                 updates    219.8 KiB
 libcap-ng                     x86_64 0.8.4-4.fc40                fedora      73.1 KiB
 libcom_err                    x86_64 1.47.0-5.fc40               fedora      67.2 KiB
 libcurl                       x86_64 8.6.0-10.fc40               updates    776.8 KiB
 libdnf5                       x86_64 5.1.17-3.fc40               updates      2.9 MiB
 libdnf5-cli                   x86_64 5.1.17-3.fc40               updates    559.1 KiB
 libeconf                      x86_64 0.6.2-2.fc40                updates     58.0 KiB
 libevent                      x86_64 2.1.12-12.fc40              fedora     895.6 KiB
 libffi                        x86_64 3.4.4-7.fc40                fedora      81.6 KiB
 libgcc                        x86_64 14.2.1-3.fc40               updates    274.6 KiB
 libgomp                       x86_64 14.2.1-3.fc40               updates    523.6 KiB
 libidn2                       x86_64 2.3.7-1.fc40                fedora     329.1 KiB
 libmodulemd                   x86_64 2.15.0-12.fc40              updates    717.2 KiB
 libmount                      x86_64 2.40.2-1.fc40               updates    355.8 KiB
 libnghttp2                    x86_64 1.59.0-3.fc40               updates    166.1 KiB
 libpsl                        x86_64 0.21.5-3.fc40               fedora      80.5 KiB
 librepo                       x86_64 1.19.0-1.fc40               updates    244.5 KiB
 libselinux                    x86_64 3.7-5.fc40                  updates    177.0 KiB
 libsepol                      x86_64 3.7-2.fc40                  updates    817.9 KiB
 libsmartcols                  x86_64 2.40.2-1.fc40               updates    180.4 KiB
 libsolv                       x86_64 0.7.31-1.fc40               updates    940.3 KiB
 libssh                        x86_64 0.10.6-5.fc40               fedora     509.3 KiB
 libssh-config                 noarch 0.10.6-5.fc40               fedora     277.0   B
 libstdc++                     x86_64 14.2.1-3.fc40               updates      2.8 MiB
 libtasn1                      x86_64 4.19.0-6.fc40               fedora     175.7 KiB
 libtool-ltdl                  x86_64 2.4.7-10.fc40               fedora      66.2 KiB
 libunistring                  x86_64 1.1-7.fc40                  fedora       1.7 MiB
 libuuid                       x86_64 2.40.2-1.fc40               updates     37.5 KiB
 libverto                      x86_64 0.3.2-8.fc40                fedora      29.5 KiB
 libxcrypt                     x86_64 4.4.38-3.fc40               updates    268.0 KiB
 libxml2                       x86_64 2.12.9-1.fc40               updates      1.7 MiB
 libyaml                       x86_64 0.2.5-14.fc40               fedora     130.4 KiB
 libzstd                       x86_64 1.5.6-1.fc40                updates    787.9 KiB
 lua-libs                      x86_64 5.4.6-5.fc40                fedora     281.1 KiB
 lz4-libs                      x86_64 1.9.4-6.fc40                fedora     129.4 KiB
 mpfr                          x86_64 4.2.1-4.fc40                updates    832.0 KiB
 ncurses-base                  noarch 6.4-12.20240127.fc40        fedora     326.2 KiB
 ncurses-libs                  x86_64 6.4-12.20240127.fc40        fedora     963.2 KiB
 nettle                        x86_64 3.9.1-6.fc40                fedora     790.1 KiB
 openldap                      x86_64 2.6.8-1.fc40                updates    640.3 KiB
 openssl-libs                  x86_64 1:3.2.2-3.fc40              updates      7.8 MiB
 p11-kit                       x86_64 0.25.5-1.fc40               updates      2.2 MiB
 p11-kit-trust                 x86_64 0.25.5-1.fc40               updates    391.4 KiB
 pam-libs                      x86_64 1.6.1-5.fc40                updates    135.0 KiB
 pcre2                         x86_64 10.44-1.fc40                updates    653.5 KiB
 pcre2-syntax                  noarch 10.44-1.fc40                updates    251.6 KiB
 popt                          x86_64 1.19-6.fc40                 fedora     136.9 KiB
 publicsuffix-list-dafsa       noarch 20250116-1.fc40             updates     68.5 KiB
 readline                      x86_64 8.2-8.fc40                  fedora     489.2 KiB
 rpm                           x86_64 4.19.1.1-1.fc40             fedora       3.0 MiB
 rpm-build-libs                x86_64 4.19.1.1-1.fc40             fedora     198.4 KiB
 rpm-libs                      x86_64 4.19.1.1-1.fc40             fedora     709.9 KiB
 rpm-sequoia                   x86_64 1.7.0-3.fc40                updates      2.4 MiB
 sdbus-cpp                     x86_64 1.4.0-2.fc40                fedora     308.0 KiB
 sed                           x86_64 4.9-1.fc40                  fedora     861.5 KiB
 setup                         noarch 2.14.5-2.fc40               fedora     720.4 KiB
 sqlite-libs                   x86_64 3.45.1-2.fc40               fedora       1.4 MiB
 systemd-libs                  x86_64 255.16-1.fc40               updates      1.9 MiB
 xz-libs                       x86_64 1:5.4.6-3.fc40              fedora     209.8 KiB
 zchunk-libs                   x86_64 1.5.1-1.fc40                updates    101.1 KiB
 zlib-ng-compat                x86_64 2.1.7-2.fc40                updates    134.0 KiB

Transaction Summary:
 Installing:       104 packages

Total size of inbound packages is 38 MiB. Need to download 38 MiB.
After this operation, 128 MiB extra will be used (install 128 MiB, remove 0 B).
[  1/104] dnf5-plugins-0:5.1.17-3.fc40. 100% |   2.0 MiB/s | 358.0 KiB |  00m00s
[  2/104] libdnf5-0:5.1.17-3.fc40.x86_6 100% |   5.0 MiB/s |   1.0 MiB |  00m00s
[  3/104] dnf5-0:5.1.17-3.fc40.x86_64   100% |   3.5 MiB/s | 699.5 KiB |  00m00s
[  4/104] libdnf5-cli-0:5.1.17-3.fc40.x 100% |   7.5 MiB/s | 230.9 KiB |  00m00s
[  5/104] json-c-0:0.17-3.fc40.x86_64   100% | 245.9 KiB/s |  44.0 KiB |  00m00s
[  6/104] sdbus-cpp-0:1.4.0-2.fc40.x86_ 100% | 526.5 KiB/s | 110.0 KiB |  00m00s
[  7/104] rpm-libs-0:4.19.1.1-1.fc40.x8 100% |   1.3 MiB/s | 308.9 KiB |  00m00s
[  8/104] rpm-build-libs-0:4.19.1.1-1.f 100% |   1.6 MiB/s |  95.0 KiB |  00m00s
[  9/104] bzip2-libs-0:1.0.8-18.fc40.x8 100% |   1.3 MiB/s |  40.9 KiB |  00m00s
[ 10/104] libacl-0:2.3.2-1.fc40.x86_64  100% | 814.3 KiB/s |  24.4 KiB |  00m00s
[ 11/104] sqlite-libs-0:3.45.1-2.fc40.x 100% |   7.5 MiB/s | 705.1 KiB |  00m00s
[ 12/104] lua-libs-0:5.4.6-5.fc40.x86_6 100% |   3.0 MiB/s | 131.9 KiB |  00m00s
[ 13/104] popt-0:1.19-6.fc40.x86_64     100% |   1.7 MiB/s |  66.7 KiB |  00m00s
[ 14/104] rpm-0:4.19.1.1-1.fc40.x86_64  100% |  14.7 MiB/s | 540.1 KiB |  00m00s
[ 15/104] xz-libs-1:5.4.6-3.fc40.x86_64 100% |   3.5 MiB/s | 110.0 KiB |  00m00s
[ 16/104] libattr-0:2.5.2-3.fc40.x86_64 100% | 599.9 KiB/s |  18.0 KiB |  00m00s
[ 17/104] sed-0:4.9-1.fc40.x86_64       100% |   8.9 MiB/s | 318.2 KiB |  00m00s
[ 18/104] file-libs-0:5.45-4.fc40.x86_6 100% |   8.0 MiB/s | 762.7 KiB |  00m00s
[ 19/104] bash-0:5.2.26-3.fc40.x86_64   100% |  17.0 MiB/s |   1.8 MiB |  00m00s
[ 20/104] ncurses-libs-0:6.4-12.2024012 100% |   6.9 MiB/s | 332.5 KiB |  00m00s
[ 21/104] filesystem-0:3.18-8.fc40.x86_ 100% |  17.0 MiB/s |   1.1 MiB |  00m00s
[ 22/104] setup-0:2.14.5-2.fc40.noarch  100% |   4.9 MiB/s | 154.7 KiB |  00m00s
[ 23/104] ncurses-base-0:6.4-12.2024012 100% |   2.7 MiB/s |  88.8 KiB |  00m00s
[ 24/104] basesystem-0:11-20.fc40.noarc 100% | 205.4 KiB/s |   7.2 KiB |  00m00s
[ 25/104] glibc-common-0:2.39-37.fc40.x 100% |   5.9 MiB/s | 368.8 KiB |  00m00s
[ 26/104] glibc-0:2.39-37.fc40.x86_64   100% |  26.4 MiB/s |   2.2 MiB |  00m00s
[ 27/104] zlib-ng-compat-0:2.1.7-2.fc40 100% |   3.6 MiB/s |  77.7 KiB |  00m00s
[ 28/104] libselinux-0:3.7-5.fc40.x86_6 100% |   3.6 MiB/s |  88.0 KiB |  00m00s
[ 29/104] libsepol-0:3.7-2.fc40.x86_64  100% |  13.4 MiB/s | 342.2 KiB |  00m00s
[ 30/104] libgcc-0:14.2.1-3.fc40.x86_64 100% |   5.2 MiB/s | 133.3 KiB |  00m00s
[ 31/104] systemd-libs-0:255.16-1.fc40. 100% |  21.6 MiB/s | 706.9 KiB |  00m00s
[ 32/104] lz4-libs-0:1.9.4-6.fc40.x86_6 100% |   2.1 MiB/s |  67.2 KiB |  00m00s
[ 33/104] libstdc++-0:14.2.1-3.fc40.x86 100% |  14.9 MiB/s | 886.5 KiB |  00m00s
[ 34/104] libcap-0:2.69-8.fc40.x86_64   100% |   4.0 MiB/s |  85.7 KiB |  00m00s
[ 35/104] libzstd-0:1.5.6-1.fc40.x86_64 100% |  12.1 MiB/s | 309.2 KiB |  00m00s
[ 36/104] elfutils-libelf-0:0.192-7.fc4 100% |   8.9 MiB/s | 208.5 KiB |  00m00s
[ 37/104] rpm-sequoia-0:1.7.0-3.fc40.x8 100% |  25.9 MiB/s | 902.0 KiB |  00m00s
[ 38/104] elfutils-libs-0:0.192-7.fc40. 100% |  10.7 MiB/s | 263.6 KiB |  00m00s
[ 39/104] libgomp-0:14.2.1-3.fc40.x86_6 100% |  14.4 MiB/s | 353.9 KiB |  00m00s
[ 40/104] curl-0:8.6.0-10.fc40.x86_64   100% |  11.2 MiB/s | 299.2 KiB |  00m00s
[ 41/104] findutils-1:4.9.0-9.fc40.x86_ 100% |  16.0 MiB/s | 491.4 KiB |  00m00s
[ 42/104] libarchive-0:3.7.2-7.fc40.x86 100% |  16.0 MiB/s | 408.5 KiB |  00m00s
[ 43/104] ca-certificates-0:2024.2.69_v 100% |  18.9 MiB/s | 871.2 KiB |  00m00s
[ 44/104] openssl-libs-1:3.2.2-3.fc40.x 100% |  35.5 MiB/s |   2.3 MiB |  00m00s
[ 45/104] grep-0:3.11-7.fc40.x86_64     100% |   6.1 MiB/s | 300.2 KiB |  00m00s
[ 46/104] crypto-policies-0:20241011-1. 100% |   4.4 MiB/s |  98.9 KiB |  00m00s
[ 47/104] pcre2-0:10.44-1.fc40.x86_64   100% |  10.3 MiB/s | 242.9 KiB |  00m00s
[ 48/104] pcre2-syntax-0:10.44-1.fc40.n 100% |   6.1 MiB/s | 149.8 KiB |  00m00s
[ 49/104] fmt-0:10.2.1-5.fc40.x86_64    100% |   5.8 MiB/s | 124.7 KiB |  00m00s
[ 50/104] libsmartcols-0:2.40.2-1.fc40. 100% |   3.4 MiB/s |  83.2 KiB |  00m00s
[ 51/104] libffi-0:3.4.4-7.fc40.x86_64  100% |   1.2 MiB/s |  39.4 KiB |  00m00s
[ 52/104] libmodulemd-0:2.15.0-12.fc40. 100% |   2.1 MiB/s | 232.3 KiB |  00m00s
[ 53/104] libyaml-0:0.2.5-14.fc40.x86_6 100% | 597.9 KiB/s |  59.2 KiB |  00m00s
[ 54/104] glib2-0:2.80.3-1.fc40.x86_64  100% |  21.0 MiB/s |   3.0 MiB |  00m00s
[ 55/104] libsolv-0:0.7.31-1.fc40.x86_6 100% |  15.0 MiB/s | 430.7 KiB |  00m00s
[ 56/104] librepo-0:1.19.0-1.fc40.x86_6 100% |   3.2 MiB/s |  99.6 KiB |  00m00s
[ 57/104] libxml2-0:2.12.9-1.fc40.x86_6 100% |  24.0 MiB/s | 688.0 KiB |  00m00s
[ 58/104] pam-libs-0:1.6.1-5.fc40.x86_6 100% |   2.7 MiB/s |  57.2 KiB |  00m00s
[ 59/104] gnutls-0:3.8.6-1.fc40.x86_64  100% |  34.7 MiB/s |   1.1 MiB |  00m00s
[ 60/104] gmp-1:6.2.1-8.fc40.x86_64     100% |   7.4 MiB/s | 312.5 KiB |  00m00s
[ 61/104] libidn2-0:2.3.7-1.fc40.x86_64 100% |   3.4 MiB/s | 118.7 KiB |  00m00s
[ 62/104] libtasn1-0:4.19.0-6.fc40.x86_ 100% |   2.4 MiB/s |  73.7 KiB |  00m00s
[ 63/104] libmount-0:2.40.2-1.fc40.x86_ 100% |   6.9 MiB/s | 155.2 KiB |  00m00s
[ 64/104] nettle-0:3.9.1-6.fc40.x86_64  100% |   9.9 MiB/s | 424.9 KiB |  00m00s
[ 65/104] libunistring-0:1.1-7.fc40.x86 100% |   9.3 MiB/s | 545.5 KiB |  00m00s
[ 66/104] libblkid-0:2.40.2-1.fc40.x86_ 100% |   5.5 MiB/s | 124.1 KiB |  00m00s
[ 67/104] libuuid-0:2.40.2-1.fc40.x86_6 100% |   1.3 MiB/s |  28.6 KiB |  00m00s
[ 68/104] elfutils-default-yama-scope-0 100% | 623.4 KiB/s |  12.5 KiB |  00m00s
[ 69/104] dnf-data-0:4.22.0-1.fc40.noar 100% |   1.8 MiB/s |  39.5 KiB |  00m00s
[ 70/104] p11-kit-0:0.25.5-1.fc40.x86_6 100% |  17.8 MiB/s | 491.2 KiB |  00m00s
[ 71/104] p11-kit-trust-0:0.25.5-1.fc40 100% |   5.0 MiB/s | 132.0 KiB |  00m00s
[ 72/104] audit-libs-0:4.0.3-1.fc40.x86 100% |   5.7 MiB/s | 128.9 KiB |  00m00s
[ 73/104] libeconf-0:0.6.2-2.fc40.x86_6 100% |   1.5 MiB/s |  32.0 KiB |  00m00s
[ 74/104] alternatives-0:1.27-1.fc40.x8 100% |   1.7 MiB/s |  40.7 KiB |  00m00s
[ 75/104] libcap-ng-0:0.8.4-4.fc40.x86_ 100% |   1.0 MiB/s |  32.6 KiB |  00m00s
[ 76/104] zchunk-libs-0:1.5.1-1.fc40.x8 100% |   2.4 MiB/s |  52.1 KiB |  00m00s
[ 77/104] fedora-release-0:40-40.noarch 100% | 547.5 KiB/s |  11.0 KiB |  00m00s
[ 78/104] fedora-release-common-0:40-40 100% |   1.0 MiB/s |  21.5 KiB |  00m00s
[ 79/104] coreutils-0:9.4-9.fc40.x86_64 100% |  30.1 MiB/s |   1.1 MiB |  00m00s
[ 80/104] libcurl-0:8.6.0-10.fc40.x86_6 100% |   7.2 MiB/s | 344.8 KiB |  00m00s
[ 81/104] coreutils-common-0:9.4-9.fc40 100% |  37.1 MiB/s |   2.1 MiB |  00m00s
[ 82/104] libbrotli-0:1.1.0-3.fc40.x86_ 100% |  10.0 MiB/s | 338.4 KiB |  00m00s
[ 83/104] libpsl-0:0.21.5-3.fc40.x86_64 100% |   2.1 MiB/s |  63.9 KiB |  00m00s
[ 84/104] libssh-config-0:0.10.6-5.fc40 100% | 301.0 KiB/s |   9.0 KiB |  00m00s
[ 85/104] libssh-0:0.10.6-5.fc40.x86_64 100% |   5.0 MiB/s | 210.6 KiB |  00m00s
[ 86/104] krb5-libs-0:1.21.3-2.fc40.x86 100% |  26.5 MiB/s | 759.5 KiB |  00m00s
[ 87/104] keyutils-libs-0:1.6.3-3.fc40. 100% |   1.0 MiB/s |  31.5 KiB |  00m00s
[ 88/104] libcom_err-0:1.47.0-5.fc40.x8 100% | 817.9 KiB/s |  25.4 KiB |  00m00s
[ 89/104] libverto-0:0.3.2-8.fc40.x86_6 100% | 684.6 KiB/s |  20.5 KiB |  00m00s
[ 90/104] libnghttp2-0:1.59.0-3.fc40.x8 100% |   3.5 MiB/s |  75.3 KiB |  00m00s
[ 91/104] openldap-0:2.6.8-1.fc40.x86_6 100% |  10.8 MiB/s | 255.3 KiB |  00m00s
[ 92/104] libtool-ltdl-0:2.4.7-10.fc40. 100% | 951.5 KiB/s |  36.2 KiB |  00m00s
[ 93/104] libevent-0:2.1.12-12.fc40.x86 100% |   5.5 MiB/s | 257.2 KiB |  00m00s
[ 94/104] cyrus-sasl-lib-0:2.1.28-19.fc 100% |  13.5 MiB/s | 789.3 KiB |  00m00s
[ 95/104] gdbm-libs-1:1.23-6.fc40.x86_6 100% |   1.8 MiB/s |  56.2 KiB |  00m00s
[ 96/104] readline-0:8.2-8.fc40.x86_64  100% |   5.0 MiB/s | 213.3 KiB |  00m00s
[ 97/104] glibc-minimal-langpack-0:2.39 100% |   3.9 MiB/s |  84.1 KiB |  00m00s
[ 98/104] gawk-0:5.3.0-3.fc40.x86_64    100% |  17.3 MiB/s |   1.1 MiB |  00m00s
[ 99/104] fedora-release-identity-basic 100% | 558.8 KiB/s |  11.7 KiB |  00m00s
[100/104] fedora-repos-0:40-2.noarch    100% | 474.3 KiB/s |   9.5 KiB |  00m00s
[101/104] fedora-gpg-keys-0:40-2.noarch 100% |   6.1 MiB/s | 132.1 KiB |  00m00s
[102/104] publicsuffix-list-dafsa-0:202 100% |   2.7 MiB/s |  58.8 KiB |  00m00s
[103/104] mpfr-0:4.2.1-4.fc40.x86_64    100% |  14.2 MiB/s | 348.9 KiB |  00m00s
[104/104] libxcrypt-0:4.4.38-3.fc40.x86 100% |   5.5 MiB/s | 119.3 KiB |  00m00s
--------------------------------------------------------------------------------
[104/104] Total                         100% |  22.1 MiB/s |  38.0 MiB |  00m02s
Running transaction
Importing OpenPGP key 0xA15B79CC:
 UserID     : "Fedora (40) <fedora-40-primary@fedoraproject.org>"
 Fingerprint: 115DF9AEF857853EE8445D0A0727707EA15B79CC
 From       : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-40-primary
The key was successfully imported.
[  1/106] Verify package files          100% | 650.0   B/s | 104.0   B |  00m00s
[  2/106] Prepare transaction           100% |   1.8 KiB/s | 104.0   B |  00m00s
[  3/106] Installing libgcc-0:14.2.1-3. 100% |  89.9 MiB/s | 276.3 KiB |  00m00s
[  4/106] Installing crypto-policies-0: 100% |  15.5 MiB/s | 190.6 KiB |  00m00s
[  5/106] Installing publicsuffix-list- 100% |  67.6 MiB/s |  69.2 KiB |  00m00s
[  6/106] Installing fedora-release-ide 100% | 890.6 KiB/s | 912.0   B |  00m00s
[  7/106] Installing fedora-gpg-keys-0: 100% |  16.6 MiB/s | 169.7 KiB |  00m00s
[  8/106] Installing fedora-repos-0:40- 100% |   5.6 MiB/s |   5.7 KiB |  00m00s
[  9/106] Installing fedora-release-com 100% |  11.4 MiB/s |  23.4 KiB |  00m00s
[ 10/106] Installing fedora-release-0:4 100% |   0.0   B/s | 124.0   B |  00m00s
[ 11/106] Installing setup-0:2.14.5-2.f 100% |  44.3 MiB/s | 725.8 KiB |  00m00s
[ 12/106] Installing filesystem-0:3.18- 100% |   1.6 MiB/s | 212.4 KiB |  00m00s
[ 13/106] Installing basesystem-0:11-20 100% |   0.0   B/s | 124.0   B |  00m00s
[ 14/106] Installing libssh-config-0:0. 100% | 796.9 KiB/s | 816.0   B |  00m00s
[ 15/106] Installing coreutils-common-0 100% | 159.2 MiB/s |  11.5 MiB |  00m00s
[ 16/106] Installing dnf-data-0:4.22.0- 100% |  20.1 MiB/s |  41.2 KiB |  00m00s
>>> [RPM] /etc/dnf/dnf.conf created as /etc/dnf/dnf.conf.rpmnew
[ 17/106] Installing pcre2-syntax-0:10. 100% |  27.6 MiB/s | 254.1 KiB |  00m00s
[ 18/106] Installing ncurses-base-0:6.4 100% |  22.9 MiB/s | 351.6 KiB |  00m00s
[ 19/106] Installing ncurses-libs-0:6.4 100% |  86.1 MiB/s | 969.7 KiB |  00m00s
warning: posix.fork(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
warning: posix.wait(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
warning: posix.exec(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
warning: posix.fork(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
warning: posix.wait(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
warning: posix.exec(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
[ 20/106] Installing glibc-0:2.39-37.fc 100% |  37.8 MiB/s |   6.6 MiB |  00m00s
[ 21/106] Installing bash-0:5.2.26-3.fc 100% |  88.7 MiB/s |   8.2 MiB |  00m00s
[ 22/106] Installing glibc-common-0:2.3 100% |  86.4 MiB/s |   1.0 MiB |  00m00s
[ 23/106] Installing glibc-minimal-lang 100% |   0.0   B/s | 124.0   B |  00m00s
[ 24/106] Installing zlib-ng-compat-0:2 100% | 131.6 MiB/s | 134.8 KiB |  00m00s
[ 25/106] Installing libzstd-0:1.5.6-1. 100% |  64.2 MiB/s | 789.2 KiB |  00m00s
[ 26/106] Installing xz-libs-1:5.4.6-3. 100% | 103.0 MiB/s | 210.9 KiB |  00m00s
[ 27/106] Installing libstdc++-0:14.2.1 100% | 110.6 MiB/s |   2.8 MiB |  00m00s
[ 28/106] Installing gmp-1:6.2.1-8.fc40 100% | 155.6 MiB/s | 796.8 KiB |  00m00s
[ 29/106] Installing fmt-0:10.2.1-5.fc4 100% | 121.4 MiB/s | 372.9 KiB |  00m00s
[ 30/106] Installing libxml2-0:2.12.9-1 100% |  31.1 MiB/s |   1.7 MiB |  00m00s
[ 31/106] Installing bzip2-libs-0:1.0.8 100% |  79.9 MiB/s |  81.8 KiB |  00m00s
[ 32/106] Installing popt-0:1.19-6.fc40 100% |  17.5 MiB/s | 143.5 KiB |  00m00s
[ 33/106] Installing pcre2-0:10.44-1.fc 100% | 159.9 MiB/s | 654.9 KiB |  00m00s
[ 34/106] Installing libffi-0:3.4.4-7.f 100% |  40.5 MiB/s |  83.0 KiB |  00m00s
[ 35/106] Installing libtasn1-0:4.19.0- 100% |  86.7 MiB/s | 177.5 KiB |  00m00s
[ 36/106] Installing p11-kit-0:0.25.5-1 100% |  52.6 MiB/s |   2.2 MiB |  00m00s
[ 37/106] Installing libunistring-0:1.1 100% | 144.2 MiB/s |   1.7 MiB |  00m00s
[ 38/106] Installing libidn2-0:2.3.7-1. 100% |  25.2 MiB/s | 335.0 KiB |  00m00s
[ 39/106] Installing elfutils-libelf-0: 100% | 130.0 MiB/s |   1.2 MiB |  00m00s
[ 40/106] Installing sqlite-libs-0:3.45 100% |  87.6 MiB/s |   1.4 MiB |  00m00s
[ 41/106] Installing json-c-0:0.17-3.fc 100% |  40.8 MiB/s |  83.6 KiB |  00m00s
[ 42/106] Installing lua-libs-0:5.4.6-5 100% |  45.9 MiB/s | 282.3 KiB |  00m00s
[ 43/106] Installing libattr-0:2.5.2-3. 100% |  28.8 MiB/s |  29.5 KiB |  00m00s
[ 44/106] Installing libacl-0:2.3.2-1.f 100% |  39.9 MiB/s |  40.8 KiB |  00m00s
[ 45/106] Installing lz4-libs-0:1.9.4-6 100% |  63.7 MiB/s | 130.5 KiB |  00m00s
[ 46/106] Installing libsmartcols-0:2.4 100% |  88.6 MiB/s | 181.5 KiB |  00m00s
[ 47/106] Installing libuuid-0:2.40.2-1 100% |  18.8 MiB/s |  38.6 KiB |  00m00s
[ 48/106] Installing libblkid-0:2.40.2- 100% |  84.5 MiB/s | 259.7 KiB |  00m00s
[ 49/106] Installing libpsl-0:0.21.5-3. 100% |  15.9 MiB/s |  81.6 KiB |  00m00s
[ 50/106] Installing grep-0:3.11-7.fc40 100% |  66.9 MiB/s |   1.0 MiB |  00m00s
[ 51/106] Installing nettle-0:3.9.1-6.f 100% |  77.5 MiB/s | 793.3 KiB |  00m00s
[ 52/106] Installing mpfr-0:4.2.1-4.fc4 100% | 135.7 MiB/s | 833.7 KiB |  00m00s
[ 53/106] Installing file-libs-0:5.45-4 100% | 171.2 MiB/s |   9.9 MiB |  00m00s
[ 54/106] Installing elfutils-default-y 100% | 120.2 KiB/s |   2.0 KiB |  00m00s
[ 55/106] Installing elfutils-libs-0:0. 100% |  65.6 MiB/s | 672.2 KiB |  00m00s
[ 56/106] Installing libsepol-0:3.7-2.f 100% | 133.3 MiB/s | 818.8 KiB |  00m00s
[ 57/106] Installing libselinux-0:3.7-5 100% |  58.0 MiB/s | 178.3 KiB |  00m00s
[ 58/106] Installing sed-0:4.9-1.fc40.x 100% |   5.2 MiB/s | 869.7 KiB |  00m00s
[ 59/106] Installing findutils-1:4.9.0- 100% |  73.3 MiB/s |   1.5 MiB |  00m00s
[ 60/106] Installing libmount-0:2.40.2- 100% |  87.1 MiB/s | 356.9 KiB |  00m00s
[ 61/106] Installing libgomp-0:14.2.1-3 100% |  64.1 MiB/s | 525.0 KiB |  00m00s
[ 62/106] Installing libyaml-0:0.2.5-14 100% |  64.3 MiB/s | 131.8 KiB |  00m00s
[ 63/106] Installing libcap-ng-0:0.8.4- 100% |  36.6 MiB/s |  75.0 KiB |  00m00s
[ 64/106] Installing audit-libs-0:4.0.3 100% |  85.3 MiB/s | 349.5 KiB |  00m00s
[ 65/106] Installing libeconf-0:0.6.2-2 100% |  29.1 MiB/s |  59.6 KiB |  00m00s
[ 66/106] Installing pam-libs-0:1.6.1-5 100% |  44.7 MiB/s | 137.4 KiB |  00m00s
[ 67/106] Installing libcap-0:2.69-8.fc 100% |  24.4 MiB/s | 224.8 KiB |  00m00s
[ 68/106] Installing systemd-libs-0:255 100% | 102.0 MiB/s |   1.9 MiB |  00m00s
[ 69/106] Installing sdbus-cpp-0:1.4.0- 100% | 100.8 MiB/s | 309.7 KiB |  00m00s
[ 70/106] Installing alternatives-0:1.2 100% |  33.2 MiB/s |  68.0 KiB |  00m00s
[ 71/106] Installing p11-kit-trust-0:0. 100% |  15.4 MiB/s | 393.1 KiB |  00m00s
[ 72/106] Installing openssl-libs-1:3.2 100% |  82.4 MiB/s |   7.8 MiB |  00m00s
[ 73/106] Installing coreutils-0:9.4-9. 100% |  35.3 MiB/s |   5.8 MiB |  00m00s
[ 74/106] Installing ca-certificates-0: 100% |   1.6 MiB/s |   2.4 MiB |  00m01s
[ 75/106] Installing zchunk-libs-0:1.5. 100% |  50.1 MiB/s | 102.5 KiB |  00m00s
[ 76/106] Installing rpm-sequoia-0:1.7. 100% |  47.9 MiB/s |   2.4 MiB |  00m00s
[ 77/106] Installing rpm-libs-0:4.19.1. 100% | 115.8 MiB/s | 711.4 KiB |  00m00s
[ 78/106] Installing rpm-build-libs-0:4 100% |  97.3 MiB/s | 199.2 KiB |  00m00s
[ 79/106] Installing libsolv-0:0.7.31-1 100% |  41.8 MiB/s | 942.0 KiB |  00m00s
[ 80/106] Installing libarchive-0:3.7.2 100% |  75.2 MiB/s | 924.5 KiB |  00m00s
[ 81/106] Installing libevent-0:2.1.12- 100% | 109.8 MiB/s | 899.4 KiB |  00m00s
[ 82/106] Installing gnutls-0:3.8.6-1.f 100% | 100.6 MiB/s |   3.2 MiB |  00m00s
[ 83/106] Installing glib2-0:2.80.3-1.f 100% |  78.6 MiB/s |  14.6 MiB |  00m00s
[ 84/106] Installing libmodulemd-0:2.15 100% | 175.7 MiB/s | 719.7 KiB |  00m00s
[ 85/106] Installing libbrotli-0:1.1.0- 100% |  10.2 MiB/s | 831.8 KiB |  00m00s
[ 86/106] Installing keyutils-libs-0:1. 100% |  54.5 MiB/s |  55.8 KiB |  00m00s
[ 87/106] Installing libcom_err-0:1.47. 100% |  66.7 MiB/s |  68.3 KiB |  00m00s
[ 88/106] Installing libverto-0:0.3.2-8 100% |  30.5 MiB/s |  31.3 KiB |  00m00s
[ 89/106] Installing libnghttp2-0:1.59. 100% |  81.6 MiB/s | 167.2 KiB |  00m00s
[ 90/106] Installing libtool-ltdl-0:2.4 100% |  65.7 MiB/s |  67.3 KiB |  00m00s
[ 91/106] Installing gdbm-libs-1:1.23-6 100% |  60.3 MiB/s | 123.6 KiB |  00m00s
[ 92/106] Installing readline-0:8.2-8.f 100% |  20.9 MiB/s | 491.4 KiB |  00m00s
[ 93/106] Installing gawk-0:5.3.0-3.fc4 100% | 101.6 MiB/s |   1.7 MiB |  00m00s
[ 94/106] Installing krb5-libs-0:1.21.3 100% |  96.1 MiB/s |   2.3 MiB |  00m00s
[ 95/106] Installing libssh-0:0.10.6-5. 100% |  20.0 MiB/s | 511.4 KiB |  00m00s
[ 96/106] Installing libxcrypt-0:4.4.38 100% |  88.1 MiB/s | 270.8 KiB |  00m00s
[ 97/106] Installing cyrus-sasl-lib-0:2 100% | 108.7 MiB/s |   2.3 MiB |  00m00s
[ 98/106] Installing openldap-0:2.6.8-1 100% |   9.4 MiB/s | 644.0 KiB |  00m00s
[ 99/106] Installing libcurl-0:8.6.0-10 100% | 151.9 MiB/s | 777.9 KiB |  00m00s
[100/106] Installing curl-0:8.6.0-10.fc 100% |  51.7 MiB/s | 740.9 KiB |  00m00s
[101/106] Installing librepo-0:1.19.0-1 100% | 120.0 MiB/s | 245.8 KiB |  00m00s
[102/106] Installing libdnf5-0:5.1.17-3 100% | 110.6 MiB/s |   2.9 MiB |  00m00s
[103/106] Installing libdnf5-cli-0:5.1. 100% |  24.9 MiB/s | 561.0 KiB |  00m00s
[104/106] Installing dnf5-0:5.1.17-3.fc 100% |  59.6 MiB/s |   1.7 MiB |  00m00s
[105/106] Installing dnf5-plugins-0:5.1 100% |  22.7 MiB/s |   1.1 MiB |  00m00s
warning: posix.fork(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
warning: posix.wait(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
warning: posix.exec(): .fork(), .exec(), .wait() and .redirect2null() are deprecated, use rpm.spawn() or rpm.execute() instead
[106/106] Installing rpm-0:4.19.1.1-1.f 100% |   1.7 MiB/s |   2.4 MiB |  00m01s
Complete!
Finish(bootstrap): installing dnf5 tooling
Start(bootstrap): creating root cache
Finish(bootstrap): creating root cache
Finish(bootstrap): chroot init
Start: chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-40-x86_64-1738090623.831555/root.
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start: cleaning package manager metadata
Finish: cleaning package manager metadata
INFO: enabled HW Info plugin
INFO: Package manager dnf5 detected and used (direct choice)
INFO: Buildroot is handled by package management installed into bootstrap:
  rpm-4.19.1.1-1.fc40.x86_64
  rpm-sequoia-1.7.0-3.fc40.x86_64
  dnf5-5.1.17-3.fc40.x86_64
  dnf5-plugins-5.1.17-3.fc40.x86_64
Start: installing minimal buildroot with dnf5
Updating and loading repositories:
 updates                                100% |  13.9 MiB/s |  12.7 MiB |  00m01s
 fedora                                 100% |   9.4 MiB/s |  20.8 MiB |  00m02s
 Copr repository                        100% |  40.8 KiB/s |   3.8 KiB |  00m00s
Repositories loaded.
Package                           Arch   Version                     Repository      Size
Installing group/module packages:                                                        
 bash                             x86_64 5.2.26-3.fc40               fedora       8.1 MiB
 bzip2                            x86_64 1.0.8-18.fc40               fedora      91.7 KiB
 coreutils                        x86_64 9.4-9.fc40                  updates      5.8 MiB
 cpio                             x86_64 2.15-1.fc40                 fedora       1.1 MiB
 diffutils                        x86_64 3.10-5.fc40                 fedora       1.6 MiB
 fedora-release-common            noarch 40-40                       updates     19.2 KiB
 findutils                        x86_64 1:4.9.0-9.fc40              updates      1.5 MiB
 gawk                             x86_64 5.3.0-3.fc40                fedora       1.7 MiB
 glibc-minimal-langpack           x86_64 2.39-37.fc40                updates      0.0   B
 grep                             x86_64 3.11-7.fc40                 fedora       1.0 MiB
 gzip                             x86_64 1.13-1.fc40                 fedora     385.0 KiB
 info                             x86_64 7.1-2.fc40                  fedora     357.8 KiB
 patch                            x86_64 2.7.6-24.fc40               fedora     262.8 KiB
 redhat-rpm-config                noarch 288-1.fc40                  updates    185.2 KiB
 rpm-build                        x86_64 4.19.1.1-1.fc40             fedora     173.7 KiB
 sed                              x86_64 4.9-1.fc40                  fedora     861.5 KiB
 shadow-utils                     x86_64 2:4.15.1-4.fc40             updates      4.1 MiB
 tar                              x86_64 2:1.35-3.fc40               fedora       2.9 MiB
 unzip                            x86_64 6.0-63.fc40                 fedora     382.8 KiB
 util-linux                       x86_64 2.40.2-1.fc40               updates      3.7 MiB
 which                            x86_64 2.21-41.fc40                fedora      80.2 KiB
 xz                               x86_64 1:5.4.6-3.fc40              fedora       2.0 MiB
Installing dependencies:                                                                 
 alternatives                     x86_64 1.27-1.fc40                 updates     66.3 KiB
 ansible-srpm-macros              noarch 1-16.fc40                   updates     35.7 KiB
 audit-libs                       x86_64 4.0.3-1.fc40                updates    347.4 KiB
 authselect                       x86_64 1.5.0-6.fc40                updates    153.6 KiB
 authselect-libs                  x86_64 1.5.0-6.fc40                updates    818.2 KiB
 basesystem                       noarch 11-20.fc40                  fedora       0.0   B
 binutils                         x86_64 2.41-38.fc40                updates     26.4 MiB
 binutils-gold                    x86_64 2.41-38.fc40                updates      2.0 MiB
 bzip2-libs                       x86_64 1.0.8-18.fc40               fedora      80.7 KiB
 ca-certificates                  noarch 2024.2.69_v8.0.401-1.0.fc40 updates      2.4 MiB
 coreutils-common                 x86_64 9.4-9.fc40                  updates     11.4 MiB
 cracklib                         x86_64 2.9.11-5.fc40               fedora     238.9 KiB
 crypto-policies                  noarch 20241011-1.git5930b9a.fc40  updates    158.0 KiB
 curl                             x86_64 8.6.0-10.fc40               updates    738.6 KiB
 cyrus-sasl-lib                   x86_64 2.1.28-19.fc40              fedora       2.3 MiB
 debugedit                        x86_64 5.0-18.fc40                 updates    199.3 KiB
 dwz                              x86_64 0.15-8.fc40                 updates    294.9 KiB
 ed                               x86_64 1.20.2-1.fc40               updates    146.9 KiB
 efi-srpm-macros                  noarch 5-11.fc40                   fedora      40.1 KiB
 elfutils                         x86_64 0.192-7.fc40                updates      2.7 MiB
 elfutils-debuginfod-client       x86_64 0.192-7.fc40                updates     80.2 KiB
 elfutils-default-yama-scope      noarch 0.192-7.fc40                updates      1.8 KiB
 elfutils-libelf                  x86_64 0.192-7.fc40                updates      1.2 MiB
 elfutils-libs                    x86_64 0.192-7.fc40                updates    670.3 KiB
 fedora-gpg-keys                  noarch 40-2                        updates    124.7 KiB
 fedora-release                   noarch 40-40                       updates      0.0   B
 fedora-release-identity-basic    noarch 40-40                       updates    654.0   B
 fedora-repos                     noarch 40-2                        updates      4.9 KiB
 file                             x86_64 5.45-4.fc40                 fedora     103.5 KiB
 file-libs                        x86_64 5.45-4.fc40                 fedora       9.9 MiB
 filesystem                       x86_64 3.18-8.fc40                 fedora     106.0   B
 fonts-srpm-macros                noarch 1:2.0.5-14.fc40             fedora      55.3 KiB
 forge-srpm-macros                noarch 0.4.0-1.fc40                updates     38.9 KiB
 fpc-srpm-macros                  noarch 1.3-12.fc40                 fedora     144.0   B
 gdb-minimal                      x86_64 15.2-4.fc40                 updates     13.0 MiB
 gdbm                             x86_64 1:1.23-6.fc40               fedora     460.9 KiB
 gdbm-libs                        x86_64 1:1.23-6.fc40               fedora     121.9 KiB
 ghc-srpm-macros                  noarch 1.9.1-1.fc40                updates    747.0   B
 glibc                            x86_64 2.39-37.fc40                updates      6.6 MiB
 glibc-common                     x86_64 2.39-37.fc40                updates      1.0 MiB
 glibc-gconv-extra                x86_64 2.39-37.fc40                updates      7.8 MiB
 gmp                              x86_64 1:6.2.1-8.fc40              fedora     794.6 KiB
 gnat-srpm-macros                 noarch 6-5.fc40                    fedora       1.0 KiB
 go-srpm-macros                   noarch 3.5.0-1.fc40                fedora      60.6 KiB
 jansson                          x86_64 2.13.1-9.fc40               fedora      88.3 KiB
 json-c                           x86_64 0.17-3.fc40                 fedora      82.4 KiB
 kernel-srpm-macros               noarch 1.0-23.fc40                 fedora       1.9 KiB
 keyutils-libs                    x86_64 1.6.3-3.fc40                fedora      54.4 KiB
 krb5-libs                        x86_64 1.21.3-2.fc40               updates      2.3 MiB
 libacl                           x86_64 2.3.2-1.fc40                fedora      40.0 KiB
 libarchive                       x86_64 3.7.2-7.fc40                updates    922.6 KiB
 libattr                          x86_64 2.5.2-3.fc40                fedora      28.5 KiB
 libblkid                         x86_64 2.40.2-1.fc40               updates    258.6 KiB
 libbrotli                        x86_64 1.1.0-3.fc40                fedora     829.5 KiB
 libcap                           x86_64 2.69-8.fc40                 updates    219.8 KiB
 libcap-ng                        x86_64 0.8.4-4.fc40                fedora      73.1 KiB
 libcom_err                       x86_64 1.47.0-5.fc40               fedora      67.2 KiB
 libcurl                          x86_64 8.6.0-10.fc40               updates    776.8 KiB
 libeconf                         x86_64 0.6.2-2.fc40                updates     58.0 KiB
 libevent                         x86_64 2.1.12-12.fc40              fedora     895.6 KiB
 libfdisk                         x86_64 2.40.2-1.fc40               updates    362.9 KiB
 libffi                           x86_64 3.4.4-7.fc40                fedora      81.6 KiB
 libgcc                           x86_64 14.2.1-3.fc40               updates    274.6 KiB
 libgomp                          x86_64 14.2.1-3.fc40               updates    523.6 KiB
 libidn2                          x86_64 2.3.7-1.fc40                fedora     329.1 KiB
 libmount                         x86_64 2.40.2-1.fc40               updates    355.8 KiB
 libnghttp2                       x86_64 1.59.0-3.fc40               updates    166.1 KiB
 libnsl2                          x86_64 2.0.1-1.fc40                fedora      57.9 KiB
 libpkgconf                       x86_64 2.1.1-2.fc40                updates     74.2 KiB
 libpsl                           x86_64 0.21.5-3.fc40               fedora      80.5 KiB
 libpwquality                     x86_64 1.4.5-9.fc40                fedora     417.8 KiB
 libselinux                       x86_64 3.7-5.fc40                  updates    177.0 KiB
 libsemanage                      x86_64 3.7-2.fc40                  updates    293.5 KiB
 libsepol                         x86_64 3.7-2.fc40                  updates    817.9 KiB
 libsmartcols                     x86_64 2.40.2-1.fc40               updates    180.4 KiB
 libssh                           x86_64 0.10.6-5.fc40               fedora     509.3 KiB
 libssh-config                    noarch 0.10.6-5.fc40               fedora     277.0   B
 libstdc++                        x86_64 14.2.1-3.fc40               updates      2.8 MiB
 libtasn1                         x86_64 4.19.0-6.fc40               fedora     175.7 KiB
 libtirpc                         x86_64 1.3.6-1.rc3.fc40            updates    202.7 KiB
 libtool-ltdl                     x86_64 2.4.7-10.fc40               fedora      66.2 KiB
 libunistring                     x86_64 1.1-7.fc40                  fedora       1.7 MiB
 libutempter                      x86_64 1.2.1-13.fc40               fedora      57.7 KiB
 libuuid                          x86_64 2.40.2-1.fc40               updates     37.5 KiB
 libverto                         x86_64 0.3.2-8.fc40                fedora      29.5 KiB
 libxcrypt                        x86_64 4.4.38-3.fc40               updates    268.0 KiB
 libxml2                          x86_64 2.12.9-1.fc40               updates      1.7 MiB
 libzstd                          x86_64 1.5.6-1.fc40                updates    787.9 KiB
 lua-libs                         x86_64 5.4.6-5.fc40                fedora     281.1 KiB
 lua-srpm-macros                  noarch 1-13.fc40                   fedora       1.3 KiB
 lz4-libs                         x86_64 1.9.4-6.fc40                fedora     129.4 KiB
 mpfr                             x86_64 4.2.1-4.fc40                updates    832.0 KiB
 ncurses-base                     noarch 6.4-12.20240127.fc40        fedora     326.2 KiB
 ncurses-libs                     x86_64 6.4-12.20240127.fc40        fedora     963.2 KiB
 ocaml-srpm-macros                noarch 9-3.fc40                    fedora       1.9 KiB
 openblas-srpm-macros             noarch 2-16.fc40                   fedora     104.0   B
 openldap                         x86_64 2.6.8-1.fc40                updates    640.3 KiB
 openssl-libs                     x86_64 1:3.2.2-3.fc40              updates      7.8 MiB
 p11-kit                          x86_64 0.25.5-1.fc40               updates      2.2 MiB
 p11-kit-trust                    x86_64 0.25.5-1.fc40               updates    391.4 KiB
 package-notes-srpm-macros        noarch 0.5-11.fc40                 fedora       1.6 KiB
 pam                              x86_64 1.6.1-5.fc40                updates      1.8 MiB
 pam-libs                         x86_64 1.6.1-5.fc40                updates    135.0 KiB
 pcre2                            x86_64 10.44-1.fc40                updates    653.5 KiB
 pcre2-syntax                     noarch 10.44-1.fc40                updates    251.6 KiB
 perl-srpm-macros                 noarch 1-53.fc40                   fedora     861.0   B
 pkgconf                          x86_64 2.1.1-2.fc40                updates     82.9 KiB
 pkgconf-m4                       noarch 2.1.1-2.fc40                updates     13.9 KiB
 pkgconf-pkg-config               x86_64 2.1.1-2.fc40                updates    989.0   B
 popt                             x86_64 1.19-6.fc40                 fedora     136.9 KiB
 publicsuffix-list-dafsa          noarch 20250116-1.fc40             updates     68.5 KiB
 pyproject-srpm-macros            noarch 1.16.4-1.fc40               updates      1.9 KiB
 python-srpm-macros               noarch 3.12-8.fc40                 updates     50.6 KiB
 qt5-srpm-macros                  noarch 5.15.15-1.fc40              updates    500.0   B
 qt6-srpm-macros                  noarch 6.8.1-4.fc40                updates    456.0   B
 readline                         x86_64 8.2-8.fc40                  fedora     489.2 KiB
 rpm                              x86_64 4.19.1.1-1.fc40             fedora       3.0 MiB
 rpm-build-libs                   x86_64 4.19.1.1-1.fc40             fedora     198.4 KiB
 rpm-libs                         x86_64 4.19.1.1-1.fc40             fedora     709.9 KiB
 rpm-sequoia                      x86_64 1.7.0-3.fc40                updates      2.4 MiB
 rust-srpm-macros                 noarch 26.3-1.fc40                 updates      4.8 KiB
 setup                            noarch 2.14.5-2.fc40               fedora     720.4 KiB
 sqlite-libs                      x86_64 3.45.1-2.fc40               fedora       1.4 MiB
 systemd-libs                     x86_64 255.16-1.fc40               updates      1.9 MiB
 util-linux-core                  x86_64 2.40.2-1.fc40               updates      1.5 MiB
 xxhash-libs                      x86_64 0.8.3-1.fc40                updates     90.2 KiB
 xz-libs                          x86_64 1:5.4.6-3.fc40              fedora     209.8 KiB
 zig-srpm-macros                  noarch 1-2.fc40                    fedora       1.1 KiB
 zip                              x86_64 3.0-40.fc40                 fedora     703.2 KiB
 zlib-ng-compat                   x86_64 2.1.7-2.fc40                updates    134.0 KiB
 zstd                             x86_64 1.5.6-1.fc40                updates      1.7 MiB
Installing groups:                                                                       
 Buildsystem building group                                                              

Transaction Summary:
 Installing:      153 packages

Total size of inbound packages is 53 MiB. Need to download 53 MiB.
After this operation 179 MiB will be used (install 179 MiB, remove 0 B).
[  1/153] bzip2-0:1.0.8-18.fc40.x86_64  100% | 257.9 KiB/s |  52.4 KiB |  00m00s
[  2/153] cpio-0:2.15-1.fc40.x86_64     100% | 974.1 KiB/s | 292.2 KiB |  00m00s
[  3/153] diffutils-0:3.10-5.fc40.x86_6 100% |   2.5 MiB/s | 405.6 KiB |  00m00s
[  4/153] grep-0:3.11-7.fc40.x86_64     100% |   3.5 MiB/s | 300.2 KiB |  00m00s
[  5/153] gzip-0:1.13-1.fc40.x86_64     100% |   4.2 MiB/s | 170.6 KiB |  00m00s
[  6/153] info-0:7.1-2.fc40.x86_64      100% |   4.5 MiB/s | 182.3 KiB |  00m00s
[  7/153] rpm-build-0:4.19.1.1-1.fc40.x 100% |   2.0 MiB/s |  78.2 KiB |  00m00s
[  8/153] patch-0:2.7.6-24.fc40.x86_64  100% |   1.9 MiB/s | 130.7 KiB |  00m00s
[  9/153] sed-0:4.9-1.fc40.x86_64       100% |   4.4 MiB/s | 318.2 KiB |  00m00s
[ 10/153] unzip-0:6.0-63.fc40.x86_64    100% |   4.5 MiB/s | 184.5 KiB |  00m00s
[ 11/153] bash-0:5.2.26-3.fc40.x86_64   100% |   3.1 MiB/s |   1.8 MiB |  00m01s
[ 12/153] tar-2:1.35-3.fc40.x86_64      100% |   5.1 MiB/s | 856.6 KiB |  00m00s
[ 13/153] which-0:2.21-41.fc40.x86_64   100% | 714.6 KiB/s |  41.4 KiB |  00m00s
[ 14/153] fedora-release-common-0:40-40 100% | 351.8 KiB/s |  21.5 KiB |  00m00s
[ 15/153] xz-1:5.4.6-3.fc40.x86_64      100% |   3.9 MiB/s | 557.4 KiB |  00m00s
[ 16/153] findutils-1:4.9.0-9.fc40.x86_ 100% |   1.8 MiB/s | 491.4 KiB |  00m00s
[ 17/153] coreutils-0:9.4-9.fc40.x86_64 100% |   3.4 MiB/s |   1.1 MiB |  00m00s
[ 18/153] glibc-minimal-langpack-0:2.39 100% |   4.3 MiB/s |  84.1 KiB |  00m00s
[ 19/153] gawk-0:5.3.0-3.fc40.x86_64    100% |   3.9 MiB/s |   1.1 MiB |  00m00s
[ 20/153] redhat-rpm-config-0:288-1.fc4 100% |   2.3 MiB/s |  82.1 KiB |  00m00s
[ 21/153] shadow-utils-2:4.15.1-4.fc40. 100% |  13.8 MiB/s |   1.3 MiB |  00m00s
[ 22/153] ncurses-libs-0:6.4-12.2024012 100% |   3.1 MiB/s | 332.5 KiB |  00m00s
[ 23/153] filesystem-0:3.18-8.fc40.x86_ 100% |   3.6 MiB/s |   1.1 MiB |  00m00s
[ 24/153] bzip2-libs-0:1.0.8-18.fc40.x8 100% | 346.3 KiB/s |  40.9 KiB |  00m00s
[ 25/153] util-linux-0:2.40.2-1.fc40.x8 100% |   3.2 MiB/s |   1.2 MiB |  00m00s
[ 26/153] file-0:5.45-4.fc40.x86_64     100% | 670.8 KiB/s |  49.0 KiB |  00m00s
[ 27/153] libattr-0:2.5.2-3.fc40.x86_64 100% | 233.7 KiB/s |  18.0 KiB |  00m00s
[ 28/153] popt-0:1.19-6.fc40.x86_64     100% | 901.2 KiB/s |  66.7 KiB |  00m00s
[ 29/153] readline-0:8.2-8.fc40.x86_64  100% |   1.9 MiB/s | 213.3 KiB |  00m00s
[ 30/153] rpm-build-libs-0:4.19.1.1-1.f 100% |   2.3 MiB/s |  95.0 KiB |  00m00s
[ 31/153] rpm-0:4.19.1.1-1.fc40.x86_64  100% |   3.6 MiB/s | 540.1 KiB |  00m00s
[ 32/153] libacl-0:2.3.2-1.fc40.x86_64  100% | 626.4 KiB/s |  24.4 KiB |  00m00s
[ 33/153] xz-libs-1:5.4.6-3.fc40.x86_64 100% |   2.0 MiB/s | 110.0 KiB |  00m00s
[ 34/153] rpm-libs-0:4.19.1.1-1.fc40.x8 100% |   2.9 MiB/s | 308.9 KiB |  00m00s
[ 35/153] gmp-1:6.2.1-8.fc40.x86_64     100% |   5.1 MiB/s | 312.5 KiB |  00m00s
[ 36/153] efi-srpm-macros-0:5-11.fc40.n 100% | 301.3 KiB/s |  22.3 KiB |  00m00s
[ 37/153] glibc-common-0:2.39-37.fc40.x 100% |   2.6 MiB/s | 368.8 KiB |  00m00s
[ 38/153] coreutils-common-0:9.4-9.fc40 100% |   9.5 MiB/s |   2.1 MiB |  00m00s
[ 39/153] fonts-srpm-macros-1:2.0.5-14. 100% | 247.9 KiB/s |  26.5 KiB |  00m00s
[ 40/153] fpc-srpm-macros-0:1.3-12.fc40 100% |  79.1 KiB/s |   7.8 KiB |  00m00s
[ 41/153] gnat-srpm-macros-0:6-5.fc40.n 100% | 116.1 KiB/s |   8.8 KiB |  00m00s
[ 42/153] go-srpm-macros-0:3.5.0-1.fc40 100% | 411.2 KiB/s |  27.5 KiB |  00m00s
[ 43/153] kernel-srpm-macros-0:1.0-23.f 100% | 128.0 KiB/s |   9.7 KiB |  00m00s
[ 44/153] openblas-srpm-macros-0:2-16.f 100% | 192.3 KiB/s |   7.5 KiB |  00m00s
[ 45/153] ocaml-srpm-macros-0:9-3.fc40. 100% | 126.0 KiB/s |   9.1 KiB |  00m00s
[ 46/153] package-notes-srpm-macros-0:0 100% | 165.7 KiB/s |   9.9 KiB |  00m00s
[ 47/153] zig-srpm-macros-0:1-2.fc40.no 100% | 206.1 KiB/s |   8.0 KiB |  00m00s
[ 48/153] perl-srpm-macros-0:1-53.fc40. 100% |  64.0 KiB/s |   8.4 KiB |  00m00s
[ 49/153] lua-srpm-macros-0:1-13.fc40.n 100% |  32.0 KiB/s |   8.7 KiB |  00m00s
[ 50/153] zip-0:3.0-40.fc40.x86_64      100% |   3.3 MiB/s | 264.8 KiB |  00m00s
[ 51/153] setup-0:2.14.5-2.fc40.noarch  100% |   4.0 MiB/s | 154.7 KiB |  00m00s
[ 52/153] libcap-ng-0:0.8.4-4.fc40.x86_ 100% | 837.0 KiB/s |  32.6 KiB |  00m00s
[ 53/153] util-linux-core-0:2.40.2-1.fc 100% |   7.0 MiB/s | 536.6 KiB |  00m00s
[ 54/153] libutempter-0:1.2.1-13.fc40.x 100% | 432.9 KiB/s |  26.4 KiB |  00m00s
[ 55/153] ncurses-base-0:6.4-12.2024012 100% |   1.0 MiB/s |  88.8 KiB |  00m00s
[ 56/153] lua-libs-0:5.4.6-5.fc40.x86_6 100% |   2.3 MiB/s | 131.9 KiB |  00m00s
[ 57/153] file-libs-0:5.45-4.fc40.x86_6 100% |   6.3 MiB/s | 762.7 KiB |  00m00s
[ 58/153] sqlite-libs-0:3.45.1-2.fc40.x 100% |   8.8 MiB/s | 705.1 KiB |  00m00s
[ 59/153] basesystem-0:11-20.fc40.noarc 100% |  94.6 KiB/s |   7.2 KiB |  00m00s
[ 60/153] glibc-0:2.39-37.fc40.x86_64   100% |  10.9 MiB/s |   2.2 MiB |  00m00s
[ 61/153] libselinux-0:3.7-5.fc40.x86_6 100% |   1.3 MiB/s |  88.0 KiB |  00m00s
[ 62/153] libsepol-0:3.7-2.fc40.x86_64  100% |   8.2 MiB/s | 342.2 KiB |  00m00s
[ 63/153] zlib-ng-compat-0:2.1.7-2.fc40 100% |   3.2 MiB/s |  77.7 KiB |  00m00s
[ 64/153] libcap-0:2.69-8.fc40.x86_64   100% |   3.2 MiB/s |  85.7 KiB |  00m00s
[ 65/153] libzstd-0:1.5.6-1.fc40.x86_64 100% |   3.6 MiB/s | 309.2 KiB |  00m00s
[ 66/153] rpm-sequoia-0:1.7.0-3.fc40.x8 100% |  11.3 MiB/s | 902.0 KiB |  00m00s
[ 67/153] glibc-gconv-extra-0:2.39-37.f 100% |   5.1 MiB/s |   1.7 MiB |  00m00s
[ 68/153] elfutils-libs-0:0.192-7.fc40. 100% |  11.7 MiB/s | 263.6 KiB |  00m00s
[ 69/153] elfutils-libelf-0:0.192-7.fc4 100% |   3.8 MiB/s | 208.5 KiB |  00m00s
[ 70/153] elfutils-debuginfod-client-0: 100% |   2.1 MiB/s |  46.5 KiB |  00m00s
[ 71/153] libgcc-0:14.2.1-3.fc40.x86_64 100% |   4.8 MiB/s | 133.3 KiB |  00m00s
[ 72/153] json-c-0:0.17-3.fc40.x86_64   100% | 800.4 KiB/s |  44.0 KiB |  00m00s
[ 73/153] libgomp-0:14.2.1-3.fc40.x86_6 100% |   8.0 MiB/s | 353.9 KiB |  00m00s
[ 74/153] elfutils-0:0.192-7.fc40.x86_6 100% |   4.6 MiB/s | 546.4 KiB |  00m00s
[ 75/153] debugedit-0:5.0-18.fc40.x86_6 100% |   4.1 MiB/s |  80.0 KiB |  00m00s
[ 76/153] jansson-0:2.13.1-9.fc40.x86_6 100% | 748.8 KiB/s |  44.2 KiB |  00m00s
[ 77/153] pkgconf-pkg-config-0:2.1.1-2. 100% | 547.0 KiB/s |   9.8 KiB |  00m00s
[ 78/153] pkgconf-0:2.1.1-2.fc40.x86_64 100% |   1.7 MiB/s |  43.7 KiB |  00m00s
[ 79/153] pkgconf-m4-0:2.1.1-2.fc40.noa 100% | 390.0 KiB/s |  14.0 KiB |  00m00s
[ 80/153] libpkgconf-0:2.1.1-2.fc40.x86 100% |   1.5 MiB/s |  37.9 KiB |  00m00s
[ 81/153] zstd-0:1.5.6-1.fc40.x86_64    100% |   8.1 MiB/s | 479.4 KiB |  00m00s
[ 82/153] lz4-libs-0:1.9.4-6.fc40.x86_6 100% |   1.1 MiB/s |  67.2 KiB |  00m00s
[ 83/153] curl-0:8.6.0-10.fc40.x86_64   100% |  13.3 MiB/s | 299.2 KiB |  00m00s
[ 84/153] ed-0:1.20.2-1.fc40.x86_64     100% |   3.0 MiB/s |  81.9 KiB |  00m00s
[ 85/153] pcre2-0:10.44-1.fc40.x86_64   100% |   7.7 MiB/s | 242.9 KiB |  00m00s
[ 86/153] libarchive-0:3.7.2-7.fc40.x86 100% |   5.9 MiB/s | 408.5 KiB |  00m00s
[ 87/153] forge-srpm-macros-0:0.4.0-1.f 100% | 790.5 KiB/s |  19.8 KiB |  00m00s
[ 88/153] pcre2-syntax-0:10.44-1.fc40.n 100% |   5.2 MiB/s | 149.8 KiB |  00m00s
[ 89/153] mpfr-0:4.2.1-4.fc40.x86_64    100% |   7.0 MiB/s | 348.9 KiB |  00m00s
[ 90/153] libstdc++-0:14.2.1-3.fc40.x86 100% |  12.4 MiB/s | 886.5 KiB |  00m00s
[ 91/153] libblkid-0:2.40.2-1.fc40.x86_ 100% |   4.8 MiB/s | 124.1 KiB |  00m00s
[ 92/153] libmount-0:2.40.2-1.fc40.x86_ 100% |   6.9 MiB/s | 155.2 KiB |  00m00s
[ 93/153] libuuid-0:2.40.2-1.fc40.x86_6 100% |   1.0 MiB/s |  28.6 KiB |  00m00s
[ 94/153] libsmartcols-0:2.40.2-1.fc40. 100% |   1.5 MiB/s |  83.2 KiB |  00m00s
[ 95/153] libxcrypt-0:4.4.38-3.fc40.x86 100% |   2.1 MiB/s | 119.3 KiB |  00m00s
[ 96/153] audit-libs-0:4.0.3-1.fc40.x86 100% |   4.7 MiB/s | 128.9 KiB |  00m00s
[ 97/153] systemd-libs-0:255.16-1.fc40. 100% |  10.6 MiB/s | 706.9 KiB |  00m00s
[ 98/153] authselect-libs-0:1.5.0-6.fc4 100% |   5.6 MiB/s | 217.9 KiB |  00m00s
[ 99/153] libfdisk-0:2.40.2-1.fc40.x86_ 100% |   7.8 MiB/s | 159.3 KiB |  00m00s
[100/153] authselect-0:1.5.0-6.fc40.x86 100% |   7.1 MiB/s | 145.5 KiB |  00m00s
[101/153] pam-libs-0:1.6.1-5.fc40.x86_6 100% |   2.9 MiB/s |  57.2 KiB |  00m00s
[102/153] pam-0:1.6.1-5.fc40.x86_64     100% |   8.7 MiB/s | 554.4 KiB |  00m00s
[103/153] gdbm-libs-1:1.23-6.fc40.x86_6 100% | 905.9 KiB/s |  56.2 KiB |  00m00s
[104/153] libnsl2-0:2.0.1-1.fc40.x86_64 100% | 298.7 KiB/s |  29.6 KiB |  00m00s
[105/153] binutils-0:2.41-38.fc40.x86_6 100% |   8.9 MiB/s |   6.2 MiB |  00m01s
[106/153] libpwquality-0:1.4.5-9.fc40.x 100% |   1.6 MiB/s | 119.7 KiB |  00m00s
[107/153] libeconf-0:0.6.2-2.fc40.x86_6 100% |   1.7 MiB/s |  32.0 KiB |  00m00s
[108/153] libsemanage-0:3.7-2.fc40.x86_ 100% |   6.0 MiB/s | 116.1 KiB |  00m00s
[109/153] ansible-srpm-macros-0:1-16.fc 100% |   1.1 MiB/s |  20.7 KiB |  00m00s
[110/153] cracklib-0:2.9.11-5.fc40.x86_ 100% |   1.2 MiB/s |  92.5 KiB |  00m00s
[111/153] dwz-0:0.15-8.fc40.x86_64      100% |   4.2 MiB/s | 138.7 KiB |  00m00s
[112/153] ghc-srpm-macros-0:1.9.1-1.fc4 100% | 330.6 KiB/s |   8.9 KiB |  00m00s
[113/153] python-srpm-macros-0:3.12-8.f 100% |   1.2 MiB/s |  23.4 KiB |  00m00s
[114/153] pyproject-srpm-macros-0:1.16. 100% | 698.4 KiB/s |  14.0 KiB |  00m00s
[115/153] qt5-srpm-macros-0:5.15.15-1.f 100% | 423.9 KiB/s |   8.9 KiB |  00m00s
[116/153] qt6-srpm-macros-0:6.8.1-4.fc4 100% | 343.4 KiB/s |   9.3 KiB |  00m00s
[117/153] libtirpc-0:1.3.6-1.rc3.fc40.x 100% |   4.8 MiB/s |  94.2 KiB |  00m00s
[118/153] rust-srpm-macros-0:26.3-1.fc4 100% | 431.4 KiB/s |  12.5 KiB |  00m00s
[119/153] libcom_err-0:1.47.0-5.fc40.x8 100% | 461.0 KiB/s |  25.4 KiB |  00m00s
[120/153] openssl-libs-1:3.2.2-3.fc40.x 100% |  11.8 MiB/s |   2.3 MiB |  00m00s
[121/153] crypto-policies-0:20241011-1. 100% |   5.1 MiB/s |  98.9 KiB |  00m00s
[122/153] gdbm-1:1.23-6.fc40.x86_64     100% |   1.5 MiB/s | 152.5 KiB |  00m00s
[123/153] krb5-libs-0:1.21.3-2.fc40.x86 100% |   9.0 MiB/s | 759.5 KiB |  00m00s
[124/153] keyutils-libs-0:1.6.3-3.fc40. 100% | 515.9 KiB/s |  31.5 KiB |  00m00s
[125/153] ca-certificates-0:2024.2.69_v 100% |   7.5 MiB/s | 871.2 KiB |  00m00s
[126/153] fedora-repos-0:40-2.noarch    100% | 296.4 KiB/s |   9.5 KiB |  00m00s
[127/153] libverto-0:0.3.2-8.fc40.x86_6 100% | 555.1 KiB/s |  20.5 KiB |  00m00s
[128/153] fedora-gpg-keys-0:40-2.noarch 100% |   6.4 MiB/s | 132.1 KiB |  00m00s
[129/153] elfutils-default-yama-scope-0 100% | 430.0 KiB/s |  12.5 KiB |  00m00s
[130/153] libxml2-0:2.12.9-1.fc40.x86_6 100% |   9.6 MiB/s | 688.0 KiB |  00m00s
[131/153] p11-kit-0:0.25.5-1.fc40.x86_6 100% |   7.4 MiB/s | 491.2 KiB |  00m00s
[132/153] libffi-0:3.4.4-7.fc40.x86_64  100% | 729.0 KiB/s |  39.4 KiB |  00m00s
[133/153] libtasn1-0:4.19.0-6.fc40.x86_ 100% |   1.3 MiB/s |  73.7 KiB |  00m00s
[134/153] alternatives-0:1.27-1.fc40.x8 100% |   2.2 MiB/s |  40.7 KiB |  00m00s
[135/153] p11-kit-trust-0:0.25.5-1.fc40 100% |   6.1 MiB/s | 132.0 KiB |  00m00s
[136/153] fedora-release-0:40-40.noarch 100% | 608.3 KiB/s |  11.0 KiB |  00m00s
[137/153] xxhash-libs-0:0.8.3-1.fc40.x8 100% |   1.2 MiB/s |  37.8 KiB |  00m00s
[138/153] fedora-release-identity-basic 100% | 510.2 KiB/s |  11.7 KiB |  00m00s
[139/153] binutils-gold-0:2.41-38.fc40. 100% |   8.5 MiB/s | 782.0 KiB |  00m00s
[140/153] libcurl-0:8.6.0-10.fc40.x86_6 100% |   6.7 MiB/s | 344.8 KiB |  00m00s
[141/153] libbrotli-0:1.1.0-3.fc40.x86_ 100% |   3.0 MiB/s | 338.4 KiB |  00m00s
[142/153] libidn2-0:2.3.7-1.fc40.x86_64 100% |   1.9 MiB/s | 118.7 KiB |  00m00s
[143/153] libpsl-0:0.21.5-3.fc40.x86_64 100% |   1.4 MiB/s |  63.9 KiB |  00m00s
[144/153] libssh-0:0.10.6-5.fc40.x86_64 100% |   4.6 MiB/s | 210.6 KiB |  00m00s
[145/153] libssh-config-0:0.10.6-5.fc40 100% | 153.0 KiB/s |   9.0 KiB |  00m00s
[146/153] publicsuffix-list-dafsa-0:202 100% |   1.1 MiB/s |  58.8 KiB |  00m00s
[147/153] libunistring-0:1.1-7.fc40.x86 100% |   4.7 MiB/s | 545.5 KiB |  00m00s
[148/153] gdb-minimal-0:15.2-4.fc40.x86 100% |  11.8 MiB/s |   4.3 MiB |  00m00s
[149/153] libnghttp2-0:1.59.0-3.fc40.x8 100% |   3.3 MiB/s |  75.3 KiB |  00m00s
[150/153] openldap-0:2.6.8-1.fc40.x86_6 100% |   6.2 MiB/s | 255.3 KiB |  00m00s
[151/153] libevent-0:2.1.12-12.fc40.x86 100% |   4.1 MiB/s | 257.2 KiB |  00m00s
[152/153] libtool-ltdl-0:2.4.7-10.fc40. 100% | 372.8 KiB/s |  36.2 KiB |  00m00s
[153/153] cyrus-sasl-lib-0:2.1.28-19.fc 100% |   5.5 MiB/s | 789.3 KiB |  00m00s
--------------------------------------------------------------------------------
[153/153] Total                         100% |  11.9 MiB/s |  52.8 MiB |  00m04s
Running transaction
Importing PGP key 0xA15B79CC:
 Userid     : "Fedora (40) <fedora-40-primary@fedoraproject.org>"
 Fingerprint: 115DF9AEF857853EE8445D0A0727707EA15B79CC
 From       : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-40-primary
The key was successfully imported.
[  1/155] Verify package files          100% | 593.0   B/s | 153.0   B |  00m00s
>>> Running pre-transaction scriptlet: filesystem-0:3.18-8.fc40.x86_64
>>> Stop pre-transaction scriptlet: filesystem-0:3.18-8.fc40.x86_64
[  2/155] Prepare transaction           100% |   1.2 KiB/s | 153.0   B |  00m00s
[  3/155] Installing libgcc-0:14.2.1-3. 100% |  67.5 MiB/s | 276.3 KiB |  00m00s
>>> Running post-install scriptlet: libgcc-0:14.2.1-3.fc40.x86_64
>>> Stop post-install scriptlet: libgcc-0:14.2.1-3.fc40.x86_64
[  4/155] Installing crypto-policies-0: 100% |   9.8 MiB/s | 190.6 KiB |  00m00s
>>> Running post-install scriptlet: crypto-policies-0:20241011-1.git5930b9a.fc40
>>> Stop post-install scriptlet: crypto-policies-0:20241011-1.git5930b9a.fc40.no
[  5/155] Installing fedora-release-ide 100% | 890.6 KiB/s | 912.0   B |  00m00s
[  6/155] Installing fedora-gpg-keys-0: 100% |   5.2 MiB/s | 169.7 KiB |  00m00s
[  7/155] Installing fedora-repos-0:40- 100% |   5.6 MiB/s |   5.7 KiB |  00m00s
[  8/155] Installing fedora-release-com 100% |   7.6 MiB/s |  23.4 KiB |  00m00s
[  9/155] Installing fedora-release-0:4 100% |   0.0   B/s | 124.0   B |  00m00s
[ 10/155] Installing setup-0:2.14.5-2.f 100% |  32.2 MiB/s | 725.8 KiB |  00m00s
>>> Running post-install scriptlet: setup-0:2.14.5-2.fc40.noarch
>>> Stop post-install scriptlet: setup-0:2.14.5-2.fc40.noarch
[ 11/155] Installing filesystem-0:3.18- 100% |   1.1 MiB/s | 212.4 KiB |  00m00s
[ 12/155] Installing basesystem-0:11-20 100% |   0.0   B/s | 124.0   B |  00m00s
[ 13/155] Installing publicsuffix-list- 100% |  67.6 MiB/s |  69.2 KiB |  00m00s
[ 14/155] Installing libssh-config-0:0. 100% | 796.9 KiB/s | 816.0   B |  00m00s
[ 15/155] Installing rust-srpm-macros-0 100% |   1.4 MiB/s |   5.6 KiB |  00m00s
[ 16/155] Installing qt6-srpm-macros-0: 100% | 714.8 KiB/s | 732.0   B |  00m00s
[ 17/155] Installing qt5-srpm-macros-0: 100% | 757.8 KiB/s | 776.0   B |  00m00s
[ 18/155] Installing ghc-srpm-macros-0: 100% |   1.0 MiB/s |   1.0 KiB |  00m00s
[ 19/155] Installing ansible-srpm-macro 100% |  35.4 MiB/s |  36.2 KiB |  00m00s
[ 20/155] Installing pcre2-syntax-0:10. 100% |  82.7 MiB/s | 254.1 KiB |  00m00s
[ 21/155] Installing pkgconf-m4-0:2.1.1 100% |  14.0 MiB/s |  14.3 KiB |  00m00s
[ 22/155] Installing ncurses-base-0:6.4 100% |  22.9 MiB/s | 351.6 KiB |  00m00s
[ 23/155] Installing glibc-minimal-lang 100% | 121.1 KiB/s | 124.0   B |  00m00s
[ 24/155] Installing ncurses-libs-0:6.4 100% |  67.6 MiB/s | 969.7 KiB |  00m00s
>>> Running pre-install scriptlet: glibc-0:2.39-37.fc40.x86_64
>>> Stop pre-install scriptlet: glibc-0:2.39-37.fc40.x86_64
[ 25/155] Installing glibc-0:2.39-37.fc 100% |  64.6 MiB/s |   6.6 MiB |  00m00s
>>> Running post-install scriptlet: glibc-0:2.39-37.fc40.x86_64
>>> Stop post-install scriptlet: glibc-0:2.39-37.fc40.x86_64
[ 26/155] Installing bash-0:5.2.26-3.fc 100% |  19.6 MiB/s |   8.2 MiB |  00m00s
>>> Running post-install scriptlet: bash-0:5.2.26-3.fc40.x86_64
>>> Stop post-install scriptlet: bash-0:5.2.26-3.fc40.x86_64
[ 27/155] Installing glibc-common-0:2.3 100% |  94.2 MiB/s |   1.0 MiB |  00m00s
[ 28/155] Installing glibc-gconv-extra- 100% |  81.5 MiB/s |   7.9 MiB |  00m00s
>>> Running post-install scriptlet: glibc-gconv-extra-0:2.39-37.fc40.x86_64
>>> Stop post-install scriptlet: glibc-gconv-extra-0:2.39-37.fc40.x86_64
[ 29/155] Installing zlib-ng-compat-0:2 100% |  65.8 MiB/s | 134.8 KiB |  00m00s
[ 30/155] Installing xz-libs-1:5.4.6-3. 100% | 103.0 MiB/s | 210.9 KiB |  00m00s
[ 31/155] Installing bzip2-libs-0:1.0.8 100% |  79.9 MiB/s |  81.8 KiB |  00m00s
[ 32/155] Installing popt-0:1.19-6.fc40 100% |  28.0 MiB/s | 143.5 KiB |  00m00s
[ 33/155] Installing readline-0:8.2-8.f 100% |  40.0 MiB/s | 491.4 KiB |  00m00s
[ 34/155] Installing libzstd-0:1.5.6-1. 100% | 192.7 MiB/s | 789.2 KiB |  00m00s
[ 35/155] Installing elfutils-libelf-0: 100% | 130.0 MiB/s |   1.2 MiB |  00m00s
[ 36/155] Installing libstdc++-0:14.2.1 100% | 102.5 MiB/s |   2.8 MiB |  00m00s
[ 37/155] Installing libuuid-0:2.40.2-1 100% |  37.7 MiB/s |  38.6 KiB |  00m00s
[ 38/155] Installing libblkid-0:2.40.2- 100% |   9.1 MiB/s | 259.7 KiB |  00m00s
[ 39/155] Installing libattr-0:2.5.2-3. 100% |  28.8 MiB/s |  29.5 KiB |  00m00s
[ 40/155] Installing libacl-0:2.3.2-1.f 100% |  39.9 MiB/s |  40.8 KiB |  00m00s
[ 41/155] Installing gmp-1:6.2.1-8.fc40 100% | 155.6 MiB/s | 796.8 KiB |  00m00s
[ 42/155] Installing libxcrypt-0:4.4.38 100% |  88.1 MiB/s | 270.8 KiB |  00m00s
[ 43/155] Installing lz4-libs-0:1.9.4-6 100% |  14.2 MiB/s | 130.5 KiB |  00m00s
[ 44/155] Installing gdbm-libs-1:1.23-6 100% |  60.3 MiB/s | 123.6 KiB |  00m00s
[ 45/155] Installing libeconf-0:0.6.2-2 100% |  29.1 MiB/s |  59.6 KiB |  00m00s
[ 46/155] Installing mpfr-0:4.2.1-4.fc4 100% | 162.8 MiB/s | 833.7 KiB |  00m00s
[ 47/155] Installing gawk-0:5.3.0-3.fc4 100% | 108.0 MiB/s |   1.7 MiB |  00m00s
[ 48/155] Installing dwz-0:0.15-8.fc40. 100% |  22.3 MiB/s | 296.3 KiB |  00m00s
[ 49/155] Installing unzip-0:6.0-63.fc4 100% |  94.3 MiB/s | 386.3 KiB |  00m00s
[ 50/155] Installing file-libs-0:5.45-4 100% |  46.2 MiB/s |   9.9 MiB |  00m00s
[ 51/155] Installing file-0:5.45-4.fc40 100% |  51.3 MiB/s | 105.0 KiB |  00m00s
[ 52/155] Installing libcap-ng-0:0.8.4- 100% |  73.2 MiB/s |  75.0 KiB |  00m00s
[ 53/155] Installing audit-libs-0:4.0.3 100% | 113.8 MiB/s | 349.5 KiB |  00m00s
[ 54/155] Installing pam-libs-0:1.6.1-5 100% |  11.2 MiB/s | 137.4 KiB |  00m00s
[ 55/155] Installing libcap-0:2.69-8.fc 100% |  54.9 MiB/s | 224.8 KiB |  00m00s
[ 56/155] Installing systemd-libs-0:255 100% |  84.3 MiB/s |   1.9 MiB |  00m00s
[ 57/155] Installing lua-libs-0:5.4.6-5 100% | 137.8 MiB/s | 282.3 KiB |  00m00s
[ 58/155] Installing libsepol-0:3.7-2.f 100% |  53.3 MiB/s | 818.8 KiB |  00m00s
[ 59/155] Installing jansson-0:2.13.1-9 100% |  43.8 MiB/s |  89.7 KiB |  00m00s
[ 60/155] Installing pcre2-0:10.44-1.fc 100% | 159.9 MiB/s | 654.9 KiB |  00m00s
[ 61/155] Installing libselinux-0:3.7-5 100% |  87.0 MiB/s | 178.3 KiB |  00m00s
[ 62/155] Installing sed-0:4.9-1.fc40.x 100% |  77.2 MiB/s | 869.7 KiB |  00m00s
[ 63/155] Installing grep-0:3.11-7.fc40 100% |  43.6 MiB/s |   1.0 MiB |  00m00s
[ 64/155] Installing findutils-1:4.9.0- 100% | 104.7 MiB/s |   1.5 MiB |  00m00s
[ 65/155] Installing xz-1:5.4.6-3.fc40. 100% |  91.0 MiB/s |   2.0 MiB |  00m00s
[ 66/155] Installing libmount-0:2.40.2- 100% | 116.2 MiB/s | 356.9 KiB |  00m00s
[ 67/155] Installing libsmartcols-0:2.4 100% |  88.6 MiB/s | 181.5 KiB |  00m00s
[ 68/155] Installing libcom_err-0:1.47. 100% |  22.2 MiB/s |  68.3 KiB |  00m00s
[ 69/155] Installing libffi-0:3.4.4-7.f 100% |  40.5 MiB/s |  83.0 KiB |  00m00s
[ 70/155] Installing libtasn1-0:4.19.0- 100% |  86.7 MiB/s | 177.5 KiB |  00m00s
[ 71/155] Installing p11-kit-0:0.25.5-1 100% |  55.2 MiB/s |   2.2 MiB |  00m00s
[ 72/155] Installing alternatives-0:1.2 100% |  66.4 MiB/s |  68.0 KiB |  00m00s
[ 73/155] Installing libunistring-0:1.1 100% |  13.1 MiB/s |   1.7 MiB |  00m00s
[ 74/155] Installing libidn2-0:2.3.7-1. 100% |  20.4 MiB/s | 335.0 KiB |  00m00s
[ 75/155] Installing libpsl-0:0.21.5-3. 100% |  79.7 MiB/s |  81.6 KiB |  00m00s
[ 76/155] Installing p11-kit-trust-0:0. 100% |  16.7 MiB/s | 393.1 KiB |  00m00s
>>> Running post-install scriptlet: p11-kit-trust-0:0.25.5-1.fc40.x86_64
>>> Stop post-install scriptlet: p11-kit-trust-0:0.25.5-1.fc40.x86_64
[ 77/155] Installing util-linux-core-0: 100% |  61.9 MiB/s |   1.5 MiB |  00m00s
[ 78/155] Installing tar-2:1.35-3.fc40. 100% | 113.5 MiB/s |   3.0 MiB |  00m00s
[ 79/155] Installing libsemanage-0:3.7- 100% |  72.1 MiB/s | 295.2 KiB |  00m00s
[ 80/155] Installing shadow-utils-2:4.1 100% |  48.5 MiB/s |   4.2 MiB |  00m00s
>>> Running pre-install scriptlet: libutempter-0:1.2.1-13.fc40.x86_64
>>> Stop pre-install scriptlet: libutempter-0:1.2.1-13.fc40.x86_64
[ 81/155] Installing libutempter-0:1.2. 100% |  29.2 MiB/s |  59.7 KiB |  00m00s
[ 82/155] Installing zip-0:3.0-40.fc40. 100% | 138.1 MiB/s | 707.1 KiB |  00m00s
[ 83/155] Installing gdbm-1:1.23-6.fc40 100% |  35.0 MiB/s | 465.8 KiB |  00m00s
[ 84/155] Installing cyrus-sasl-lib-0:2 100% | 114.2 MiB/s |   2.3 MiB |  00m00s
[ 85/155] Installing zstd-0:1.5.6-1.fc4 100% |  83.8 MiB/s |   1.7 MiB |  00m00s
[ 86/155] Installing libfdisk-0:2.40.2- 100% | 118.5 MiB/s | 364.0 KiB |  00m00s
[ 87/155] Installing bzip2-0:1.0.8-18.f 100% |  47.0 MiB/s |  96.2 KiB |  00m00s
[ 88/155] Installing libxml2-0:2.12.9-1 100% |  85.6 MiB/s |   1.7 MiB |  00m00s
[ 89/155] Installing sqlite-libs-0:3.45 100% |  73.8 MiB/s |   1.4 MiB |  00m00s
[ 90/155] Installing ed-0:1.20.2-1.fc40 100% |  72.8 MiB/s | 149.2 KiB |  00m00s
[ 91/155] Installing patch-0:2.7.6-24.f 100% |  86.0 MiB/s | 264.3 KiB |  00m00s
[ 92/155] Installing elfutils-default-y 100% | 127.7 KiB/s |   2.0 KiB |  00m00s
>>> Running post-install scriptlet: elfutils-default-yama-scope-0:0.192-7.fc40.n
>>> Stop post-install scriptlet: elfutils-default-yama-scope-0:0.192-7.fc40.noar
[ 93/155] Installing cpio-0:2.15-1.fc40 100% | 110.0 MiB/s |   1.1 MiB |  00m00s
[ 94/155] Installing diffutils-0:3.10-5 100% |  69.0 MiB/s |   1.6 MiB |  00m00s
[ 95/155] Installing json-c-0:0.17-3.fc 100% |  40.8 MiB/s |  83.6 KiB |  00m00s
[ 96/155] Installing libgomp-0:14.2.1-3 100% |  17.7 MiB/s | 525.0 KiB |  00m00s
[ 97/155] Installing libpkgconf-0:2.1.1 100% |  73.5 MiB/s |  75.3 KiB |  00m00s
[ 98/155] Installing pkgconf-0:2.1.1-2. 100% |  41.7 MiB/s |  85.4 KiB |  00m00s
[ 99/155] Installing pkgconf-pkg-config 100% |   1.7 MiB/s |   1.8 KiB |  00m00s
[100/155] Installing keyutils-libs-0:1. 100% |  54.5 MiB/s |  55.8 KiB |  00m00s
[101/155] Installing libverto-0:0.3.2-8 100% |  30.5 MiB/s |  31.3 KiB |  00m00s
[102/155] Installing xxhash-libs-0:0.8. 100% |  89.5 MiB/s |  91.6 KiB |  00m00s
[103/155] Installing libbrotli-0:1.1.0- 100% | 116.0 MiB/s | 831.8 KiB |  00m00s
[104/155] Installing libnghttp2-0:1.59. 100% |  81.6 MiB/s | 167.2 KiB |  00m00s
[105/155] Installing libtool-ltdl-0:2.4 100% |  65.7 MiB/s |  67.3 KiB |  00m00s
[106/155] Installing perl-srpm-macros-0 100% |   0.0   B/s |   1.1 KiB |  00m00s
[107/155] Installing package-notes-srpm 100% |   2.0 MiB/s |   2.0 KiB |  00m00s
[108/155] Installing openblas-srpm-macr 100% |   0.0   B/s | 384.0   B |  00m00s
[109/155] Installing ocaml-srpm-macros- 100% |   0.0   B/s |   2.2 KiB |  00m00s
[110/155] Installing kernel-srpm-macros 100% | 116.4 KiB/s |   2.3 KiB |  00m00s
[111/155] Installing gnat-srpm-macros-0 100% |   0.0   B/s |   1.3 KiB |  00m00s
[112/155] Installing fpc-srpm-macros-0: 100% | 410.2 KiB/s | 420.0   B |  00m00s
[113/155] Installing coreutils-common-0 100% | 127.4 MiB/s |  11.5 MiB |  00m00s
[114/155] Installing openssl-libs-1:3.2 100% | 116.8 MiB/s |   7.8 MiB |  00m00s
[115/155] Installing coreutils-0:9.4-9. 100% |  55.5 MiB/s |   5.8 MiB |  00m00s
>>> Running pre-install scriptlet: ca-certificates-0:2024.2.69_v8.0.401-1.0.fc40
>>> Stop pre-install scriptlet: ca-certificates-0:2024.2.69_v8.0.401-1.0.fc40.no
[116/155] Installing ca-certificates-0: 100% |   2.1 MiB/s |   2.4 MiB |  00m01s
>>> Running post-install scriptlet: ca-certificates-0:2024.2.69_v8.0.401-1.0.fc4
>>> Stop post-install scriptlet: ca-certificates-0:2024.2.69_v8.0.401-1.0.fc40.n
[117/155] Installing krb5-libs-0:1.21.3 100% |  88.7 MiB/s |   2.3 MiB |  00m00s
[118/155] Installing libtirpc-0:1.3.6-1 100% |  49.9 MiB/s | 204.5 KiB |  00m00s
[119/155] Installing gzip-0:1.13-1.fc40 100% |  47.7 MiB/s | 390.6 KiB |  00m00s
[120/155] Installing authselect-libs-0: 100% |  28.1 MiB/s | 833.2 KiB |  00m00s
[121/155] Installing libarchive-0:3.7.2 100% |  45.1 MiB/s | 924.5 KiB |  00m00s
[122/155] Installing authselect-0:1.5.0 100% |  22.0 MiB/s | 157.9 KiB |  00m00s
[123/155] Installing cracklib-0:2.9.11- 100% |  18.8 MiB/s | 250.3 KiB |  00m00s
[124/155] Installing libpwquality-0:1.4 100% |  23.3 MiB/s | 430.1 KiB |  00m00s
[125/155] Installing libnsl2-0:2.0.1-1. 100% |  19.2 MiB/s |  59.0 KiB |  00m00s
[126/155] Installing pam-0:1.6.1-5.fc40 100% |  33.7 MiB/s |   1.8 MiB |  00m00s
[127/155] Installing libssh-0:0.10.6-5. 100% |  83.2 MiB/s | 511.4 KiB |  00m00s
[128/155] Installing rpm-sequoia-0:1.7. 100% |  31.5 MiB/s |   2.4 MiB |  00m00s
[129/155] Installing rpm-libs-0:4.19.1. 100% |  99.3 MiB/s | 711.4 KiB |  00m00s
[130/155] Installing libevent-0:2.1.12- 100% |  16.6 MiB/s | 899.4 KiB |  00m00s
[131/155] Installing openldap-0:2.6.8-1 100% | 104.8 MiB/s | 644.0 KiB |  00m00s
[132/155] Installing libcurl-0:8.6.0-10 100% |   8.6 MiB/s | 777.9 KiB |  00m00s
[133/155] Installing elfutils-libs-0:0. 100% | 131.3 MiB/s | 672.2 KiB |  00m00s
[134/155] Installing elfutils-debuginfo 100% |  26.8 MiB/s |  82.4 KiB |  00m00s
[135/155] Installing binutils-0:2.41-38 100% |  86.8 MiB/s |  26.5 MiB |  00m00s
>>> Running post-install scriptlet: binutils-0:2.41-38.fc40.x86_64
>>> Stop post-install scriptlet: binutils-0:2.41-38.fc40.x86_64
[136/155] Installing binutils-gold-0:2. 100% |  75.8 MiB/s |   2.0 MiB |  00m00s
>>> Running post-install scriptlet: binutils-gold-0:2.41-38.fc40.x86_64
>>> Stop post-install scriptlet: binutils-gold-0:2.41-38.fc40.x86_64
[137/155] Installing elfutils-0:0.192-7 100% |  68.2 MiB/s |   2.7 MiB |  00m00s
[138/155] Installing gdb-minimal-0:15.2 100% | 109.2 MiB/s |  13.0 MiB |  00m00s
[139/155] Installing debugedit-0:5.0-18 100% |  32.9 MiB/s | 202.0 KiB |  00m00s
[140/155] Installing rpm-build-libs-0:4 100% |  97.3 MiB/s | 199.2 KiB |  00m00s
[141/155] Installing curl-0:8.6.0-10.fc 100% |  26.8 MiB/s | 740.9 KiB |  00m00s
>>> Running pre-install scriptlet: rpm-0:4.19.1.1-1.fc40.x86_64
>>> Stop pre-install scriptlet: rpm-0:4.19.1.1-1.fc40.x86_64
[142/155] Installing rpm-0:4.19.1.1-1.f 100% |  43.6 MiB/s |   2.4 MiB |  00m00s
[143/155] Installing efi-srpm-macros-0: 100% |  40.2 MiB/s |  41.2 KiB |  00m00s
[144/155] Installing lua-srpm-macros-0: 100% |   1.9 MiB/s |   1.9 KiB |  00m00s
[145/155] Installing zig-srpm-macros-0: 100% |   1.6 MiB/s |   1.7 KiB |  00m00s
[146/155] Installing fonts-srpm-macros- 100% |  55.1 MiB/s |  56.5 KiB |  00m00s
[147/155] Installing go-srpm-macros-0:3 100% |  60.2 MiB/s |  61.6 KiB |  00m00s
[148/155] Installing forge-srpm-macros- 100% |  39.3 MiB/s |  40.3 KiB |  00m00s
[149/155] Installing python-srpm-macros 100% | 442.5 KiB/s |  51.8 KiB |  00m00s
[150/155] Installing redhat-rpm-config- 100% |  37.5 MiB/s | 191.9 KiB |  00m00s
[151/155] Installing rpm-build-0:4.19.1 100% |  29.6 MiB/s | 182.0 KiB |  00m00s
[152/155] Installing pyproject-srpm-mac 100% |   1.2 MiB/s |   2.5 KiB |  00m00s
[153/155] Installing util-linux-0:2.40. 100% |  54.3 MiB/s |   3.7 MiB |  00m00s
>>> Running post-install scriptlet: util-linux-0:2.40.2-1.fc40.x86_64
>>> Stop post-install scriptlet: util-linux-0:2.40.2-1.fc40.x86_64
[154/155] Installing which-0:2.21-41.fc 100% |  40.3 MiB/s |  82.4 KiB |  00m00s
[155/155] Installing info-0:7.1-2.fc40. 100% | 242.7 KiB/s | 358.2 KiB |  00m01s
>>> Running post-transaction scriptlet: filesystem-0:3.18-8.fc40.x86_64
>>> Stop post-transaction scriptlet: filesystem-0:3.18-8.fc40.x86_64
>>> Running post-transaction scriptlet: ca-certificates-0:2024.2.69_v8.0.401-1.0
>>> Stop post-transaction scriptlet: ca-certificates-0:2024.2.69_v8.0.401-1.0.fc
>>> Running post-transaction scriptlet: authselect-libs-0:1.5.0-6.fc40.x86_64
>>> Stop post-transaction scriptlet: authselect-libs-0:1.5.0-6.fc40.x86_64
>>> Running post-transaction scriptlet: rpm-0:4.19.1.1-1.fc40.x86_64
>>> Stop post-transaction scriptlet: rpm-0:4.19.1.1-1.fc40.x86_64
>>> Running trigger-install scriptlet: glibc-common-0:2.39-37.fc40.x86_64
>>> Stop trigger-install scriptlet: glibc-common-0:2.39-37.fc40.x86_64
>>> Running trigger-install scriptlet: info-0:7.1-2.fc40.x86_64
>>> Stop trigger-install scriptlet: info-0:7.1-2.fc40.x86_64
Finish: installing minimal buildroot with dnf5
Start: creating root cache
Finish: creating root cache
Finish: chroot init
INFO: Installed packages:
INFO: alternatives-1.27-1.fc40.x86_64
ansible-srpm-macros-1-16.fc40.noarch
audit-libs-4.0.3-1.fc40.x86_64
authselect-1.5.0-6.fc40.x86_64
authselect-libs-1.5.0-6.fc40.x86_64
basesystem-11-20.fc40.noarch
bash-5.2.26-3.fc40.x86_64
binutils-2.41-38.fc40.x86_64
binutils-gold-2.41-38.fc40.x86_64
bzip2-1.0.8-18.fc40.x86_64
bzip2-libs-1.0.8-18.fc40.x86_64
ca-certificates-2024.2.69_v8.0.401-1.0.fc40.noarch
coreutils-9.4-9.fc40.x86_64
coreutils-common-9.4-9.fc40.x86_64
cpio-2.15-1.fc40.x86_64
cracklib-2.9.11-5.fc40.x86_64
crypto-policies-20241011-1.git5930b9a.fc40.noarch
curl-8.6.0-10.fc40.x86_64
cyrus-sasl-lib-2.1.28-19.fc40.x86_64
debugedit-5.0-18.fc40.x86_64
diffutils-3.10-5.fc40.x86_64
dwz-0.15-8.fc40.x86_64
ed-1.20.2-1.fc40.x86_64
efi-srpm-macros-5-11.fc40.noarch
elfutils-0.192-7.fc40.x86_64
elfutils-debuginfod-client-0.192-7.fc40.x86_64
elfutils-default-yama-scope-0.192-7.fc40.noarch
elfutils-libelf-0.192-7.fc40.x86_64
elfutils-libs-0.192-7.fc40.x86_64
fedora-gpg-keys-40-2.noarch
fedora-release-40-40.noarch
fedora-release-common-40-40.noarch
fedora-release-identity-basic-40-40.noarch
fedora-repos-40-2.noarch
file-5.45-4.fc40.x86_64
file-libs-5.45-4.fc40.x86_64
filesystem-3.18-8.fc40.x86_64
findutils-4.9.0-9.fc40.x86_64
fonts-srpm-macros-2.0.5-14.fc40.noarch
forge-srpm-macros-0.4.0-1.fc40.noarch
fpc-srpm-macros-1.3-12.fc40.noarch
gawk-5.3.0-3.fc40.x86_64
gdb-minimal-15.2-4.fc40.x86_64
gdbm-1.23-6.fc40.x86_64
gdbm-libs-1.23-6.fc40.x86_64
ghc-srpm-macros-1.9.1-1.fc40.noarch
glibc-2.39-37.fc40.x86_64
glibc-common-2.39-37.fc40.x86_64
glibc-gconv-extra-2.39-37.fc40.x86_64
glibc-minimal-langpack-2.39-37.fc40.x86_64
gmp-6.2.1-8.fc40.x86_64
gnat-srpm-macros-6-5.fc40.noarch
go-srpm-macros-3.5.0-1.fc40.noarch
gpg-pubkey-a15b79cc-63d04c2c
grep-3.11-7.fc40.x86_64
gzip-1.13-1.fc40.x86_64
info-7.1-2.fc40.x86_64
jansson-2.13.1-9.fc40.x86_64
json-c-0.17-3.fc40.x86_64
kernel-srpm-macros-1.0-23.fc40.noarch
keyutils-libs-1.6.3-3.fc40.x86_64
krb5-libs-1.21.3-2.fc40.x86_64
libacl-2.3.2-1.fc40.x86_64
libarchive-3.7.2-7.fc40.x86_64
libattr-2.5.2-3.fc40.x86_64
libblkid-2.40.2-1.fc40.x86_64
libbrotli-1.1.0-3.fc40.x86_64
libcap-2.69-8.fc40.x86_64
libcap-ng-0.8.4-4.fc40.x86_64
libcom_err-1.47.0-5.fc40.x86_64
libcurl-8.6.0-10.fc40.x86_64
libeconf-0.6.2-2.fc40.x86_64
libevent-2.1.12-12.fc40.x86_64
libfdisk-2.40.2-1.fc40.x86_64
libffi-3.4.4-7.fc40.x86_64
libgcc-14.2.1-3.fc40.x86_64
libgomp-14.2.1-3.fc40.x86_64
libidn2-2.3.7-1.fc40.x86_64
libmount-2.40.2-1.fc40.x86_64
libnghttp2-1.59.0-3.fc40.x86_64
libnsl2-2.0.1-1.fc40.x86_64
libpkgconf-2.1.1-2.fc40.x86_64
libpsl-0.21.5-3.fc40.x86_64
libpwquality-1.4.5-9.fc40.x86_64
libselinux-3.7-5.fc40.x86_64
libsemanage-3.7-2.fc40.x86_64
libsepol-3.7-2.fc40.x86_64
libsmartcols-2.40.2-1.fc40.x86_64
libssh-0.10.6-5.fc40.x86_64
libssh-config-0.10.6-5.fc40.noarch
libstdc++-14.2.1-3.fc40.x86_64
libtasn1-4.19.0-6.fc40.x86_64
libtirpc-1.3.6-1.rc3.fc40.x86_64
libtool-ltdl-2.4.7-10.fc40.x86_64
libunistring-1.1-7.fc40.x86_64
libutempter-1.2.1-13.fc40.x86_64
libuuid-2.40.2-1.fc40.x86_64
libverto-0.3.2-8.fc40.x86_64
libxcrypt-4.4.38-3.fc40.x86_64
libxml2-2.12.9-1.fc40.x86_64
libzstd-1.5.6-1.fc40.x86_64
lua-libs-5.4.6-5.fc40.x86_64
lua-srpm-macros-1-13.fc40.noarch
lz4-libs-1.9.4-6.fc40.x86_64
mpfr-4.2.1-4.fc40.x86_64
ncurses-base-6.4-12.20240127.fc40.noarch
ncurses-libs-6.4-12.20240127.fc40.x86_64
ocaml-srpm-macros-9-3.fc40.noarch
openblas-srpm-macros-2-16.fc40.noarch
openldap-2.6.8-1.fc40.x86_64
openssl-libs-3.2.2-3.fc40.x86_64
p11-kit-0.25.5-1.fc40.x86_64
p11-kit-trust-0.25.5-1.fc40.x86_64
package-notes-srpm-macros-0.5-11.fc40.noarch
pam-1.6.1-5.fc40.x86_64
pam-libs-1.6.1-5.fc40.x86_64
patch-2.7.6-24.fc40.x86_64
pcre2-10.44-1.fc40.x86_64
pcre2-syntax-10.44-1.fc40.noarch
perl-srpm-macros-1-53.fc40.noarch
pkgconf-2.1.1-2.fc40.x86_64
pkgconf-m4-2.1.1-2.fc40.noarch
pkgconf-pkg-config-2.1.1-2.fc40.x86_64
popt-1.19-6.fc40.x86_64
publicsuffix-list-dafsa-20250116-1.fc40.noarch
pyproject-srpm-macros-1.16.4-1.fc40.noarch
python-srpm-macros-3.12-8.fc40.noarch
qt5-srpm-macros-5.15.15-1.fc40.noarch
qt6-srpm-macros-6.8.1-4.fc40.noarch
readline-8.2-8.fc40.x86_64
redhat-rpm-config-288-1.fc40.noarch
rpm-4.19.1.1-1.fc40.x86_64
rpm-build-4.19.1.1-1.fc40.x86_64
rpm-build-libs-4.19.1.1-1.fc40.x86_64
rpm-libs-4.19.1.1-1.fc40.x86_64
rpm-sequoia-1.7.0-3.fc40.x86_64
rust-srpm-macros-26.3-1.fc40.noarch
sed-4.9-1.fc40.x86_64
setup-2.14.5-2.fc40.noarch
shadow-utils-4.15.1-4.fc40.x86_64
sqlite-libs-3.45.1-2.fc40.x86_64
systemd-libs-255.16-1.fc40.x86_64
tar-1.35-3.fc40.x86_64
unzip-6.0-63.fc40.x86_64
util-linux-2.40.2-1.fc40.x86_64
util-linux-core-2.40.2-1.fc40.x86_64
which-2.21-41.fc40.x86_64
xxhash-libs-0.8.3-1.fc40.x86_64
xz-5.4.6-3.fc40.x86_64
xz-libs-5.4.6-3.fc40.x86_64
zig-srpm-macros-1-2.fc40.noarch
zip-3.0-40.fc40.x86_64
zlib-ng-compat-2.1.7-2.fc40.x86_64
zstd-1.5.6-1.fc40.x86_64
Start: buildsrpm
Start: rpmbuild -bs
Building target platforms: x86_64
Building for target x86_64
setting SOURCE_DATE_EPOCH=1738022400
Wrote: /builddir/build/SRPMS/pycharm-community-2024.3.2-1.fc40.src.rpm
Finish: rpmbuild -bs
INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan
INFO: /var/lib/mock/fedora-40-x86_64-1738090623.831555/root/var/log/dnf5.log
INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz
/bin/tar: Removing leading `/' from member names
Finish: buildsrpm
INFO: Done(/var/lib/copr-rpmbuild/workspace/workdir-svhveals/pycharm-community/pycharm-community.spec) Config(child) 1 minutes 29 seconds
INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results
INFO: Cleaning up build root ('cleanup_on_success=True')
Start: clean chroot
INFO: unmounting tmpfs.
Finish: clean chroot
INFO: Start(/var/lib/copr-rpmbuild/results/pycharm-community-2024.3.2-1.fc40.src.rpm)  Config(fedora-40-x86_64)
Start(bootstrap): chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-40-x86_64-bootstrap-1738090623.831555/root.
INFO: reusing tmpfs at /var/lib/mock/fedora-40-x86_64-bootstrap-1738090623.831555/root.
INFO: calling preinit hooks
INFO: enabled root cache
INFO: enabled package manager cache
Start(bootstrap): cleaning package manager metadata
Finish(bootstrap): cleaning package manager metadata
Finish(bootstrap): chroot init
Start: chroot init
INFO: mounting tmpfs at /var/lib/mock/fedora-40-x86_64-1738090623.831555/root.
INFO: calling preinit hooks
INFO: enabled root cache
Start: unpacking root cache
Finish: unpacking root cache
INFO: enabled package manager cache
Start: cleaning package manager metadata
Finish: cleaning package manager metadata
INFO: enabled HW Info plugin
INFO: Buildroot is handled by package management installed into bootstrap:
  rpm-4.19.1.1-1.fc40.x86_64
  rpm-sequoia-1.7.0-3.fc40.x86_64
  dnf5-5.1.17-3.fc40.x86_64
  dnf5-plugins-5.1.17-3.fc40.x86_64
Finish: chroot init
Start: build phase for pycharm-community-2024.3.2-1.fc40.src.rpm
Start: build setup for pycharm-community-2024.3.2-1.fc40.src.rpm
Building target platforms: x86_64
Building for target x86_64
setting SOURCE_DATE_EPOCH=1738022400
Wrote: /builddir/build/SRPMS/pycharm-community-2024.3.2-1.fc40.src.rpm
Updating and loading repositories:
 updates                                100% | 980.0 KiB/s |  31.4 KiB |  00m00s
 fedora                                 100% |   1.1 MiB/s |  32.2 KiB |  00m00s
 Copr repository                        100% |  32.4 KiB/s |   2.1 KiB |  00m00s
Repositories loaded.
Package                     Arch   Version         Repository      Size
Installing:                                                            
 desktop-file-utils         x86_64 0.26-12.fc40    fedora     226.0 KiB
 javapackages-filesystem    noarch 6.2.0-9.fc40    fedora       1.9 KiB
 libappstream-glib          x86_64 0.8.3-1.fc40    updates      1.4 MiB
 librsvg2-tools             x86_64 2.57.1-7.fc40   updates      5.1 MiB
 python3-devel              x86_64 3.12.8-2.fc40   updates      1.3 MiB
Installing dependencies:                                               
 abattis-cantarell-vf-fonts noarch 0.301-12.fc40   fedora     192.7 KiB
 cairo                      x86_64 1.18.0-3.fc40   fedora       1.7 MiB
 cairo-gobject              x86_64 1.18.0-3.fc40   fedora      35.2 KiB
 default-fonts-core-sans    noarch 4.0-13.fc40     updates     11.9 KiB
 emacs-filesystem           noarch 1:29.4-9.fc40   updates      0.0   B
 expat                      x86_64 2.6.3-1.fc40    updates    287.5 KiB
 fontconfig                 x86_64 2.15.0-6.fc40   updates    768.0 KiB
 fonts-filesystem           noarch 1:2.0.5-14.fc40 fedora       0.0   B
 freetype                   x86_64 2.13.2-5.fc40   fedora     842.6 KiB
 fribidi                    x86_64 1.0.14-2.fc40   updates    367.6 KiB
 gdk-pixbuf2                x86_64 2.42.10-8.fc40  fedora       2.5 MiB
 glib2                      x86_64 2.80.3-1.fc40   updates     14.6 MiB
 gnutls                     x86_64 3.8.6-1.fc40    updates      3.2 MiB
 google-noto-fonts-common   noarch 20240301-2.fc40 fedora      17.5 KiB
 google-noto-sans-vf-fonts  noarch 20240301-2.fc40 fedora       1.2 MiB
 graphite2                  x86_64 1.3.14-15.fc40  fedora     192.0 KiB
 harfbuzz                   x86_64 8.5.0-1.fc40    updates      2.7 MiB
 json-glib                  x86_64 1.8.0-3.fc40    fedora     561.4 KiB
 libX11                     x86_64 1.8.10-2.fc40   updates      1.3 MiB
 libX11-common              noarch 1.8.10-2.fc40   updates      1.1 MiB
 libXau                     x86_64 1.0.11-6.fc40   fedora      66.9 KiB
 libXext                    x86_64 1.3.6-1.fc40    fedora      90.1 KiB
 libXft                     x86_64 2.3.8-6.fc40    fedora     164.5 KiB
 libXrender                 x86_64 0.9.11-6.fc40   fedora      50.1 KiB
 libb2                      x86_64 0.98.1-11.fc40  fedora      42.2 KiB
 libdatrie                  x86_64 0.2.13-9.fc40   fedora      57.9 KiB
 libjpeg-turbo              x86_64 3.0.2-1.fc40    fedora     776.9 KiB
 libpng                     x86_64 2:1.6.40-3.fc40 fedora     241.8 KiB
 librsvg2                   x86_64 2.57.1-7.fc40   updates      4.1 MiB
 libthai                    x86_64 0.1.29-8.fc40   fedora     783.5 KiB
 libxcb                     x86_64 1.17.0-2.fc40   updates      1.1 MiB
 mpdecimal                  x86_64 2.5.1-9.fc40    fedora     200.9 KiB
 nettle                     x86_64 3.9.1-6.fc40    fedora     790.1 KiB
 pango                      x86_64 1.54.0-1.fc40   updates    996.2 KiB
 pixman                     x86_64 0.43.4-1.fc40   updates    710.1 KiB
 pyproject-rpm-macros       noarch 1.16.4-1.fc40   updates    113.0 KiB
 python-pip-wheel           noarch 23.3.2-2.fc40   updates      1.5 MiB
 python-rpm-macros          noarch 3.12-8.fc40     updates     22.1 KiB
 python3                    x86_64 3.12.8-2.fc40   updates     31.5 KiB
 python3-libs               x86_64 3.12.8-2.fc40   updates     41.3 MiB
 python3-packaging          noarch 23.2-4.fc40     fedora     421.1 KiB
 python3-rpm-generators     noarch 14-10.fc40      fedora      81.7 KiB
 python3-rpm-macros         noarch 3.12-8.fc40     updates      6.4 KiB
 rsvg-pixbuf-loader         x86_64 2.57.1-7.fc40   updates     15.5 KiB
 shared-mime-info           x86_64 2.3-5.fc40      updates      5.2 MiB
 tzdata                     noarch 2024b-1.fc40    updates      1.6 MiB
 xml-common                 noarch 0.6.3-63.fc40   fedora      78.4 KiB

Transaction Summary:
 Installing:       52 packages

Total size of inbound packages is 27 MiB. Need to download 27 MiB.
After this operation 100 MiB will be used (install 100 MiB, remove 0 B).
[ 1/52] javapackages-filesystem-0:6.2.0 100% | 110.3 KiB/s |  12.4 KiB |  00m00s
[ 2/52] desktop-file-utils-0:0.26-12.fc 100% | 578.2 KiB/s |  68.2 KiB |  00m00s
[ 3/52] libappstream-glib-0:0.8.3-1.fc4 100% | 683.0 KiB/s | 405.0 KiB |  00m01s
[ 4/52] gdk-pixbuf2-0:2.42.10-8.fc40.x8 100% |   7.0 MiB/s | 484.7 KiB |  00m00s
[ 5/52] json-glib-0:1.8.0-3.fc40.x86_64 100% |  11.6 MiB/s | 166.7 KiB |  00m00s
[ 6/52] python3-devel-0:3.12.8-2.fc40.x 100% | 523.0 KiB/s | 313.8 KiB |  00m01s
[ 7/52] cairo-0:1.18.0-3.fc40.x86_64    100% |  15.4 MiB/s | 708.9 KiB |  00m00s
[ 8/52] cairo-gobject-0:1.18.0-3.fc40.x 100% |   1.6 MiB/s |  17.5 KiB |  00m00s
[ 9/52] librsvg2-tools-0:2.57.1-7.fc40. 100% |   2.2 MiB/s |   1.7 MiB |  00m01s
[10/52] librsvg2-0:2.57.1-7.fc40.x86_64 100% |   6.6 MiB/s |   1.5 MiB |  00m00s
[11/52] libjpeg-turbo-0:3.0.2-1.fc40.x8 100% |  15.8 MiB/s | 226.7 KiB |  00m00s
[12/52] libpng-2:1.6.40-3.fc40.x86_64   100% |   5.3 MiB/s | 119.9 KiB |  00m00s
[13/52] freetype-0:2.13.2-5.fc40.x86_64 100% |  16.7 MiB/s | 409.7 KiB |  00m00s
[14/52] libXext-0:1.3.6-1.fc40.x86_64   100% |   1.9 MiB/s |  38.9 KiB |  00m00s
[15/52] libXrender-0:0.9.11-6.fc40.x86_ 100% |   2.1 MiB/s |  27.4 KiB |  00m00s
[16/52] libb2-0:0.98.1-11.fc40.x86_64   100% |   1.9 MiB/s |  25.5 KiB |  00m00s
[17/52] mpdecimal-0:2.5.1-9.fc40.x86_64 100% |   6.2 MiB/s |  88.6 KiB |  00m00s
[18/52] pyproject-rpm-macros-0:1.16.4-1 100% | 506.2 KiB/s |  44.5 KiB |  00m00s
[19/52] python-rpm-macros-0:3.12-8.fc40 100% | 190.1 KiB/s |  17.5 KiB |  00m00s
[20/52] python3-rpm-generators-0:14-10. 100% |   2.4 MiB/s |  29.6 KiB |  00m00s
[21/52] python3-packaging-0:23.2-4.fc40 100% |  10.2 MiB/s | 125.2 KiB |  00m00s
[22/52] python3-rpm-macros-0:3.12-8.fc4 100% | 142.6 KiB/s |  12.3 KiB |  00m00s
[23/52] python3-0:3.12.8-2.fc40.x86_64  100% | 314.2 KiB/s |  28.0 KiB |  00m00s
[24/52] libX11-0:1.8.10-2.fc40.x86_64   100% |   8.5 MiB/s | 649.8 KiB |  00m00s
[25/52] python3-libs-0:3.12.8-2.fc40.x8 100% |  19.6 MiB/s |   9.1 MiB |  00m00s
[26/52] libX11-common-0:1.8.10-2.fc40.n 100% |   2.5 MiB/s | 175.8 KiB |  00m00s
[27/52] harfbuzz-0:8.5.0-1.fc40.x86_64  100% |  10.6 MiB/s |   1.0 MiB |  00m00s
[28/52] shared-mime-info-0:2.3-5.fc40.x 100% |   3.4 MiB/s | 390.4 KiB |  00m00s
[29/52] graphite2-0:1.3.14-15.fc40.x86_ 100% |   7.7 MiB/s |  94.8 KiB |  00m00s
[30/52] glib2-0:2.80.3-1.fc40.x86_64    100% |  17.2 MiB/s |   3.0 MiB |  00m00s
[31/52] fonts-filesystem-1:2.0.5-14.fc4 100% | 815.4 KiB/s |   8.2 KiB |  00m00s
[32/52] xml-common-0:0.6.3-63.fc40.noar 100% |   2.8 MiB/s |  31.0 KiB |  00m00s
[33/52] emacs-filesystem-1:29.4-9.fc40. 100% | 132.9 KiB/s |   9.2 KiB |  00m00s
[34/52] libXau-0:1.0.11-6.fc40.x86_64   100% |   2.8 MiB/s |  31.7 KiB |  00m00s
[35/52] fontconfig-0:2.15.0-6.fc40.x86_ 100% |   2.8 MiB/s | 269.8 KiB |  00m00s
[36/52] libxcb-0:1.17.0-2.fc40.x86_64   100% |   3.0 MiB/s | 240.0 KiB |  00m00s
[37/52] pixman-0:0.43.4-1.fc40.x86_64   100% |   2.9 MiB/s | 293.2 KiB |  00m00s
[38/52] expat-0:2.6.3-1.fc40.x86_64     100% |   1.1 MiB/s | 114.1 KiB |  00m00s
[39/52] python-pip-wheel-0:23.3.2-2.fc4 100% |  12.4 MiB/s |   1.5 MiB |  00m00s
[40/52] libXft-0:2.3.8-6.fc40.x86_64    100% |   5.9 MiB/s |  72.1 KiB |  00m00s
[41/52] tzdata-0:2024b-1.fc40.noarch    100% |   7.4 MiB/s | 713.5 KiB |  00m00s
[42/52] libthai-0:0.1.29-8.fc40.x86_64  100% |   9.1 MiB/s | 213.8 KiB |  00m00s
[43/52] libdatrie-0:0.2.13-9.fc40.x86_6 100% |   2.0 MiB/s |  32.0 KiB |  00m00s
[44/52] pango-0:1.54.0-1.fc40.x86_64    100% |   3.9 MiB/s | 347.3 KiB |  00m00s
[45/52] nettle-0:3.9.1-6.fc40.x86_64    100% |  16.0 MiB/s | 424.9 KiB |  00m00s
[46/52] rsvg-pixbuf-loader-0:2.57.1-7.f 100% | 146.8 KiB/s |  15.7 KiB |  00m00s
[47/52] gnutls-0:3.8.6-1.fc40.x86_64    100% |   9.8 MiB/s |   1.1 MiB |  00m00s
[48/52] abattis-cantarell-vf-fonts-0:0. 100% |   9.8 MiB/s | 120.3 KiB |  00m00s
[49/52] default-fonts-core-sans-0:4.0-1 100% | 302.4 KiB/s |  31.5 KiB |  00m00s
[50/52] google-noto-sans-vf-fonts-0:202 100% |  17.0 MiB/s | 593.3 KiB |  00m00s
[51/52] google-noto-fonts-common-0:2024 100% | 616.3 KiB/s |  17.3 KiB |  00m00s
[52/52] fribidi-0:1.0.14-2.fc40.x86_64  100% |   1.0 MiB/s |  91.7 KiB |  00m00s
--------------------------------------------------------------------------------
[52/52] Total                           100% |  14.1 MiB/s |  27.2 MiB |  00m02s
Running transaction
[ 1/54] Verify package files            100% | 495.0   B/s |  52.0   B |  00m00s
[ 2/54] Prepare transaction             100% | 481.0   B/s |  52.0   B |  00m00s
[ 3/54] Installing libpng-2:1.6.40-3.fc 100% |  59.3 MiB/s | 243.1 KiB |  00m00s
[ 4/54] Installing fonts-filesystem-1:2 100% | 769.5 KiB/s | 788.0   B |  00m00s
[ 5/54] Installing python-rpm-macros-0: 100% |  22.3 MiB/s |  22.8 KiB |  00m00s
[ 6/54] Installing python3-rpm-macros-0 100% |   6.5 MiB/s |   6.7 KiB |  00m00s
[ 7/54] Installing pyproject-rpm-macros 100% |  56.2 MiB/s | 115.0 KiB |  00m00s
[ 8/54] Installing abattis-cantarell-vf 100% |  63.3 MiB/s | 194.4 KiB |  00m00s
[ 9/54] Installing fribidi-0:1.0.14-2.f 100% |  90.4 MiB/s | 370.1 KiB |  00m00s
[10/54] Installing google-noto-fonts-co 100% |  17.8 MiB/s |  18.3 KiB |  00m00s
[11/54] Installing google-noto-sans-vf- 100% | 156.1 MiB/s |   1.2 MiB |  00m00s
[12/54] Installing default-fonts-core-s 100% |   5.9 MiB/s |  18.2 KiB |  00m00s
[13/54] Installing nettle-0:3.9.1-6.fc4 100% | 129.1 MiB/s | 793.3 KiB |  00m00s
[14/54] Installing gnutls-0:3.8.6-1.fc4 100% | 169.5 MiB/s |   3.2 MiB |  00m00s
[15/54] Installing glib2-0:2.80.3-1.fc4 100% | 185.0 MiB/s |  14.6 MiB |  00m00s
[16/54] Installing json-glib-0:1.8.0-3. 100% |  43.0 MiB/s | 572.8 KiB |  00m00s
[17/54] Installing shared-mime-info-0:2 100% |  79.9 MiB/s |   2.6 MiB |  00m00s
>>> Running post-install scriptlet: shared-mime-info-0:2.3-5.fc40.x86_64
>>> Stop post-install scriptlet: shared-mime-info-0:2.3-5.fc40.x86_64
[18/54] Installing libdatrie-0:0.2.13-9 100% |  28.8 MiB/s |  59.0 KiB |  00m00s
[19/54] Installing libthai-0:0.1.29-8.f 100% |  69.7 MiB/s | 785.3 KiB |  00m00s
[20/54] Installing tzdata-0:2024b-1.fc4 100% |  17.6 MiB/s |   1.8 MiB |  00m00s
[21/54] Installing python-pip-wheel-0:2 100% | 305.3 MiB/s |   1.5 MiB |  00m00s
[22/54] Installing expat-0:2.6.3-1.fc40 100% |  70.7 MiB/s | 289.6 KiB |  00m00s
[23/54] Installing pixman-0:0.43.4-1.fc 100% | 138.9 MiB/s | 711.2 KiB |  00m00s
[24/54] Installing libXau-0:1.0.11-6.fc 100% |  33.4 MiB/s |  68.4 KiB |  00m00s
[25/54] Installing libxcb-0:1.17.0-2.fc 100% |  44.7 MiB/s |   1.1 MiB |  00m00s
>>> Running pre-install scriptlet: xml-common-0:0.6.3-63.fc40.noarch
>>> Stop pre-install scriptlet: xml-common-0:0.6.3-63.fc40.noarch
[26/54] Installing xml-common-0:0.6.3-6 100% |  26.4 MiB/s |  81.1 KiB |  00m00s
[27/54] Installing emacs-filesystem-1:2 100% | 531.2 KiB/s | 544.0   B |  00m00s
[28/54] Installing graphite2-0:1.3.14-1 100% |  63.2 MiB/s | 194.2 KiB |  00m00s
[29/54] Installing libX11-common-0:1.8. 100% |  49.5 MiB/s |   1.2 MiB |  00m00s
[30/54] Installing libX11-0:1.8.10-2.fc 100% | 183.1 MiB/s |   1.3 MiB |  00m00s
[31/54] Installing libXrender-0:0.9.11- 100% |  50.2 MiB/s |  51.4 KiB |  00m00s
[32/54] Installing libXext-0:1.3.6-1.fc 100% |  89.2 MiB/s |  91.3 KiB |  00m00s
[33/54] Installing cairo-0:1.18.0-3.fc4 100% | 173.2 MiB/s |   1.7 MiB |  00m00s
[34/54] Installing harfbuzz-0:8.5.0-1.f 100% | 168.9 MiB/s |   2.7 MiB |  00m00s
[35/54] Installing freetype-0:2.13.2-5. 100% | 137.4 MiB/s | 844.3 KiB |  00m00s
[36/54] Installing fontconfig-0:2.15.0- 100% | 749.0 KiB/s | 787.2 KiB |  00m01s
>>> Running post-install scriptlet: fontconfig-0:2.15.0-6.fc40.x86_64
>>> Stop post-install scriptlet: fontconfig-0:2.15.0-6.fc40.x86_64
[37/54] Installing cairo-gobject-0:1.18 100% |  35.2 MiB/s |  36.1 KiB |  00m00s
[38/54] Installing libXft-0:2.3.8-6.fc4 100% |  81.1 MiB/s | 166.0 KiB |  00m00s
[39/54] Installing pango-0:1.54.0-1.fc4 100% | 108.7 MiB/s |   1.0 MiB |  00m00s
[40/54] Installing mpdecimal-0:2.5.1-9. 100% |  98.6 MiB/s | 202.0 KiB |  00m00s
[41/54] Installing libb2-0:0.98.1-11.fc 100% |  42.3 MiB/s |  43.3 KiB |  00m00s
[42/54] Installing python3-0:3.12.8-2.f 100% |   3.6 MiB/s |  33.3 KiB |  00m00s
[43/54] Installing python3-libs-0:3.12. 100% | 145.7 MiB/s |  41.7 MiB |  00m00s
[44/54] Installing python3-packaging-0: 100% |  70.3 MiB/s | 431.9 KiB |  00m00s
[45/54] Installing python3-rpm-generato 100% |  81.0 MiB/s |  82.9 KiB |  00m00s
[46/54] Installing libjpeg-turbo-0:3.0. 100% | 152.1 MiB/s | 778.6 KiB |  00m00s
[47/54] Installing gdk-pixbuf2-0:2.42.1 100% | 103.8 MiB/s |   2.5 MiB |  00m00s
[48/54] Installing librsvg2-0:2.57.1-7. 100% | 206.0 MiB/s |   4.1 MiB |  00m00s
[49/54] Installing rsvg-pixbuf-loader-0 100% |  16.1 MiB/s |  16.5 KiB |  00m00s
[50/54] Installing librsvg2-tools-0:2.5 100% | 230.4 MiB/s |   5.1 MiB |  00m00s
[51/54] Installing libappstream-glib-0: 100% | 108.9 MiB/s |   1.4 MiB |  00m00s
[52/54] Installing python3-devel-0:3.12 100% |  77.0 MiB/s |   1.3 MiB |  00m00s
[53/54] Installing desktop-file-utils-0 100% |  56.1 MiB/s | 229.8 KiB |  00m00s
[54/54] Installing javapackages-filesys 100% |  10.2 KiB/s |   5.3 KiB |  00m01s
>>> Running post-transaction scriptlet: fontconfig-0:2.15.0-6.fc40.x86_64
>>> Stop post-transaction scriptlet: fontconfig-0:2.15.0-6.fc40.x86_64
>>> Running trigger-install scriptlet: glibc-common-0:2.39-37.fc40.x86_64
>>> Stop trigger-install scriptlet: glibc-common-0:2.39-37.fc40.x86_64
>>> Running trigger-install scriptlet: info-0:7.1-2.fc40.x86_64
>>> Stop trigger-install scriptlet: info-0:7.1-2.fc40.x86_64
>>> Running trigger-install scriptlet: glib2-0:2.80.3-1.fc40.x86_64
>>> Stop trigger-install scriptlet: glib2-0:2.80.3-1.fc40.x86_64
>>> Running trigger-install scriptlet: shared-mime-info-0:2.3-5.fc40.x86_64
>>> Stop trigger-install scriptlet: shared-mime-info-0:2.3-5.fc40.x86_64
>>> Running trigger-install scriptlet: fontconfig-0:2.15.0-6.fc40.x86_64
>>> Stop trigger-install scriptlet: fontconfig-0:2.15.0-6.fc40.x86_64
>>> Running trigger-install scriptlet: gdk-pixbuf2-0:2.42.10-8.fc40.x86_64
>>> Stop trigger-install scriptlet: gdk-pixbuf2-0:2.42.10-8.fc40.x86_64
>>> Running trigger-install scriptlet: desktop-file-utils-0:0.26-12.fc40.x86_64
>>> Stop trigger-install scriptlet: desktop-file-utils-0:0.26-12.fc40.x86_64
Finish: build setup for pycharm-community-2024.3.2-1.fc40.src.rpm
Start: rpmbuild pycharm-community-2024.3.2-1.fc40.src.rpm
Building target platforms: x86_64
Building for target x86_64
setting SOURCE_DATE_EPOCH=1738022400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.CirU4s
+ umask 022
+ cd /builddir/build/BUILD
+ cd /builddir/build/BUILD
+ rm -rf pycharm-community-2024.3.2
+ /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/pycharm-community-2024.3.2.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd pycharm-community-2024.3.2
+ rm -rf /builddir/build/BUILD/pycharm-community-2024.3.2-SPECPARTS
+ /usr/bin/mkdir -p /builddir/build/BUILD/pycharm-community-2024.3.2-SPECPARTS
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ rm -rf plugins/cwm-plugin plugins/cwm-plugin-projector plugins/marketplace plugins/space
+ '[' -z sP ']'
+ shebang_flags=-kasP
+ /usr/bin/python3 -B /usr/lib/rpm/redhat/pathfix.py -pni /usr/bin/python3 -kasP bin
recursedown('bin')
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.1n5OAH
+ umask 022
+ cd /builddir/build/BUILD
+ '[' /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64 '!=' / ']'
+ rm -rf /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64
++ dirname /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64
+ mkdir -p /builddir/build/BUILDROOT
+ mkdir /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FCFLAGS
+ VALAFLAGS=-g
+ export VALAFLAGS
+ RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn'
+ export RUSTFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes '
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib64:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd pycharm-community-2024.3.2
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/java/pycharm-community
+ cp -arf ./bin ./jbr ./lib ./plugins ./build.txt ./product-info.json /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/java/pycharm-community/
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/pixmaps
+ install -m 0644 -p bin/pycharm.png /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/pixmaps/pycharm-community.png
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/scalable/apps
+ install -m 0644 -p bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/scalable/apps/pycharm-community.svg
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/16x16/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/16x16/apps
+ rsvg-convert -w 16 -h 16 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/16x16/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/16x16/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/16x16/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/22x22/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/22x22/apps
+ rsvg-convert -w 22 -h 22 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/22x22/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/22x22/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/22x22/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/24x24/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/24x24/apps
+ rsvg-convert -w 24 -h 24 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/24x24/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/24x24/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/24x24/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/32x32/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/32x32/apps
+ rsvg-convert -w 32 -h 32 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/32x32/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/32x32/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/32x32/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/48x48/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/48x48/apps
+ rsvg-convert -w 48 -h 48 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/48x48/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/48x48/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/48x48/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/64x64/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/64x64/apps
+ rsvg-convert -w 64 -h 64 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/64x64/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/64x64/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/64x64/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/128x128/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/128x128/apps
+ rsvg-convert -w 128 -h 128 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/128x128/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/128x128/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/128x128/apps/pycharm-community.png
+ for size in 16 22 24 32 48 64 128 256
+ dest=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/256x256/apps
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/256x256/apps
+ rsvg-convert -w 256 -h 256 bin/pycharm.svg -o /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/256x256/apps/pycharm-community.png
+ chmod 0644 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/256x256/apps/pycharm-community.png
+ touch -r bin/pycharm.svg /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/icons/hicolor/256x256/apps/pycharm-community.png
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/metainfo
+ install -m 0644 -p /builddir/build/SOURCES/pycharm-community.metainfo.xml /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/metainfo/pycharm-community.metainfo.xml
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/bin
+ ln -s /usr/share/java/pycharm-community/bin/pycharm /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/bin/pycharm-community
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/applications
+ install -m 0644 -p /builddir/build/SOURCES/pycharm-community.desktop /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/applications/pycharm-community.desktop
+ install -d /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/mime/packages
+ install -m 0644 -p /builddir/build/SOURCES/pycharm-community.xml /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/mime/packages/pycharm-community.xml
+ tail -n +2 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle-2.10.0.py
# pycodestyle.py - Check Python source code formatting, according to
# PEP 8
#
# Copyright (C) 2006-2009 Johann C. Rocholl <johann@rocholl.net>
# Copyright (C) 2009-2014 Florent Xicluna <florent.xicluna@gmail.com>
# Copyright (C) 2014-2016 Ian Lee <ianlee1521@gmail.com>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
r"""
Check Python source code formatting, according to PEP 8.

For usage and a list of options, try this:
$ python pycodestyle.py -h

This program and its regression test suite live here:
https://github.com/pycqa/pycodestyle

Groups of errors and warnings:
E errors
W warnings
100 indentation
200 whitespace
300 blank lines
400 imports
500 line length
600 deprecation
700 statements
900 syntax error
"""
import bisect
import configparser
import inspect
import io
import keyword
import os
import re
import sys
import time
import tokenize
import warnings
from fnmatch import fnmatch
from functools import lru_cache
from optparse import OptionParser

# this is a performance hack.  see https://bugs.python.org/issue43014
if (
        sys.version_info < (3, 10) and
        callable(getattr(tokenize, '_compile', None))
):  # pragma: no cover (<py310)
    tokenize._compile = lru_cache()(tokenize._compile)  # type: ignore

__version__ = '2.10.0'  # patched PY-37054

DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__,.tox'
DEFAULT_IGNORE = 'E121,E123,E126,E226,E24,E704,W503,W504'
try:
    if sys.platform == 'win32':
        USER_CONFIG = os.path.expanduser(r'~\.pycodestyle')
    else:
        USER_CONFIG = os.path.join(
            os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'),
            'pycodestyle'
        )
except ImportError:
    USER_CONFIG = None

PROJECT_CONFIG = ('setup.cfg', 'tox.ini')
TESTSUITE_PATH = os.path.join(os.path.dirname(__file__), 'testsuite')
MAX_LINE_LENGTH = 79
# Number of blank lines between various code parts.
BLANK_LINES_CONFIG = {
    # Top level class and function.
    'top_level': 2,
    # Methods and nested class and function.
    'method': 1,
}
MAX_DOC_LENGTH = 72
INDENT_SIZE = 4
REPORT_FORMAT = {
    'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s',
    'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s',
}

PyCF_ONLY_AST = 1024
SINGLETONS = frozenset(['False', 'None', 'True'])
KEYWORDS = frozenset(keyword.kwlist + ['print', 'async']) - SINGLETONS
UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-'])
ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-', '@'])
WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%'])
ASSIGNMENT_EXPRESSION_OP = [':='] if sys.version_info >= (3, 8) else []
WS_NEEDED_OPERATORS = frozenset([
    '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<>', '<', '>',
    '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '=',
    'and', 'in', 'is', 'or', '->'] +
    ASSIGNMENT_EXPRESSION_OP)
WHITESPACE = frozenset(' \t\xa0')
NEWLINE = frozenset([tokenize.NL, tokenize.NEWLINE])
SKIP_TOKENS = NEWLINE.union([tokenize.INDENT, tokenize.DEDENT])
# ERRORTOKEN is triggered by backticks in Python 3
SKIP_COMMENTS = SKIP_TOKENS.union([tokenize.COMMENT, tokenize.ERRORTOKEN])
BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines']

INDENT_REGEX = re.compile(r'([ \t]*)')
ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b')
DOCSTRING_REGEX = re.compile(r'u?r?["\']')
EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[\[({][ \t]|[ \t][\]}),;:](?!=)')
WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?:  |\t)')
COMPARE_SINGLETON_REGEX = re.compile(r'(\bNone|\bFalse|\bTrue)?\s*([=!]=)'
                                     r'\s*(?(1)|(None|False|True))\b')
COMPARE_NEGATIVE_REGEX = re.compile(r'\b(?<!is\s)(not)\s+[^][)(}{ ]+\s+'
                                    r'(in|is)\s')
COMPARE_TYPE_REGEX = re.compile(r'(?:[=!]=|is(?:\s+not)?)\s+type(?:s.\w+Type'
                                r'|\s*\(\s*([^)]*[^ )])\s*\))')
KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS))
OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+|:=)(\s*)')
LAMBDA_REGEX = re.compile(r'\blambda\b')
HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$')
STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\b')
STARTSWITH_TOP_LEVEL_REGEX = re.compile(r'^(async\s+def\s+|def\s+|class\s+|@)')
STARTSWITH_INDENT_STATEMENT_REGEX = re.compile(
    r'^\s*({})\b'.format('|'.join(s.replace(' ', r'\s+') for s in (
        'def', 'async def',
        'for', 'async for',
        'if', 'elif', 'else',
        'try', 'except', 'finally',
        'with', 'async with',
        'class',
        'while',
    )))
)
DUNDER_REGEX = re.compile(r"^__([^\s]+)__(?::\s*[a-zA-Z.0-9_\[\]\"]+)? = ")
BLANK_EXCEPT_REGEX = re.compile(r"except\s*:")

_checks = {'physical_line': {}, 'logical_line': {}, 'tree': {}}


def _get_parameters(function):
    return [parameter.name
            for parameter
            in inspect.signature(function).parameters.values()
            if parameter.kind == parameter.POSITIONAL_OR_KEYWORD]


def register_check(check, codes=None):
    """Register a new check object."""
    def _add_check(check, kind, codes, args):
        if check in _checks[kind]:
            _checks[kind][check][0].extend(codes or [])
        else:
            _checks[kind][check] = (codes or [''], args)
    if inspect.isfunction(check):
        args = _get_parameters(check)
        if args and args[0] in ('physical_line', 'logical_line'):
            if codes is None:
                codes = ERRORCODE_REGEX.findall(check.__doc__ or '')
            _add_check(check, args[0], codes, args)
    elif inspect.isclass(check):
        if _get_parameters(check.__init__)[:2] == ['self', 'tree']:
            _add_check(check, 'tree', codes, None)
    return check


########################################################################
# Plugins (check functions) for physical lines
########################################################################

@register_check
def tabs_or_spaces(physical_line, indent_char):
    r"""Never mix tabs and spaces.

    The most popular way of indenting Python is with spaces only.  The
    second-most popular way is with tabs only.  Code indented with a
    mixture of tabs and spaces should be converted to using spaces
    exclusively.  When invoking the Python command line interpreter with
    the -t option, it issues warnings about code that illegally mixes
    tabs and spaces.  When using -tt these warnings become errors.
    These options are highly recommended!

    Okay: if a == 0:\n    a = 1\n    b = 1
    E101: if a == 0:\n        a = 1\n\tb = 1
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    for offset, char in enumerate(indent):
        if char != indent_char:
            return offset, "E101 indentation contains mixed spaces and tabs"


@register_check
def tabs_obsolete(physical_line):
    r"""On new projects, spaces-only are strongly recommended over tabs.

    Okay: if True:\n    return
    W191: if True:\n\treturn
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    if '\t' in indent:
        return indent.index('\t'), "W191 indentation contains tabs"


@register_check
def trailing_whitespace(physical_line):
    r"""Trailing whitespace is superfluous.

    The warning returned varies on whether the line itself is blank,
    for easier filtering for those who want to indent their blank lines.

    Okay: spam(1)\n#
    W291: spam(1) \n#
    W293: class Foo(object):\n    \n    bang = 12
    """
    physical_line = physical_line.rstrip('\n')    # chr(10), newline
    physical_line = physical_line.rstrip('\r')    # chr(13), carriage return
    physical_line = physical_line.rstrip('\x0c')  # chr(12), form feed, ^L
    stripped = physical_line.rstrip(' \t\v')
    if physical_line != stripped:
        if stripped:
            return len(stripped), "W291 trailing whitespace"
        else:
            return 0, "W293 blank line contains whitespace"


@register_check
def trailing_blank_lines(physical_line, lines, line_number, total_lines):
    r"""Trailing blank lines are superfluous.

    Okay: spam(1)
    W391: spam(1)\n

    However the last line should end with a new line (warning W292).
    """
    if line_number == total_lines:
        stripped_last_line = physical_line.rstrip('\r\n')
        if physical_line and not stripped_last_line:
            return 0, "W391 blank line at end of file"
        if stripped_last_line == physical_line:
            return len(lines[-1]), "W292 no newline at end of file"


@register_check
def maximum_line_length(physical_line, max_line_length, multiline,
                        line_number, noqa):
    r"""Limit all lines to a maximum of 79 characters.

    There are still many devices around that are limited to 80 character
    lines; plus, limiting windows to 80 characters makes it possible to
    have several windows side-by-side.  The default wrapping on such
    devices looks ugly.  Therefore, please limit all lines to a maximum
    of 79 characters. For flowing long blocks of text (docstrings or
    comments), limiting the length to 72 characters is recommended.

    Reports error E501.
    """
    line = physical_line.rstrip()
    length = len(line)
    if length > max_line_length and not noqa:
        # Special case: ignore long shebang lines.
        if line_number == 1 and line.startswith('#!'):
            return
        # Special case for long URLs in multi-line docstrings or
        # comments, but still report the error when the 72 first chars
        # are whitespaces.
        chunks = line.split()
        if ((len(chunks) == 1 and multiline) or
            (len(chunks) == 2 and chunks[0] == '#')) and \
                len(line) - len(chunks[-1]) < max_line_length - 7:
            return
        if length > max_line_length:
            return (max_line_length, "E501 line too long "
                    "(%d > %d characters)" % (length, max_line_length))


########################################################################
# Plugins (check functions) for logical lines
########################################################################


def _is_one_liner(logical_line, indent_level, lines, line_number):
    if not STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        return False

    line_idx = line_number - 1

    if line_idx < 1:
        prev_indent = 0
    else:
        prev_indent = expand_indent(lines[line_idx - 1])

    if prev_indent > indent_level:
        return False

    while line_idx < len(lines):
        line = lines[line_idx].strip()
        if not line.startswith('@') and STARTSWITH_TOP_LEVEL_REGEX.match(line):
            break
        else:
            line_idx += 1
    else:
        return False  # invalid syntax: EOF while searching for def/class

    next_idx = line_idx + 1
    while next_idx < len(lines):
        if lines[next_idx].strip():
            break
        else:
            next_idx += 1
    else:
        return True  # line is last in the file

    return expand_indent(lines[next_idx]) <= indent_level


@register_check
def blank_lines(logical_line, blank_lines, indent_level, line_number,
                blank_before, previous_logical,
                previous_unindented_logical_line, previous_indent_level,
                lines):
    r"""Separate top-level function and class definitions with two blank
    lines.

    Method definitions inside a class are separated by a single blank
    line.

    Extra blank lines may be used (sparingly) to separate groups of
    related functions.  Blank lines may be omitted between a bunch of
    related one-liners (e.g. a set of dummy implementations).

    Use blank lines in functions, sparingly, to indicate logical
    sections.

    Okay: def a():\n    pass\n\n\ndef b():\n    pass
    Okay: def a():\n    pass\n\n\nasync def b():\n    pass
    Okay: def a():\n    pass\n\n\n# Foo\n# Bar\n\ndef b():\n    pass
    Okay: default = 1\nfoo = 1
    Okay: classify = 1\nfoo = 1

    E301: class Foo:\n    b = 0\n    def bar():\n        pass
    E302: def a():\n    pass\n\ndef b(n):\n    pass
    E302: def a():\n    pass\n\nasync def b(n):\n    pass
    E303: def a():\n    pass\n\n\n\ndef b(n):\n    pass
    E303: def a():\n\n\n\n    pass
    E304: @decorator\n\ndef a():\n    pass
    E305: def a():\n    pass\na()
    E306: def a():\n    def b():\n        pass\n    def c():\n        pass
    """  # noqa
    top_level_lines = BLANK_LINES_CONFIG['top_level']
    method_lines = BLANK_LINES_CONFIG['method']

    if not previous_logical and blank_before < top_level_lines:
        return  # Don't expect blank lines before the first line
    if previous_logical.startswith('@'):
        if blank_lines:
            yield 0, "E304 blank lines found after function decorator"
    elif (blank_lines > top_level_lines or
            (indent_level and blank_lines == method_lines + 1)
          ):
        yield 0, "E303 too many blank lines (%d)" % blank_lines
    elif STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        # allow a group of one-liners
        if (
            _is_one_liner(logical_line, indent_level, lines, line_number) and
            blank_before == 0
        ):
            return
        if indent_level:
            if not (blank_before == method_lines or
                    previous_indent_level < indent_level or
                    DOCSTRING_REGEX.match(previous_logical)
                    ):
                ancestor_level = indent_level
                nested = False
                # Search backwards for a def ancestor or tree root
                # (top level).
                for line in lines[line_number - top_level_lines::-1]:
                    if line.strip() and expand_indent(line) < ancestor_level:
                        ancestor_level = expand_indent(line)
                        nested = STARTSWITH_DEF_REGEX.match(line.lstrip())
                        if nested or ancestor_level == 0:
                            break
                if nested:
                    yield 0, "E306 expected %s blank line before a " \
                        "nested definition, found 0" % (method_lines,)
                else:
                    yield 0, "E301 expected {} blank line, found 0".format(
                        method_lines)
        elif blank_before != top_level_lines:
            yield 0, "E302 expected %s blank lines, found %d" % (
                top_level_lines, blank_before)
    elif (logical_line and
            not indent_level and
            blank_before != top_level_lines and
            previous_unindented_logical_line.startswith(('def ', 'class '))
          ):
        yield 0, "E305 expected %s blank lines after " \
            "class or function definition, found %d" % (
                top_level_lines, blank_before)


@register_check
def extraneous_whitespace(logical_line):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in these situations:
    - Immediately inside parentheses, brackets or braces.
    - Immediately before a comma, semicolon, or colon.

    Okay: spam(ham[1], {eggs: 2})
    E201: spam( ham[1], {eggs: 2})
    E201: spam(ham[ 1], {eggs: 2})
    E201: spam(ham[1], { eggs: 2})
    E202: spam(ham[1], {eggs: 2} )
    E202: spam(ham[1 ], {eggs: 2})
    E202: spam(ham[1], {eggs: 2 })

    E203: if x == 4: print x, y; x, y = y , x
    E203: if x == 4: print x, y ; x, y = y, x
    E203: if x == 4 : print x, y; x, y = y, x
    """
    line = logical_line
    for match in EXTRANEOUS_WHITESPACE_REGEX.finditer(line):
        text = match.group()
        char = text.strip()
        found = match.start()
        if text[-1].isspace():
            # assert char in '([{'
            yield found + 1, "E201 whitespace after '%s'" % char
        elif line[found - 1] != ',':
            code = ('E202' if char in '}])' else 'E203')  # if char in ',;:'
            yield found, f"{code} whitespace before '{char}'"


@register_check
def whitespace_around_keywords(logical_line):
    r"""Avoid extraneous whitespace around keywords.

    Okay: True and False
    E271: True and  False
    E272: True  and False
    E273: True and\tFalse
    E274: True\tand False
    """
    for match in KEYWORD_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E274 tab before keyword"
        elif len(before) > 1:
            yield match.start(1), "E272 multiple spaces before keyword"

        if '\t' in after:
            yield match.start(2), "E273 tab after keyword"
        elif len(after) > 1:
            yield match.start(2), "E271 multiple spaces after keyword"


@register_check
def missing_whitespace_after_keyword(logical_line, tokens):
    r"""Keywords should be followed by whitespace.

    Okay: from foo import (bar, baz)
    E275: from foo import(bar, baz)
    E275: from importable.module import(bar, baz)
    E275: if(foo): bar
    """
    for tok0, tok1 in zip(tokens, tokens[1:]):
        # This must exclude the True/False/None singletons, which can
        # appear e.g. as "if x is None:", and async/await, which were
        # valid identifier names in old Python versions.
        if (tok0.end == tok1.start and
                keyword.iskeyword(tok0.string) and
                tok0.string not in SINGLETONS and
                tok0.string not in ('async', 'await') and
                not (tok0.string == 'except' and tok1.string == '*') and
                not (tok0.string == 'yield' and tok1.string == ')') and
                tok1.string not in ':\n'):
            yield tok0.end, "E275 missing whitespace after keyword"


@register_check
def missing_whitespace(logical_line):
    r"""Each comma, semicolon or colon should be followed by whitespace.

    Okay: [a, b]
    Okay: (3,)
    Okay: a[3,] = 1
    Okay: a[1:4]
    Okay: a[:4]
    Okay: a[1:]
    Okay: a[1:4:2]
    E231: ['a','b']
    E231: foo(bar,baz)
    E231: [{'a':'b'}]
    """
    line = logical_line
    for index in range(len(line) - 1):
        char = line[index]
        next_char = line[index + 1]
        if char in ',;:' and next_char not in WHITESPACE:
            before = line[:index]
            if char == ':' and before.count('[') > before.count(']') and \
                    before.rfind('{') < before.rfind('['):
                continue  # Slice syntax, no space required
            if char == ',' and next_char in ')]':
                continue  # Allow tuple with only one element: (3,)
            if char == ':' and next_char == '=' and sys.version_info >= (3, 8):
                continue  # Allow assignment expression
            yield index, "E231 missing whitespace after '%s'" % char


@register_check
def indentation(logical_line, previous_logical, indent_char,
                indent_level, previous_indent_level,
                indent_size):
    r"""Use indent_size (PEP8 says 4) spaces per indentation level.

    For really old code that you don't want to mess up, you can continue
    to use 8-space tabs.

    Okay: a = 1
    Okay: if a == 0:\n    a = 1
    E111:   a = 1
    E114:   # a = 1

    Okay: for item in items:\n    pass
    E112: for item in items:\npass
    E115: for item in items:\n# Hi\n    pass

    Okay: a = 1\nb = 2
    E113: a = 1\n    b = 2
    E116: a = 1\n    # b = 2
    """
    c = 0 if logical_line else 3
    tmpl = "E11%d %s" if logical_line else "E11%d %s (comment)"
    if indent_level % indent_size:
        yield 0, tmpl % (
            1 + c,
            "indentation is not a multiple of " + str(indent_size),
        )
    indent_expect = previous_logical.endswith(':')
    if indent_expect and indent_level <= previous_indent_level:
        yield 0, tmpl % (2 + c, "expected an indented block")
    elif not indent_expect and indent_level > previous_indent_level:
        yield 0, tmpl % (3 + c, "unexpected indentation")

    if indent_expect:
        expected_indent_amount = 8 if indent_char == '\t' else 4
        expected_indent_level = previous_indent_level + expected_indent_amount
        if indent_level > expected_indent_level:
            yield 0, tmpl % (7, 'over-indented')


@register_check
def continued_indentation(logical_line, tokens, indent_level, hang_closing,
                          indent_char, indent_size, noqa, verbose):
    r"""Continuation lines indentation.

    Continuation lines should align wrapped elements either vertically
    using Python's implicit line joining inside parentheses, brackets
    and braces, or using a hanging indent.

    When using a hanging indent these considerations should be applied:
    - there should be no arguments on the first line, and
    - further indentation should be used to clearly distinguish itself
      as a continuation line.

    Okay: a = (\n)
    E123: a = (\n    )

    Okay: a = (\n    42)
    E121: a = (\n   42)
    E122: a = (\n42)
    E123: a = (\n    42\n    )
    E124: a = (24,\n     42\n)
    E125: if (\n    b):\n    pass
    E126: a = (\n        42)
    E127: a = (24,\n      42)
    E128: a = (24,\n    42)
    E129: if (a or\n    b):\n    pass
    E131: a = (\n    42\n 24)
    """
    first_row = tokens[0][2][0]
    nrows = 1 + tokens[-1][2][0] - first_row
    if noqa or nrows == 1:
        return

    # indent_next tells us whether the next block is indented; assuming
    # that it is indented by 4 spaces, then we should not allow 4-space
    # indents on the final continuation line; in turn, some other
    # indents are allowed to have an extra 4 spaces.
    indent_next = logical_line.endswith(':')

    row = depth = 0
    valid_hangs = (indent_size,) if indent_char != '\t' \
        else (indent_size, indent_size * 2)
    # remember how many brackets were opened on each line
    parens = [0] * nrows
    # relative indents of physical lines
    rel_indent = [0] * nrows
    # for each depth, collect a list of opening rows
    open_rows = [[0]]
    # for each depth, memorize the hanging indentation
    hangs = [None]
    # visual indents
    indent_chances = {}
    last_indent = tokens[0][2]
    visual_indent = None
    last_token_multiline = False
    # for each depth, memorize the visual indent column
    indent = [last_indent[1]]
    if verbose >= 3:
        print(">>> " + tokens[0][4].rstrip())

    for token_type, text, start, end, line in tokens:

        newline = row < start[0] - first_row
        if newline:
            row = start[0] - first_row
            newline = not last_token_multiline and token_type not in NEWLINE

        if newline:
            # this is the beginning of a continuation line.
            last_indent = start
            if verbose >= 3:
                print("... " + line.rstrip())

            # record the initial indent.
            rel_indent[row] = expand_indent(line) - indent_level

            # identify closing bracket
            close_bracket = (token_type == tokenize.OP and text in ']})')

            # is the indent relative to an opening bracket line?
            for open_row in reversed(open_rows[depth]):
                hang = rel_indent[row] - rel_indent[open_row]
                hanging_indent = hang in valid_hangs
                if hanging_indent:
                    break
            if hangs[depth]:
                hanging_indent = (hang == hangs[depth])
            # is there any chance of visual indent?
            visual_indent = (not close_bracket and hang > 0 and
                             indent_chances.get(start[1]))

            if close_bracket and indent[depth]:
                # closing bracket for visual indent
                if start[1] != indent[depth]:
                    yield (start, "E124 closing bracket does not match "
                           "visual indentation")
            elif close_bracket and not hang:
                # closing bracket matches indentation of opening
                # bracket's line
                if hang_closing:
                    yield start, "E133 closing bracket is missing indentation"
            elif indent[depth] and start[1] < indent[depth]:
                if visual_indent is not True:
                    # visual indent is broken
                    yield (start, "E128 continuation line "
                           "under-indented for visual indent")
            elif hanging_indent or (indent_next and
                                    rel_indent[row] == 2 * indent_size):
                # hanging indent is verified
                if close_bracket and not hang_closing:
                    yield (start, "E123 closing bracket does not match "
                           "indentation of opening bracket's line")
                hangs[depth] = hang
            elif visual_indent is True:
                # visual indent is verified
                indent[depth] = start[1]
            elif visual_indent in (text, str):
                # ignore token lined up with matching one from a
                # previous line
                pass
            else:
                # indent is broken
                if hang <= 0:
                    error = "E122", "missing indentation or outdented"
                elif indent[depth]:
                    error = "E127", "over-indented for visual indent"
                elif not close_bracket and hangs[depth]:
                    error = "E131", "unaligned for hanging indent"
                else:
                    hangs[depth] = hang
                    if hang > indent_size:
                        error = "E126", "over-indented for hanging indent"
                    else:
                        error = "E121", "under-indented for hanging indent"
                yield start, "%s continuation line %s" % error

        # look for visual indenting
        if (parens[row] and
                token_type not in (tokenize.NL, tokenize.COMMENT) and
                not indent[depth]):
            indent[depth] = start[1]
            indent_chances[start[1]] = True
            if verbose >= 4:
                print(f"bracket depth {depth} indent to {start[1]}")
        # deal with implicit string concatenation
        elif (token_type in (tokenize.STRING, tokenize.COMMENT) or
              text in ('u', 'ur', 'b', 'br')):
            indent_chances[start[1]] = str
        # visual indent after assert/raise/with
        elif not row and not depth and text in ["assert", "raise", "with"]:
            indent_chances[end[1] + 1] = True
        # special case for the "if" statement because len("if (") == 4
        elif not indent_chances and not row and not depth and text == 'if':
            indent_chances[end[1] + 1] = True
        elif text == ':' and line[end[1]:].isspace():
            open_rows[depth].append(row)

        # keep track of bracket depth
        if token_type == tokenize.OP:
            if text in '([{':
                depth += 1
                indent.append(0)
                hangs.append(None)
                if len(open_rows) == depth:
                    open_rows.append([])
                open_rows[depth].append(row)
                parens[row] += 1
                if verbose >= 4:
                    print("bracket depth %s seen, col %s, visual min = %s" %
                          (depth, start[1], indent[depth]))
            elif text in ')]}' and depth > 0:
                # parent indents should not be more than this one
                prev_indent = indent.pop() or last_indent[1]
                hangs.pop()
                for d in range(depth):
                    if indent[d] > prev_indent:
                        indent[d] = 0
                for ind in list(indent_chances):
                    if ind >= prev_indent:
                        del indent_chances[ind]
                del open_rows[depth + 1:]
                depth -= 1
                if depth:
                    indent_chances[indent[depth]] = True
                for idx in range(row, -1, -1):
                    if parens[idx]:
                        parens[idx] -= 1
                        break
            assert len(indent) == depth + 1
            if start[1] not in indent_chances:
                # allow lining up tokens
                indent_chances[start[1]] = text

        last_token_multiline = (start[0] != end[0])
        if last_token_multiline:
            rel_indent[end[0] - first_row] = rel_indent[row]

    if indent_next and expand_indent(line) == indent_level + indent_size:
        pos = (start[0], indent[0] + indent_size)
        if visual_indent:
            code = "E129 visually indented line"
        else:
            code = "E125 continuation line"
        yield pos, "%s with same indent as next logical line" % code


@register_check
def whitespace_before_parameters(logical_line, tokens):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in the following situations:
    - before the open parenthesis that starts the argument list of a
      function call.
    - before the open parenthesis that starts an indexing or slicing.

    Okay: spam(1)
    E211: spam (1)

    Okay: dict['key'] = list[index]
    E211: dict ['key'] = list[index]
    E211: dict['key'] = list [index]
    """
    prev_type, prev_text, __, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, __ = tokens[index]
        if (
            token_type == tokenize.OP and
            text in '([' and
            start != prev_end and
            (prev_type == tokenize.NAME or prev_text in '}])') and
            # Syntax "class A (B):" is allowed, but avoid it
            (index < 2 or tokens[index - 2][1] != 'class') and
            # Allow "return (a.foo for a in range(5))"
            not keyword.iskeyword(prev_text) and
            # 'match' and 'case' are only soft keywords
            (
                sys.version_info < (3, 9) or
                not keyword.issoftkeyword(prev_text)
            )
        ):
            yield prev_end, "E211 whitespace before '%s'" % text
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_operator(logical_line):
    r"""Avoid extraneous whitespace around an operator.

    Okay: a = 12 + 3
    E221: a = 4  + 5
    E222: a = 4 +  5
    E223: a = 4\t+ 5
    E224: a = 4 +\t5
    """
    for match in OPERATOR_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E223 tab before operator"
        elif len(before) > 1:
            yield match.start(1), "E221 multiple spaces before operator"

        if '\t' in after:
            yield match.start(2), "E224 tab after operator"
        elif len(after) > 1:
            yield match.start(2), "E222 multiple spaces after operator"


@register_check
def missing_whitespace_around_operator(logical_line, tokens):
    r"""Surround operators with a single space on either side.

    - Always surround these binary operators with a single space on
      either side: assignment (=), augmented assignment (+=, -= etc.),
      comparisons (==, <, >, !=, <=, >=, in, not in, is, is not),
      Booleans (and, or, not).

    - If operators with different priorities are used, consider adding
      whitespace around the operators with the lowest priorities.

    Okay: i = i + 1
    Okay: submitted += 1
    Okay: x = x * 2 - 1
    Okay: hypot2 = x * x + y * y
    Okay: c = (a + b) * (a - b)
    Okay: foo(bar, key='word', *args, **kwargs)
    Okay: alpha[:-i]

    E225: i=i+1
    E225: submitted +=1
    E225: x = x /2 - 1
    E225: z = x **y
    E225: z = 1and 1
    E226: c = (a+b) * (a-b)
    E226: hypot2 = x*x + y*y
    E227: c = a|b
    E228: msg = fmt%(errno, errmsg)
    """
    parens = 0
    need_space = False
    prev_type = tokenize.OP
    prev_text = prev_end = None
    operator_types = (tokenize.OP, tokenize.NAME)
    for token_type, text, start, end, line in tokens:
        if token_type in SKIP_COMMENTS:
            continue
        if text in ('(', 'lambda'):
            parens += 1
        elif text == ')':
            parens -= 1
        if need_space:
            if start != prev_end:
                # Found a (probably) needed space
                if need_space is not True and not need_space[1]:
                    yield (need_space[0],
                           "E225 missing whitespace around operator")
                need_space = False
            elif text == '>' and prev_text in ('<', '-'):
                # Tolerate the "<>" operator, even if running Python 3
                # Deal with Python 3's annotated return value "->"
                pass
            elif (
                    # def f(a, /, b):
                    #           ^
                    # def f(a, b, /):
                    #              ^
                    # f = lambda a, /:
                    #                ^
                    prev_text == '/' and text in {',', ')', ':'} or
                    # def f(a, b, /):
                    #               ^
                    prev_text == ')' and text == ':'
            ):
                # Tolerate the "/" operator in function definition
                # For more info see PEP570
                pass
            else:
                if need_space is True or need_space[1]:
                    # A needed trailing space was not found
                    yield prev_end, "E225 missing whitespace around operator"
                elif prev_text != '**':
                    code, optype = 'E226', 'arithmetic'
                    if prev_text == '%':
                        code, optype = 'E228', 'modulo'
                    elif prev_text not in ARITHMETIC_OP:
                        code, optype = 'E227', 'bitwise or shift'
                    yield (need_space[0], "%s missing whitespace "
                           "around %s operator" % (code, optype))
                need_space = False
        elif token_type in operator_types and prev_end is not None:
            if text == '=' and parens:
                # Allow keyword args or defaults: foo(bar=None).
                pass
            elif text in WS_NEEDED_OPERATORS:
                need_space = True
            elif text in UNARY_OPERATORS:
                # Check if the operator is used as a binary operator
                # Allow unary operators: -123, -x, +1.
                # Allow argument unpacking: foo(*args, **kwargs).
                if prev_type == tokenize.OP and prev_text in '}])' or (
                    prev_type != tokenize.OP and
                    prev_text not in KEYWORDS and (
                        sys.version_info < (3, 9) or
                        not keyword.issoftkeyword(prev_text)
                    )
                ):
                    need_space = None
            elif text in WS_OPTIONAL_OPERATORS:
                need_space = None

            if need_space is None:
                # Surrounding space is optional, but ensure that
                # trailing space matches opening space
                need_space = (prev_end, start != prev_end)
            elif need_space and start == prev_end:
                # A needed opening space was not found
                yield prev_end, "E225 missing whitespace around operator"
                need_space = False
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_comma(logical_line):
    r"""Avoid extraneous whitespace after a comma or a colon.

    Note: these checks are disabled by default

    Okay: a = (1, 2)
    E241: a = (1,  2)
    E242: a = (1,\t2)
    """
    line = logical_line
    for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line):
        found = m.start() + 1
        if '\t' in m.group():
            yield found, "E242 tab after '%s'" % m.group()[0]
        else:
            yield found, "E241 multiple spaces after '%s'" % m.group()[0]


@register_check
def whitespace_around_named_parameter_equals(logical_line, tokens):
    r"""Don't use spaces around the '=' sign in function arguments.

    Don't use spaces around the '=' sign when used to indicate a
    keyword argument or a default parameter value, except when
    using a type annotation.

    Okay: def complex(real, imag=0.0):
    Okay: return magic(r=real, i=imag)
    Okay: boolean(a == b)
    Okay: boolean(a != b)
    Okay: boolean(a <= b)
    Okay: boolean(a >= b)
    Okay: def foo(arg: int = 42):
    Okay: async def foo(arg: int = 42):

    E251: def complex(real, imag = 0.0):
    E251: return magic(r = real, i = imag)
    E252: def complex(real, image: float=0.0):
    """
    parens = 0
    no_space = False
    require_space = False
    prev_end = None
    annotated_func_arg = False
    in_def = bool(STARTSWITH_DEF_REGEX.match(logical_line))

    message = "E251 unexpected spaces around keyword / parameter equals"
    missing_message = "E252 missing whitespace around parameter equals"

    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.NL:
            continue
        if no_space:
            no_space = False
            if start != prev_end:
                yield (prev_end, message)
        if require_space:
            require_space = False
            if start == prev_end:
                yield (prev_end, missing_message)
        if token_type == tokenize.OP:
            if text in '([':
                parens += 1
            elif text in ')]':
                parens -= 1
            elif in_def and text == ':' and parens == 1:
                annotated_func_arg = True
            elif parens == 1 and text == ',':
                annotated_func_arg = False
            elif parens and text == '=':
                if annotated_func_arg and parens == 1:
                    require_space = True
                    if start == prev_end:
                        yield (prev_end, missing_message)
                else:
                    no_space = True
                    if start != prev_end:
                        yield (prev_end, message)
            if not parens:
                annotated_func_arg = False

        prev_end = end


@register_check
def whitespace_before_comment(logical_line, tokens):
    """Separate inline comments by at least two spaces.

    An inline comment is a comment on the same line as a statement.
    Inline comments should be separated by at least two spaces from the
    statement. They should start with a # and a single space.

    Each line of a block comment starts with a # and one or multiple
    spaces as there can be indented text inside the comment.

    Okay: x = x + 1  # Increment x
    Okay: x = x + 1    # Increment x
    Okay: # Block comments:
    Okay: #  - Block comment list
    Okay: # \xa0- Block comment list
    E261: x = x + 1 # Increment x
    E262: x = x + 1  #Increment x
    E262: x = x + 1  #  Increment x
    E262: x = x + 1  # \xa0Increment x
    E265: #Block comment
    E266: ### Block comment
    """
    prev_end = (0, 0)
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            inline_comment = line[:start[1]].strip()
            if inline_comment:
                if prev_end[0] == start[0] and start[1] < prev_end[1] + 2:
                    yield (prev_end,
                           "E261 at least two spaces before inline comment")
            symbol, sp, comment = text.partition(' ')
            bad_prefix = symbol not in '#:' and (symbol.lstrip('#')[:1] or '#')
            if inline_comment:
                if bad_prefix or comment[:1] in WHITESPACE:
                    yield start, "E262 inline comment should start with '# '"
            elif bad_prefix and (bad_prefix != '!' or start[0] > 1):
                if bad_prefix != '#':
                    yield start, "E265 block comment should start with '# '"
                elif comment:
                    yield start, "E266 too many leading '#' for block comment"
        elif token_type != tokenize.NL:
            prev_end = end


@register_check
def imports_on_separate_lines(logical_line):
    r"""Place imports on separate lines.

    Okay: import os\nimport sys
    E401: import sys, os

    Okay: from subprocess import Popen, PIPE
    Okay: from myclas import MyClass
    Okay: from foo.bar.yourclass import YourClass
    Okay: import myclass
    Okay: import foo.bar.yourclass
    """
    line = logical_line
    if line.startswith('import '):
        found = line.find(',')
        if -1 < found and ';' not in line[:found]:
            yield found, "E401 multiple imports on one line"


@register_check
def module_imports_on_top_of_file(
        logical_line, indent_level, checker_state, noqa):
    r"""Place imports at the top of the file.

    Always put imports at the top of the file, just after any module
    comments and docstrings, and before module globals and constants.

    Okay: import os
    Okay: # this is a comment\nimport os
    Okay: '''this is a module docstring'''\nimport os
    Okay: r'''this is a module docstring'''\nimport os
    Okay:
    try:\n\timport x\nexcept ImportError:\n\tpass\nelse:\n\tpass\nimport y
    Okay:
    try:\n\timport x\nexcept ImportError:\n\tpass\nfinally:\n\tpass\nimport y
    E402: a=1\nimport os
    E402: 'One string'\n"Two string"\nimport os
    E402: a=1\nfrom sys import x

    Okay: if x:\n    import os
    """  # noqa
    def is_string_literal(line):
        if line[0] in 'uUbB':
            line = line[1:]
        if line and line[0] in 'rR':
            line = line[1:]
        return line and (line[0] == '"' or line[0] == "'")

    allowed_keywords = (
        'try', 'except', 'else', 'finally', 'with', 'if', 'elif')

    if indent_level:  # Allow imports in conditional statement/function
        return
    if not logical_line:  # Allow empty lines or comments
        return
    if noqa:
        return
    line = logical_line
    if line.startswith('import ') or line.startswith('from '):
        if checker_state.get('seen_non_imports', False):
            yield 0, "E402 module level import not at top of file"
    elif re.match(DUNDER_REGEX, line):
        return
    elif any(line.startswith(kw) for kw in allowed_keywords):
        # Allow certain keywords intermixed with imports in order to
        # support conditional or filtered importing
        return
    elif is_string_literal(line):
        # The first literal is a docstring, allow it. Otherwise, report
        # error.
        if checker_state.get('seen_docstring', False):
            checker_state['seen_non_imports'] = True
        else:
            checker_state['seen_docstring'] = True
    else:
        checker_state['seen_non_imports'] = True


@register_check
def compound_statements(logical_line):
    r"""Compound statements (on the same line) are generally
    discouraged.

    While sometimes it's okay to put an if/for/while with a small body
    on the same line, never do this for multi-clause statements.
    Also avoid folding such long lines!

    Always use a def statement instead of an assignment statement that
    binds a lambda expression directly to a name.

    Okay: if foo == 'blah':\n    do_blah_thing()
    Okay: do_one()
    Okay: do_two()
    Okay: do_three()

    E701: if foo == 'blah': do_blah_thing()
    E701: for x in lst: total += x
    E701: while t < 10: t = delay()
    E701: if foo == 'blah': do_blah_thing()
    E701: else: do_non_blah_thing()
    E701: try: something()
    E701: finally: cleanup()
    E701: if foo == 'blah': one(); two(); three()
    E702: do_one(); do_two(); do_three()
    E703: do_four();  # useless semicolon
    E704: def f(x): return 2*x
    E731: f = lambda x: 2*x
    """
    line = logical_line
    last_char = len(line) - 1
    found = line.find(':')
    prev_found = 0
    counts = {char: 0 for char in '{}[]()'}
    while -1 < found < last_char:
        update_counts(line[prev_found:found], counts)
        if ((counts['{'] <= counts['}'] and   # {'a': 1} (dict)
             counts['['] <= counts[']'] and   # [1:2] (slice)
             counts['('] <= counts[')']) and  # (annotation)
            not (sys.version_info >= (3, 8) and
                 line[found + 1] == '=')):  # assignment expression
            lambda_kw = LAMBDA_REGEX.search(line, 0, found)
            if lambda_kw:
                before = line[:lambda_kw.start()].rstrip()
                if before[-1:] == '=' and before[:-1].strip().isidentifier():
                    yield 0, ("E731 do not assign a lambda expression, use a "
                              "def")
                break
            if STARTSWITH_DEF_REGEX.match(line):
                yield 0, "E704 multiple statements on one line (def)"
            elif STARTSWITH_INDENT_STATEMENT_REGEX.match(line):
                yield found, "E701 multiple statements on one line (colon)"
        prev_found = found
        found = line.find(':', found + 1)
    found = line.find(';')
    while -1 < found:
        if found < last_char:
            yield found, "E702 multiple statements on one line (semicolon)"
        else:
            yield found, "E703 statement ends with a semicolon"
        found = line.find(';', found + 1)


@register_check
def explicit_line_join(logical_line, tokens):
    r"""Avoid explicit line join between brackets.

    The preferred way of wrapping long lines is by using Python's
    implied line continuation inside parentheses, brackets and braces.
    Long lines can be broken over multiple lines by wrapping expressions
    in parentheses.  These should be used in preference to using a
    backslash for line continuation.

    E502: aaa = [123, \\n       123]
    E502: aaa = ("bbb " \\n       "ccc")

    Okay: aaa = [123,\n       123]
    Okay: aaa = ("bbb "\n       "ccc")
    Okay: aaa = "bbb " \\n    "ccc"
    Okay: aaa = 123  # \\
    """
    prev_start = prev_end = parens = 0
    comment = False
    backslash = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            comment = True
        if start[0] != prev_start and parens and backslash and not comment:
            yield backslash, "E502 the backslash is redundant between brackets"
        if end[0] != prev_end:
            if line.rstrip('\r\n').endswith('\\'):
                backslash = (end[0], len(line.splitlines()[-1]) - 1)
            else:
                backslash = None
            prev_start = prev_end = end[0]
        else:
            prev_start = start[0]
        if token_type == tokenize.OP:
            if text in '([{':
                parens += 1
            elif text in ')]}':
                parens -= 1


# The % character is strictly speaking a binary operator, but the
# common usage seems to be to put it next to the format parameters,
# after a line break.
_SYMBOLIC_OPS = frozenset("()[]{},:.;@=%~") | frozenset(("...",))


def _is_binary_operator(token_type, text):
    return (
        token_type == tokenize.OP or
        text in {'and', 'or'}
    ) and (
        text not in _SYMBOLIC_OPS
    )


def _break_around_binary_operators(tokens):
    """Private function to reduce duplication.

    This factors out the shared details between
    :func:`break_before_binary_operator` and
    :func:`break_after_binary_operator`.
    """
    line_break = False
    unary_context = True
    # Previous non-newline token types and text
    previous_token_type = None
    previous_text = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            continue
        if ('\n' in text or '\r' in text) and token_type != tokenize.STRING:
            line_break = True
        else:
            yield (token_type, text, previous_token_type, previous_text,
                   line_break, unary_context, start)
            unary_context = text in '([{,;'
            line_break = False
            previous_token_type = token_type
            previous_text = text


@register_check
def break_before_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks before binary operators.

    The preferred place to break around a binary operator is after the
    operator, not before it.

    W503: (width == 0\n + height == 0)
    W503: (width == 0\n and height == 0)
    W503: var = (1\n       & ~2)
    W503: var = (1\n       / -2)
    W503: var = (1\n       + -1\n       + -2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    """
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(token_type, text) and line_break and
                not unary_context and
                not _is_binary_operator(previous_token_type,
                                        previous_text)):
            yield start, "W503 line break before binary operator"


@register_check
def break_after_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.

    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)

    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)
    """
    prev_start = None
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(previous_token_type, previous_text) and
                line_break and
                not unary_context and
                not _is_binary_operator(token_type, text)):
            yield prev_start, "W504 line break after binary operator"
        prev_start = start


@register_check
def comparison_to_singleton(logical_line, noqa):
    r"""Comparison to singletons should use "is" or "is not".

    Comparisons to singletons like None should always be done
    with "is" or "is not", never the equality operators.

    Okay: if arg is not None:
    E711: if arg != None:
    E711: if None == arg:
    E712: if arg == True:
    E712: if False == arg:

    Also, beware of writing if x when you really mean if x is not None
    -- e.g. when testing whether a variable or argument that defaults to
    None was set to some other value.  The other value might have a type
    (such as a container) that could be false in a boolean context!
    """
    if noqa:
        return

    for match in COMPARE_SINGLETON_REGEX.finditer(logical_line):
        singleton = match.group(1) or match.group(3)
        same = (match.group(2) == '==')

        msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton)
        if singleton in ('None',):
            code = 'E711'
        else:
            code = 'E712'
            nonzero = ((singleton == 'True' and same) or
                       (singleton == 'False' and not same))
            msg += " or 'if %scond:'" % ('' if nonzero else 'not ')
        yield match.start(2), ("%s comparison to %s should be %s" %
                               (code, singleton, msg))


@register_check
def comparison_negative(logical_line):
    r"""Negative comparison should be done using "not in" and "is not".

    Okay: if x not in y:\n    pass
    Okay: assert (X in Y or X is Z)
    Okay: if not (X in Y):\n    pass
    Okay: zz = x is not y
    E713: Z = not X in Y
    E713: if not X.B in Y:\n    pass
    E714: if not X is Y:\n    pass
    E714: Z = not X.B is Y
    """
    match = COMPARE_NEGATIVE_REGEX.search(logical_line)
    if match:
        pos = match.start(1)
        if match.group(2) == 'in':
            yield pos, "E713 test for membership should be 'not in'"
        else:
            yield pos, "E714 test for object identity should be 'is not'"


@register_check
def comparison_type(logical_line, noqa):
    r"""Object type comparisons should always use isinstance().

    Do not compare types directly.

    Okay: if isinstance(obj, int):
    E721: if type(obj) is type(1):

    When checking if an object is a string, keep in mind that it might
    be a unicode string too! In Python 2.3, str and unicode have a
    common base class, basestring, so you can do:

    Okay: if isinstance(obj, basestring):
    Okay: if type(a1) is type(b1):
    """
    match = COMPARE_TYPE_REGEX.search(logical_line)
    if match and not noqa:
        inst = match.group(1)
        if inst and inst.isidentifier() and inst not in SINGLETONS:
            return  # Allow comparison for types which are not obvious
        yield match.start(), "E721 do not compare types, use 'isinstance()'"


@register_check
def bare_except(logical_line, noqa):
    r"""When catching exceptions, mention specific exceptions when
    possible.

    Okay: except Exception:
    Okay: except BaseException:
    E722: except:
    """
    if noqa:
        return

    match = BLANK_EXCEPT_REGEX.match(logical_line)
    if match:
        yield match.start(), "E722 do not use bare 'except'"


@register_check
def ambiguous_identifier(logical_line, tokens):
    r"""Never use the characters 'l', 'O', or 'I' as variable names.

    In some fonts, these characters are indistinguishable from the
    numerals one and zero. When tempted to use 'l', use 'L' instead.

    Okay: L = 0
    Okay: o = 123
    Okay: i = 42
    E741: l = 0
    E741: O = 123
    E741: I = 42

    Variables can be bound in several other contexts, including class
    and function definitions, lambda functions, 'global' and 'nonlocal'
    statements, exception handlers, and 'with' and 'for' statements.
    In addition, we have a special handling for function parameters.

    Okay: except AttributeError as o:
    Okay: with lock as L:
    Okay: foo(l=12)
    Okay: foo(l=I)
    Okay: for a in foo(l=12):
    Okay: lambda arg: arg * l
    Okay: lambda a=l[I:5]: None
    Okay: lambda x=a.I: None
    Okay: if l >= 12:
    E741: except AttributeError as O:
    E741: with lock as l:
    E741: global I
    E741: nonlocal l
    E741: def foo(l):
    E741: def foo(l=12):
    E741: l = foo(l=12)
    E741: for l in range(10):
    E741: [l for l in lines if l]
    E741: lambda l: None
    E741: lambda a=x[1:5], l: None
    E741: lambda **l:
    E741: def f(**l):
    E742: class I(object):
    E743: def l(x):
    """
    func_depth = None  # set to brace depth if 'def' or 'lambda' is found
    seen_colon = False  # set to true if we're done with function parameters
    brace_depth = 0
    idents_to_avoid = ('l', 'O', 'I')
    prev_type, prev_text, prev_start, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, line = tokens[index]
        ident = pos = None
        # find function definitions
        if prev_text in {'def', 'lambda'}:
            func_depth = brace_depth
            seen_colon = False
        elif (
                func_depth is not None and
                text == ':' and
                brace_depth == func_depth
        ):
            seen_colon = True
        # update parameter parentheses level
        if text in '([{':
            brace_depth += 1
        elif text in ')]}':
            brace_depth -= 1
        # identifiers on the lhs of an assignment operator
        if text == ':=' or (text == '=' and brace_depth == 0):
            if prev_text in idents_to_avoid:
                ident = prev_text
                pos = prev_start
        # identifiers bound to values with 'as', 'for',
        # 'global', or 'nonlocal'
        if prev_text in ('as', 'for', 'global', 'nonlocal'):
            if text in idents_to_avoid:
                ident = text
                pos = start
        # function / lambda parameter definitions
        if (
                func_depth is not None and
                not seen_colon and
                index < len(tokens) - 1 and tokens[index + 1][1] in ':,=)' and
                prev_text in {'lambda', ',', '*', '**', '('} and
                text in idents_to_avoid
        ):
            ident = text
            pos = start
        if prev_text == 'class':
            if text in idents_to_avoid:
                yield start, "E742 ambiguous class definition '%s'" % text
        if prev_text == 'def':
            if text in idents_to_avoid:
                yield start, "E743 ambiguous function definition '%s'" % text
        if ident:
            yield pos, "E741 ambiguous variable name '%s'" % ident
        prev_text = text
        prev_start = start


@register_check
def python_3000_invalid_escape_sequence(logical_line, tokens, noqa):
    r"""Invalid escape sequences are deprecated in Python 3.6.

    Okay: regex = r'\.png$'
    W605: regex = '\.png$'
    """
    if noqa:
        return

    # https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
    valid = [
        '\n',
        '\\',
        '\'',
        '"',
        'a',
        'b',
        'f',
        'n',
        'r',
        't',
        'v',
        '0', '1', '2', '3', '4', '5', '6', '7',
        'x',

        # Escape sequences only recognized in string literals
        'N',
        'u',
        'U',
    ]

    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.STRING:
            start_line, start_col = start
            quote = text[-3:] if text[-3:] in ('"""', "'''") else text[-1]
            # Extract string modifiers (e.g. u or r)
            quote_pos = text.index(quote)
            prefix = text[:quote_pos].lower()
            start = quote_pos + len(quote)
            string = text[start:-len(quote)]

            if 'r' not in prefix:
                pos = string.find('\\')
                while pos >= 0:
                    pos += 1
                    if string[pos] not in valid:
                        line = start_line + string.count('\n', 0, pos)
                        if line == start_line:
                            col = start_col + len(prefix) + len(quote) + pos
                        else:
                            col = pos - string.rfind('\n', 0, pos) - 1
                        yield (
                            (line, col - 1),
                            "W605 invalid escape sequence '\\%s'" %
                            string[pos],
                        )
                    pos = string.find('\\', pos + 1)


@register_check
def python_3000_async_await_keywords(logical_line, tokens):
    """'async' and 'await' are reserved keywords starting at Python 3.7.

    W606: async = 42
    W606: await = 42
    Okay: async def read(db):\n    data = await db.fetch('SELECT ...')
    """
    # The Python tokenize library before Python 3.5 recognizes
    # async/await as a NAME token. Therefore, use a state machine to
    # look for the possible async/await constructs as defined by the
    # Python grammar:
    # https://docs.python.org/3/reference/grammar.html

    state = None
    for token_type, text, start, end, line in tokens:
        error = False

        if token_type == tokenize.NL:
            continue

        if state is None:
            if token_type == tokenize.NAME:
                if text == 'async':
                    state = ('async_stmt', start)
                elif text == 'await':
                    state = ('await', start)
                elif (token_type == tokenize.NAME and
                      text in ('def', 'for')):
                    state = ('define', start)

        elif state[0] == 'async_stmt':
            if token_type == tokenize.NAME and text in ('def', 'with', 'for'):
                # One of funcdef, with_stmt, or for_stmt. Return to
                # looking for async/await names.
                state = None
            else:
                error = True
        elif state[0] == 'await':
            if token_type == tokenize.NAME:
                # An await expression. Return to looking for async/await
                # names.
                state = None
            elif token_type == tokenize.OP and text == '(':
                state = None
            else:
                error = True
        elif state[0] == 'define':
            if token_type == tokenize.NAME and text in ('async', 'await'):
                error = True
            else:
                state = None

        if error:
            yield (
                state[1],
                "W606 'async' and 'await' are reserved keywords starting with "
                "Python 3.7",
            )
            state = None

    # Last token
    if state is not None:
        yield (
            state[1],
            "W606 'async' and 'await' are reserved keywords starting with "
            "Python 3.7",
        )


########################################################################
@register_check
def maximum_doc_length(logical_line, max_doc_length, noqa, tokens):
    r"""Limit all doc lines to a maximum of 72 characters.

    For flowing long blocks of text (docstrings or comments), limiting
    the length to 72 characters is recommended.

    Reports warning W505
    """
    if max_doc_length is None or noqa:
        return

    prev_token = None
    skip_lines = set()
    # Skip lines that
    for token_type, text, start, end, line in tokens:
        if token_type not in SKIP_COMMENTS.union([tokenize.STRING]):
            skip_lines.add(line)

    for token_type, text, start, end, line in tokens:
        # Skip lines that aren't pure strings
        if token_type == tokenize.STRING and skip_lines:
            continue
        if token_type in (tokenize.STRING, tokenize.COMMENT):
            # Only check comment-only lines
            if prev_token is None or prev_token in SKIP_TOKENS:
                lines = line.splitlines()
                for line_num, physical_line in enumerate(lines):
                    if start[0] + line_num == 1 and line.startswith('#!'):
                        return
                    length = len(physical_line)
                    chunks = physical_line.split()
                    if token_type == tokenize.COMMENT:
                        if (len(chunks) == 2 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if len(chunks) == 1 and line_num + 1 < len(lines):
                        if (len(chunks) == 1 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if length > max_doc_length:
                        doc_error = (start[0] + line_num, max_doc_length)
                        yield (doc_error, "W505 doc line too long "
                                          "(%d > %d characters)"
                               % (length, max_doc_length))
        prev_token = token_type


########################################################################
# Helper functions
########################################################################


def readlines(filename):
    """Read the source code."""
    try:
        with tokenize.open(filename) as f:
            return f.readlines()
    except (LookupError, SyntaxError, UnicodeError):
        # Fall back if file encoding is improperly declared
        with open(filename, encoding='latin-1') as f:
            return f.readlines()


def stdin_get_value():
    """Read the value from stdin."""
    return io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore').read()


noqa = lru_cache(512)(re.compile(r'# no(?:qa|pep8)\b', re.I).search)


def expand_indent(line):
    r"""Return the amount of indentation.

    Tabs are expanded to the next multiple of 8.

    >>> expand_indent('    ')
    4
    >>> expand_indent('\t')
    8
    >>> expand_indent('       \t')
    8
    >>> expand_indent('        \t')
    16
    """
    line = line.rstrip('\n\r')
    if '\t' not in line:
        return len(line) - len(line.lstrip())
    result = 0
    for char in line:
        if char == '\t':
            result = result // 8 * 8 + 8
        elif char == ' ':
            result += 1
        else:
            break
    return result


def mute_string(text):
    """Replace contents with 'xxx' to prevent syntax matching.

    >>> mute_string('"abc"')
    '"xxx"'
    >>> mute_string("'''abc'''")
    "'''xxx'''"
    >>> mute_string("r'abc'")
    "r'xxx'"
    """
    # String modifiers (e.g. u or r)
    start = text.index(text[-1]) + 1
    end = len(text) - 1
    # Triple quotes
    if text[-3:] in ('"""', "'''"):
        start += 2
        end -= 2
    return text[:start] + 'x' * (end - start) + text[end:]


def parse_udiff(diff, patterns=None, parent='.'):
    """Return a dictionary of matching lines."""
    # For each file of the diff, the entry key is the filename,
    # and the value is a set of row numbers to consider.
    rv = {}
    path = nrows = None
    for line in diff.splitlines():
        if nrows:
            if line[:1] != '-':
                nrows -= 1
            continue
        if line[:3] == '@@ ':
            hunk_match = HUNK_REGEX.match(line)
            (row, nrows) = (int(g or '1') for g in hunk_match.groups())
            rv[path].update(range(row, row + nrows))
        elif line[:3] == '+++':
            path = line[4:].split('\t', 1)[0]
            # Git diff will use (i)ndex, (w)ork tree, (c)ommit and
            # (o)bject instead of a/b/c/d as prefixes for patches
            if path[:2] in ('b/', 'w/', 'i/'):
                path = path[2:]
            rv[path] = set()
    return {
        os.path.join(parent, filepath): rows
        for (filepath, rows) in rv.items()
        if rows and filename_match(filepath, patterns)
    }


def normalize_paths(value, parent=os.curdir):
    """Parse a comma-separated list of paths.

    Return a list of absolute paths.
    """
    if not value:
        return []
    if isinstance(value, list):
        return value
    paths = []
    for path in value.split(','):
        path = path.strip()
        if '/' in path:
            path = os.path.abspath(os.path.join(parent, path))
        paths.append(path.rstrip('/'))
    return paths


def filename_match(filename, patterns, default=True):
    """Check if patterns contains a pattern that matches filename.

    If patterns is unspecified, this always returns True.
    """
    if not patterns:
        return default
    return any(fnmatch(filename, pattern) for pattern in patterns)


def update_counts(s, counts):
    r"""Adds one to the counts of each appearance of characters in s,
        for characters in counts"""
    for char in s:
        if char in counts:
            counts[char] += 1


def _is_eol_token(token):
    return token[0] in NEWLINE or token[4][token[3][1]:].lstrip() == '\\\n'


########################################################################
# Framework to run all checks
########################################################################


class Checker:
    """Load a Python source file, tokenize it, check coding style."""

    def __init__(self, filename=None, lines=None,
                 options=None, report=None, **kwargs):
        if options is None:
            options = StyleGuide(kwargs).options
        else:
            assert not kwargs
        self._io_error = None
        self._physical_checks = options.physical_checks
        self._logical_checks = options.logical_checks
        self._ast_checks = options.ast_checks
        self.max_line_length = options.max_line_length
        self.max_doc_length = options.max_doc_length
        self.indent_size = options.indent_size
        self.multiline = False  # in a multiline string?
        self.hang_closing = options.hang_closing
        self.indent_size = options.indent_size
        self.verbose = options.verbose
        self.filename = filename
        # Dictionary where a checker can store its custom state.
        self._checker_states = {}
        if filename is None:
            self.filename = 'stdin'
            self.lines = lines or []
        elif filename == '-':
            self.filename = 'stdin'
            self.lines = stdin_get_value().splitlines(True)
        elif lines is None:
            try:
                self.lines = readlines(filename)
            except OSError:
                (exc_type, exc) = sys.exc_info()[:2]
                self._io_error = f'{exc_type.__name__}: {exc}'
                self.lines = []
        else:
            self.lines = lines
        if self.lines:
            ord0 = ord(self.lines[0][0])
            if ord0 in (0xef, 0xfeff):  # Strip the UTF-8 BOM
                if ord0 == 0xfeff:
                    self.lines[0] = self.lines[0][1:]
                elif self.lines[0][:3] == '\xef\xbb\xbf':
                    self.lines[0] = self.lines[0][3:]
        self.report = report or options.report
        self.report_error = self.report.error
        self.noqa = False

    def report_invalid_syntax(self):
        """Check if the syntax is valid."""
        (exc_type, exc) = sys.exc_info()[:2]
        if len(exc.args) > 1:
            offset = exc.args[1]
            if len(offset) > 2:
                offset = offset[1:3]
        else:
            offset = (1, 0)
        self.report_error(offset[0], offset[1] or 0,
                          f'E901 {exc_type.__name__}: {exc.args[0]}',
                          self.report_invalid_syntax)

    def readline(self):
        """Get the next line from the input buffer."""
        if self.line_number >= self.total_lines:
            return ''
        line = self.lines[self.line_number]
        self.line_number += 1
        if self.indent_char is None and line[:1] in WHITESPACE:
            self.indent_char = line[0]
        return line

    def run_check(self, check, argument_names):
        """Run a check plugin."""
        arguments = []
        for name in argument_names:
            arguments.append(getattr(self, name))
        return check(*arguments)

    def init_checker_state(self, name, argument_names):
        """Prepare custom state for the specific checker plugin."""
        if 'checker_state' in argument_names:
            self.checker_state = self._checker_states.setdefault(name, {})

    def check_physical(self, line):
        """Run all physical checks on a raw input line."""
        self.physical_line = line
        for name, check, argument_names in self._physical_checks:
            self.init_checker_state(name, argument_names)
            result = self.run_check(check, argument_names)
            if result is not None:
                (offset, text) = result
                self.report_error(self.line_number, offset, text, check)
                if text[:4] == 'E101':
                    self.indent_char = line[0]

    def build_tokens_line(self):
        """Build a logical line from tokens."""
        logical = []
        comments = []
        length = 0
        prev_row = prev_col = mapping = None
        for token_type, text, start, end, line in self.tokens:
            if token_type in SKIP_TOKENS:
                continue
            if not mapping:
                mapping = [(0, start)]
            if token_type == tokenize.COMMENT:
                comments.append(text)
                continue
            if token_type == tokenize.STRING:
                text = mute_string(text)
            if prev_row:
                (start_row, start_col) = start
                if prev_row != start_row:    # different row
                    prev_text = self.lines[prev_row - 1][prev_col - 1]
                    if prev_text == ',' or (prev_text not in '{[(' and
                                            text not in '}])'):
                        text = ' ' + text
                elif prev_col != start_col:  # different column
                    text = line[prev_col:start_col] + text
            logical.append(text)
            length += len(text)
            mapping.append((length, end))
            (prev_row, prev_col) = end
        self.logical_line = ''.join(logical)
        self.noqa = comments and noqa(''.join(comments))
        return mapping

    def check_logical(self):
        """Build a line from tokens and run all logical checks on it."""
        self.report.increment_logical_line()
        mapping = self.build_tokens_line()
        if not mapping:
            return

        mapping_offsets = [offset for offset, _ in mapping]
        (start_row, start_col) = mapping[0][1]
        start_line = self.lines[start_row - 1]
        self.indent_level = expand_indent(start_line[:start_col])
        if self.blank_before < self.blank_lines:
            self.blank_before = self.blank_lines
        if self.verbose >= 2:
            print(self.logical_line[:80].rstrip())
        for name, check, argument_names in self._logical_checks:
            if self.verbose >= 4:
                print('   ' + name)
            self.init_checker_state(name, argument_names)
            for offset, text in self.run_check(check, argument_names) or ():
                if not isinstance(offset, tuple):
                    # As mappings are ordered, bisecting is a fast way
                    # to find a given offset in them.
                    token_offset, pos = mapping[bisect.bisect_left(
                        mapping_offsets, offset)]
                    offset = (pos[0], pos[1] + offset - token_offset)
                self.report_error(offset[0], offset[1], text, check)
        if self.logical_line:
            self.previous_indent_level = self.indent_level
            self.previous_logical = self.logical_line
            if not self.indent_level:
                self.previous_unindented_logical_line = self.logical_line
        self.blank_lines = 0
        self.tokens = []

    def check_ast(self):
        """Build the file's AST and run all AST checks."""
        try:
            tree = compile(''.join(self.lines), '', 'exec', PyCF_ONLY_AST)
        except (ValueError, SyntaxError, TypeError):
            return self.report_invalid_syntax()
        for name, cls, __ in self._ast_checks:
            checker = cls(tree, self.filename)
            for lineno, offset, text, check in checker.run():
                if not self.lines or not noqa(self.lines[lineno - 1]):
                    self.report_error(lineno, offset, text, check)

    def generate_tokens(self):
        """Tokenize file, run physical line checks and yield tokens."""
        if self._io_error:
            self.report_error(1, 0, 'E902 %s' % self._io_error, readlines)
        tokengen = tokenize.generate_tokens(self.readline)
        try:
            prev_physical = ''
            for token in tokengen:
                if token[2][0] > self.total_lines:
                    return
                self.noqa = token[4] and noqa(token[4])
                self.maybe_check_physical(token, prev_physical)
                yield token
                prev_physical = token[4]
        except (SyntaxError, tokenize.TokenError):
            self.report_invalid_syntax()

    def maybe_check_physical(self, token, prev_physical):
        """If appropriate for token, check current physical line(s)."""
        # Called after every token, but act only on end of line.

        # a newline token ends a single physical line.
        if _is_eol_token(token):
            # if the file does not end with a newline, the NEWLINE
            # token is inserted by the parser, but it does not contain
            # the previous physical line in `token[4]`
            if token[4] == '':
                self.check_physical(prev_physical)
            else:
                self.check_physical(token[4])
        elif token[0] == tokenize.STRING and '\n' in token[1]:
            # Less obviously, a string that contains newlines is a
            # multiline string, either triple-quoted or with internal
            # newlines backslash-escaped. Check every physical line in
            # the string *except* for the last one: its newline is
            # outside of the multiline string, so we consider it a
            # regular physical line, and will check it like any other
            # physical line.
            #
            # Subtleties:
            # - we don't *completely* ignore the last line; if it
            #   contains the magical "# noqa" comment, we disable all
            #   physical checks for the entire multiline string
            # - have to wind self.line_number back because initially it
            #   points to the last line of the string, and we want
            #   check_physical() to give accurate feedback
            if noqa(token[4]):
                return
            self.multiline = True
            self.line_number = token[2][0]
            _, src, (_, offset), _, _ = token
            src = self.lines[self.line_number - 1][:offset] + src
            for line in src.split('\n')[:-1]:
                self.check_physical(line + '\n')
                self.line_number += 1
            self.multiline = False

    def check_all(self, expected=None, line_offset=0):
        """Run all checks on the input file."""
        self.report.init_file(self.filename, self.lines, expected, line_offset)
        self.total_lines = len(self.lines)
        if self._ast_checks:
            self.check_ast()
        self.line_number = 0
        self.indent_char = None
        self.indent_level = self.previous_indent_level = 0
        self.previous_logical = ''
        self.previous_unindented_logical_line = ''
        self.tokens = []
        self.blank_lines = self.blank_before = 0
        parens = 0
        for token in self.generate_tokens():
            self.tokens.append(token)
            token_type, text = token[0:2]
            if self.verbose >= 3:
                if token[2][0] == token[3][0]:
                    pos = '[{}:{}]'.format(token[2][1] or '', token[3][1])
                else:
                    pos = 'l.%s' % token[3][0]
                print('l.%s\t%s\t%s\t%r' %
                      (token[2][0], pos, tokenize.tok_name[token[0]], text))
            if token_type == tokenize.OP:
                if text in '([{':
                    parens += 1
                elif text in '}])':
                    parens -= 1
            elif not parens:
                if token_type in NEWLINE:
                    if token_type == tokenize.NEWLINE:
                        self.check_logical()
                        self.blank_before = 0
                    elif len(self.tokens) == 1:
                        # The physical line contains only this token.
                        self.blank_lines += 1
                        del self.tokens[0]
                    else:
                        self.check_logical()
        if self.tokens:
            self.check_physical(self.lines[-1])
            self.check_logical()
        return self.report.get_file_results()


class BaseReport:
    """Collect the results of the checks."""

    print_filename = False

    def __init__(self, options):
        self._benchmark_keys = options.benchmark_keys
        self._ignore_code = options.ignore_code
        # Results
        self.elapsed = 0
        self.total_errors = 0
        self.counters = dict.fromkeys(self._benchmark_keys, 0)
        self.messages = {}

    def start(self):
        """Start the timer."""
        self._start_time = time.time()

    def stop(self):
        """Stop the timer."""
        self.elapsed = time.time() - self._start_time

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self.filename = filename
        self.lines = lines
        self.expected = expected or ()
        self.line_offset = line_offset
        self.file_errors = 0
        self.counters['files'] += 1
        self.counters['physical lines'] += len(lines)

    def increment_logical_line(self):
        """Signal a new logical line."""
        self.counters['logical lines'] += 1

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = text[:4]
        if self._ignore_code(code):
            return
        if code in self.counters:
            self.counters[code] += 1
        else:
            self.counters[code] = 1
            self.messages[code] = text[5:]
        # Don't care about expected errors or warnings
        if code in self.expected:
            return
        if self.print_filename and not self.file_errors:
            print(self.filename)
        self.file_errors += 1
        self.total_errors += 1
        return code

    def get_file_results(self):
        """Return the count of errors and warnings for this file."""
        return self.file_errors

    def get_count(self, prefix=''):
        """Return the total count of errors and warnings."""
        return sum(self.counters[key]
                   for key in self.messages if key.startswith(prefix))

    def get_statistics(self, prefix=''):
        """Get statistics for message codes that start with the prefix.

        prefix='' matches all errors and warnings
        prefix='E' matches all errors
        prefix='W' matches all warnings
        prefix='E4' matches all errors that have to do with imports
        """
        return ['%-7s %s %s' % (self.counters[key], key, self.messages[key])
                for key in sorted(self.messages) if key.startswith(prefix)]

    def print_statistics(self, prefix=''):
        """Print overall statistics (number of errors and warnings)."""
        for line in self.get_statistics(prefix):
            print(line)

    def print_benchmark(self):
        """Print benchmark numbers."""
        print('{:<7.2f} {}'.format(self.elapsed, 'seconds elapsed'))
        if self.elapsed:
            for key in self._benchmark_keys:
                print('%-7d %s per second (%d total)' %
                      (self.counters[key] / self.elapsed, key,
                       self.counters[key]))


class FileReport(BaseReport):
    """Collect the results of the checks and print the filenames."""

    print_filename = True


class StandardReport(BaseReport):
    """Collect and print the results of the checks."""

    def __init__(self, options):
        super().__init__(options)
        self._fmt = REPORT_FORMAT.get(options.format.lower(),
                                      options.format)
        self._repeat = options.repeat
        self._show_source = options.show_source
        self._show_pep8 = options.show_pep8

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self._deferred_print = []
        return super().init_file(
            filename, lines, expected, line_offset)

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = super().error(line_number, offset, text, check)
        if code and (self.counters[code] == 1 or self._repeat):
            self._deferred_print.append(
                (line_number, offset, code, text[5:], check.__doc__))
        return code

    def get_file_results(self):
        """Print results and return the overall count for this file."""
        self._deferred_print.sort()
        for line_number, offset, code, text, doc in self._deferred_print:
            print(self._fmt % {
                'path': self.filename,
                'row': self.line_offset + line_number, 'col': offset + 1,
                'code': code, 'text': text,
            })
            if self._show_source:
                if line_number > len(self.lines):
                    line = ''
                else:
                    line = self.lines[line_number - 1]
                print(line.rstrip())
                print(re.sub(r'\S', ' ', line[:offset]) + '^')
            if self._show_pep8 and doc:
                print('    ' + doc.strip())

            # stdout is block buffered when not stdout.isatty().
            # line can be broken where buffer boundary since other
            # processes write to same file.
            # flush() after print() to avoid buffer boundary.
            # Typical buffer size is 8192. line written safely when
            # len(line) < 8192.
            sys.stdout.flush()
        return self.file_errors


class DiffReport(StandardReport):
    """Collect and print the results for the changed lines only."""

    def __init__(self, options):
        super().__init__(options)
        self._selected = options.selected_lines

    def error(self, line_number, offset, text, check):
        if line_number not in self._selected[self.filename]:
            return
        return super().error(line_number, offset, text, check)


class StyleGuide:
    """Initialize a PEP-8 instance with few options."""

    def __init__(self, *args, **kwargs):
        # build options from the command line
        self.checker_class = kwargs.pop('checker_class', Checker)
        parse_argv = kwargs.pop('parse_argv', False)
        config_file = kwargs.pop('config_file', False)
        parser = kwargs.pop('parser', None)
        # build options from dict
        options_dict = dict(*args, **kwargs)
        arglist = None if parse_argv else options_dict.get('paths', None)
        verbose = options_dict.get('verbose', None)
        options, self.paths = process_options(
            arglist, parse_argv, config_file, parser, verbose)
        if options_dict:
            options.__dict__.update(options_dict)
            if 'paths' in options_dict:
                self.paths = options_dict['paths']

        self.runner = self.input_file
        self.options = options

        if not options.reporter:
            options.reporter = BaseReport if options.quiet else StandardReport

        options.select = tuple(options.select or ())
        if not (options.select or options.ignore or
                options.testsuite or options.doctest) and DEFAULT_IGNORE:
            # The default choice: ignore controversial checks
            options.ignore = tuple(DEFAULT_IGNORE.split(','))
        else:
            # Ignore all checks which are not explicitly selected
            options.ignore = ('',) if options.select else tuple(options.ignore)
        options.benchmark_keys = BENCHMARK_KEYS[:]
        options.ignore_code = self.ignore_code
        options.physical_checks = self.get_checks('physical_line')
        options.logical_checks = self.get_checks('logical_line')
        options.ast_checks = self.get_checks('tree')
        self.init_report()

    def init_report(self, reporter=None):
        """Initialize the report instance."""
        self.options.report = (reporter or self.options.reporter)(self.options)
        return self.options.report

    def check_files(self, paths=None):
        """Run all checks on the paths."""
        if paths is None:
            paths = self.paths
        report = self.options.report
        runner = self.runner
        report.start()
        try:
            for path in paths:
                if os.path.isdir(path):
                    self.input_dir(path)
                elif not self.excluded(path):
                    runner(path)
        except KeyboardInterrupt:
            print('... stopped')
        report.stop()
        return report

    def input_file(self, filename, lines=None, expected=None, line_offset=0):
        """Run all checks on a Python source file."""
        if self.options.verbose:
            print('checking %s' % filename)
        fchecker = self.checker_class(
            filename, lines=lines, options=self.options)
        return fchecker.check_all(expected=expected, line_offset=line_offset)

    def input_dir(self, dirname):
        """Check all files in this directory and all subdirectories."""
        dirname = dirname.rstrip('/')
        if self.excluded(dirname):
            return 0
        counters = self.options.report.counters
        verbose = self.options.verbose
        filepatterns = self.options.filename
        runner = self.runner
        for root, dirs, files in os.walk(dirname):
            if verbose:
                print('directory ' + root)
            counters['directories'] += 1
            for subdir in sorted(dirs):
                if self.excluded(subdir, root):
                    dirs.remove(subdir)
            for filename in sorted(files):
                # contain a pattern that matches?
                if (
                    filename_match(filename, filepatterns) and
                    not self.excluded(filename, root)
                ):
                    runner(os.path.join(root, filename))

    def excluded(self, filename, parent=None):
        """Check if the file should be excluded.

        Check if 'options.exclude' contains a pattern matching filename.
        """
        if not self.options.exclude:
            return False
        basename = os.path.basename(filename)
        if filename_match(basename, self.options.exclude):
            return True
        if parent:
            filename = os.path.join(parent, filename)
        filename = os.path.abspath(filename)
        return filename_match(filename, self.options.exclude)

    def ignore_code(self, code):
        """Check if the error code should be ignored.

        If 'options.select' contains a prefix of the error code,
        return False.  Else, if 'options.ignore' contains a prefix of
        the error code, return True.
        """
        if len(code) < 4 and any(s.startswith(code)
                                 for s in self.options.select):
            return False
        return (code.startswith(self.options.ignore) and
                not code.startswith(self.options.select))

    def get_checks(self, argument_name):
        """Get all the checks for this category.

        Find all globally visible functions where the first argument
        name starts with argument_name and which contain selected tests.
        """
        checks = []
        for check, attrs in _checks[argument_name].items():
            (codes, args) = attrs
            if any(not (code and self.ignore_code(code)) for code in codes):
                checks.append((check.__name__, check, args))
        return sorted(checks)


def get_parser(prog='pycodestyle', version=__version__):
    """Create the parser for the program."""
    parser = OptionParser(prog=prog, version=version,
                          usage="%prog [options] input ...")
    parser.config_options = [
        'exclude', 'filename', 'select', 'ignore', 'max-line-length',
        'max-doc-length', 'indent-size', 'hang-closing', 'count', 'format',
        'quiet', 'show-pep8', 'show-source', 'statistics', 'verbose']
    parser.add_option('-v', '--verbose', default=0, action='count',
                      help="print status messages, or debug with -vv")
    parser.add_option('-q', '--quiet', default=0, action='count',
                      help="report only file names, or nothing with -qq")
    parser.add_option('-r', '--repeat', default=True, action='store_true',
                      help="(obsolete) show all occurrences of the same error")
    parser.add_option('--first', action='store_false', dest='repeat',
                      help="show first occurrence of each error")
    parser.add_option('--exclude', metavar='patterns', default=DEFAULT_EXCLUDE,
                      help="exclude files or directories which match these "
                           "comma separated patterns (default: %default)")
    parser.add_option('--filename', metavar='patterns', default='*.py',
                      help="when parsing directories, only check filenames "
                           "matching these comma separated patterns "
                           "(default: %default)")
    parser.add_option('--select', metavar='errors', default='',
                      help="select errors and warnings (e.g. E,W6)")
    parser.add_option('--ignore', metavar='errors', default='',
                      help="skip errors and warnings (e.g. E4,W) "
                           "(default: %s)" % DEFAULT_IGNORE)
    parser.add_option('--show-source', action='store_true',
                      help="show source code for each error")
    parser.add_option('--show-pep8', action='store_true',
                      help="show text of PEP 8 for each error "
                           "(implies --first)")
    parser.add_option('--statistics', action='store_true',
                      help="count errors and warnings")
    parser.add_option('--count', action='store_true',
                      help="print total number of errors and warnings "
                           "to standard error and set exit code to 1 if "
                           "total is not null")
    parser.add_option('--max-line-length', type='int', metavar='n',
                      default=MAX_LINE_LENGTH,
                      help="set maximum allowed line length "
                           "(default: %default)")
    parser.add_option('--max-doc-length', type='int', metavar='n',
                      default=None,
                      help="set maximum allowed doc line length and perform "
                           "these checks (unchecked if not set)")
    parser.add_option('--indent-size', type='int', metavar='n',
                      default=INDENT_SIZE,
                      help="set how many spaces make up an indent "
                           "(default: %default)")
    parser.add_option('--hang-closing', action='store_true',
                      help="hang closing bracket instead of matching "
                           "indentation of opening bracket's line")
    parser.add_option('--format', metavar='format', default='default',
                      help="set the error format [default|pylint|<custom>]")
    parser.add_option('--diff', action='store_true',
                      help="report changes only within line number ranges in "
                           "the unified diff received on STDIN")
    group = parser.add_option_group("Testing Options")
    if os.path.exists(TESTSUITE_PATH):
        group.add_option('--testsuite', metavar='dir',
                         help="run regression tests from dir")
        group.add_option('--doctest', action='store_true',
                         help="run doctest on myself")
    group.add_option('--benchmark', action='store_true',
                     help="measure processing speed")
    return parser


def read_config(options, args, arglist, parser):
    """Read and parse configurations.

    If a config file is specified on the command line with the
    "--config" option, then only it is used for configuration.

    Otherwise, the user configuration (~/.config/pycodestyle) and any
    local configurations in the current directory or above will be
    merged together (in that order) using the read method of
    ConfigParser.
    """
    config = configparser.RawConfigParser()

    cli_conf = options.config

    local_dir = os.curdir

    if USER_CONFIG and os.path.isfile(USER_CONFIG):
        if options.verbose:
            print('user configuration: %s' % USER_CONFIG)
        config.read(USER_CONFIG)

    parent = tail = args and os.path.abspath(os.path.commonprefix(args))
    while tail:
        if config.read(os.path.join(parent, fn) for fn in PROJECT_CONFIG):
            local_dir = parent
            if options.verbose:
                print('local configuration: in %s' % parent)
            break
        (parent, tail) = os.path.split(parent)

    if cli_conf and os.path.isfile(cli_conf):
        if options.verbose:
            print('cli configuration: %s' % cli_conf)
        config.read(cli_conf)

    pycodestyle_section = None
    if config.has_section(parser.prog):
        pycodestyle_section = parser.prog
    elif config.has_section('pep8'):
        pycodestyle_section = 'pep8'  # Deprecated
        warnings.warn('[pep8] section is deprecated. Use [pycodestyle].')

    if pycodestyle_section:
        option_list = {o.dest: o.type or o.action for o in parser.option_list}

        # First, read the default values
        (new_options, __) = parser.parse_args([])

        # Second, parse the configuration
        for opt in config.options(pycodestyle_section):
            if opt.replace('_', '-') not in parser.config_options:
                print("  unknown option '%s' ignored" % opt)
                continue
            if options.verbose > 1:
                print("  {} = {}".format(opt,
                                         config.get(pycodestyle_section, opt)))
            normalized_opt = opt.replace('-', '_')
            opt_type = option_list[normalized_opt]
            if opt_type in ('int', 'count'):
                value = config.getint(pycodestyle_section, opt)
            elif opt_type in ('store_true', 'store_false'):
                value = config.getboolean(pycodestyle_section, opt)
            else:
                value = config.get(pycodestyle_section, opt)
                if normalized_opt == 'exclude':
                    value = normalize_paths(value, local_dir)
            setattr(new_options, normalized_opt, value)

        # Third, overwrite with the command-line options
        (options, __) = parser.parse_args(arglist, values=new_options)
    options.doctest = options.testsuite = False
    return options


def process_options(arglist=None, parse_argv=False, config_file=None,
                    parser=None, verbose=None):
    """Process options passed either via arglist or command line args.

    Passing in the ``config_file`` parameter allows other tools, such as
    flake8 to specify their own options to be processed in pycodestyle.
    """
    if not parser:
        parser = get_parser()
    if not parser.has_option('--config'):
        group = parser.add_option_group("Configuration", description=(
            "The project options are read from the [%s] section of the "
            "tox.ini file or the setup.cfg file located in any parent folder "
            "of the path(s) being processed.  Allowed options are: %s." %
            (parser.prog, ', '.join(parser.config_options))))
        group.add_option('--config', metavar='path', default=config_file,
                         help="user config file location")
    # Don't read the command line if the module is used as a library.
    if not arglist and not parse_argv:
        arglist = []
    # If parse_argv is True and arglist is None, arguments are
    # parsed from the command line (sys.argv)
    (options, args) = parser.parse_args(arglist)
    options.reporter = None

    # If explicitly specified verbosity, override any `-v` CLI flag
    if verbose is not None:
        options.verbose = verbose

    if options.ensure_value('testsuite', False):
        args.append(options.testsuite)
    elif not options.ensure_value('doctest', False):
        if parse_argv and not args:
            if options.diff or any(os.path.exists(name)
                                   for name in PROJECT_CONFIG):
                args = ['.']
            else:
                parser.error('input not specified')
        options = read_config(options, args, arglist, parser)
        options.reporter = parse_argv and options.quiet == 1 and FileReport

    options.filename = _parse_multi_options(options.filename)
    options.exclude = normalize_paths(options.exclude)
    options.select = _parse_multi_options(options.select)
    options.ignore = _parse_multi_options(options.ignore)

    if options.diff:
        options.reporter = DiffReport
        stdin = stdin_get_value()
        options.selected_lines = parse_udiff(stdin, options.filename, args[0])
        args = sorted(options.selected_lines)

    return options, args


def _parse_multi_options(options, split_token=','):
    r"""Split and strip and discard empties.

    Turns the following:

    A,
    B,

    into ["A", "B"]
    """
    if options:
        return [o.strip() for o in options.split(split_token) if o.strip()]
    else:
        return options


def _main():
    """Parse options and run checks on Python source."""
    import signal

    # Handle "Broken pipe" gracefully
    try:
        signal.signal(signal.SIGPIPE, lambda signum, frame: sys.exit(1))
    except AttributeError:
        pass    # not supported on Windows

    style_guide = StyleGuide(parse_argv=True)
    options = style_guide.options

    if options.doctest or options.testsuite:
        from testsuite.support import run_tests
        report = run_tests(style_guide)
    else:
        report = style_guide.check_files()

    if options.statistics:
        report.print_statistics()

    if options.benchmark:
        report.print_benchmark()

    if options.testsuite and not options.quiet:
        report.print_results()

    if report.total_errors:
        if options.count:
            sys.stderr.write(str(report.total_errors) + '\n')
        sys.exit(1)


if __name__ == '__main__':
    _main()
# pycodestyle.py - Check Python source code formatting, according to
# PEP 8
#
# Copyright (C) 2006-2009 Johann C. Rocholl <johann@rocholl.net>
# Copyright (C) 2009-2014 Florent Xicluna <florent.xicluna@gmail.com>
# Copyright (C) 2014-2016 Ian Lee <ianlee1521@gmail.com>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
r"""
Check Python source code formatting, according to PEP 8.

For usage and a list of options, try this:
$ python pycodestyle.py -h

This program and its regression test suite live here:
https://github.com/pycqa/pycodestyle

Groups of errors and warnings:
E errors
W warnings
100 indentation
200 whitespace
300 blank lines
400 imports
500 line length
600 deprecation
700 statements
900 syntax error
"""
import bisect
import configparser
import inspect
import io
import keyword
import os
import re
import sys
import time
import tokenize
import warnings
from fnmatch import fnmatch
from functools import lru_cache
from optparse import OptionParser

# this is a performance hack.  see https://bugs.python.org/issue43014
if (
        sys.version_info < (3, 10) and
        callable(getattr(tokenize, '_compile', None))
):  # pragma: no cover (<py310)
    tokenize._compile = lru_cache(tokenize._compile)  # type: ignore

__version__ = '2.11.0'  # patched PY-37054

DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__,.tox'
DEFAULT_IGNORE = 'E121,E123,E126,E226,E24,E704,W503,W504'
try:
    if sys.platform == 'win32':  # pragma: win32 cover
        USER_CONFIG = os.path.expanduser(r'~\.pycodestyle')
    else:  # pragma: win32 no cover
        USER_CONFIG = os.path.join(
            os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'),
            'pycodestyle'
        )
except ImportError:
    USER_CONFIG = None

PROJECT_CONFIG = ('setup.cfg', 'tox.ini')
MAX_LINE_LENGTH = 79
# Number of blank lines between various code parts.
BLANK_LINES_CONFIG = {
    # Top level class and function.
    'top_level': 2,
    # Methods and nested class and function.
    'method': 1,
}
MAX_DOC_LENGTH = 72
INDENT_SIZE = 4
REPORT_FORMAT = {
    'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s',
    'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s',
}

PyCF_ONLY_AST = 1024
SINGLETONS = frozenset(['False', 'None', 'True'])
KEYWORDS = frozenset(keyword.kwlist + ['print']) - SINGLETONS
UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-'])
ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-', '@'])
WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%'])
WS_NEEDED_OPERATORS = frozenset([
    '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<', '>',
    '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '=',
    'and', 'in', 'is', 'or', '->', ':='])
WHITESPACE = frozenset(' \t\xa0')
NEWLINE = frozenset([tokenize.NL, tokenize.NEWLINE])
SKIP_TOKENS = NEWLINE.union([tokenize.INDENT, tokenize.DEDENT])
# ERRORTOKEN is triggered by backticks in Python 3
SKIP_COMMENTS = SKIP_TOKENS.union([tokenize.COMMENT, tokenize.ERRORTOKEN])
BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines']

INDENT_REGEX = re.compile(r'([ \t]*)')
ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b')
DOCSTRING_REGEX = re.compile(r'u?r?["\']')
EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[\[({][ \t]|[ \t][\]}),;:](?!=)')
WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?:  |\t)')
COMPARE_SINGLETON_REGEX = re.compile(r'(\bNone|\bFalse|\bTrue)?\s*([=!]=)'
                                     r'\s*(?(1)|(None|False|True))\b')
COMPARE_NEGATIVE_REGEX = re.compile(r'\b(?<!is\s)(not)\s+[^][)(}{ ]+\s+'
                                    r'(in|is)\s')
COMPARE_TYPE_REGEX = re.compile(
    r'[=!]=\s+type(?:\s*\(\s*([^)]*[^ )])\s*\))'
    r'|\btype(?:\s*\(\s*([^)]*[^ )])\s*\))\s+[=!]='
)
KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS))
OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+|:=)(\s*)')
LAMBDA_REGEX = re.compile(r'\blambda\b')
HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$')
STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\b')
STARTSWITH_TOP_LEVEL_REGEX = re.compile(r'^(async\s+def\s+|def\s+|class\s+|@)')
STARTSWITH_INDENT_STATEMENT_REGEX = re.compile(
    r'^\s*({})\b'.format('|'.join(s.replace(' ', r'\s+') for s in (
        'def', 'async def',
        'for', 'async for',
        'if', 'elif', 'else',
        'try', 'except', 'finally',
        'with', 'async with',
        'class',
        'while',
    )))
)
DUNDER_REGEX = re.compile(r"^__([^\s]+)__(?::\s*[a-zA-Z.0-9_\[\]\"]+)? = ")
BLANK_EXCEPT_REGEX = re.compile(r"except\s*:")

if sys.version_info >= (3, 12):  # pragma: >=3.12 cover
    FSTRING_START = tokenize.FSTRING_START
    FSTRING_MIDDLE = tokenize.FSTRING_MIDDLE
    FSTRING_END = tokenize.FSTRING_END
else:  # pragma: <3.12 cover
    FSTRING_START = FSTRING_MIDDLE = FSTRING_END = -1

_checks = {'physical_line': {}, 'logical_line': {}, 'tree': {}}


def _get_parameters(function):
    return [parameter.name
            for parameter
            in inspect.signature(function).parameters.values()
            if parameter.kind == parameter.POSITIONAL_OR_KEYWORD]


def register_check(check, codes=None):
    """Register a new check object."""
    def _add_check(check, kind, codes, args):
        if check in _checks[kind]:
            _checks[kind][check][0].extend(codes or [])
        else:
            _checks[kind][check] = (codes or [''], args)
    if inspect.isfunction(check):
        args = _get_parameters(check)
        if args and args[0] in ('physical_line', 'logical_line'):
            if codes is None:
                codes = ERRORCODE_REGEX.findall(check.__doc__ or '')
            _add_check(check, args[0], codes, args)
    elif inspect.isclass(check):
        if _get_parameters(check.__init__)[:2] == ['self', 'tree']:
            _add_check(check, 'tree', codes, None)
    return check


########################################################################
# Plugins (check functions) for physical lines
########################################################################

@register_check
def tabs_or_spaces(physical_line, indent_char):
    r"""Never mix tabs and spaces.

    The most popular way of indenting Python is with spaces only.  The
    second-most popular way is with tabs only.  Code indented with a
    mixture of tabs and spaces should be converted to using spaces
    exclusively.  When invoking the Python command line interpreter with
    the -t option, it issues warnings about code that illegally mixes
    tabs and spaces.  When using -tt these warnings become errors.
    These options are highly recommended!

    Okay: if a == 0:\n    a = 1\n    b = 1
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    for offset, char in enumerate(indent):
        if char != indent_char:
            return offset, "E101 indentation contains mixed spaces and tabs"


@register_check
def tabs_obsolete(physical_line):
    r"""On new projects, spaces-only are strongly recommended over tabs.

    Okay: if True:\n    return
    W191: if True:\n\treturn
    """
    indent = INDENT_REGEX.match(physical_line).group(1)
    if '\t' in indent:
        return indent.index('\t'), "W191 indentation contains tabs"


@register_check
def trailing_whitespace(physical_line):
    r"""Trailing whitespace is superfluous.

    The warning returned varies on whether the line itself is blank,
    for easier filtering for those who want to indent their blank lines.

    Okay: spam(1)\n#
    W291: spam(1) \n#
    W293: class Foo(object):\n    \n    bang = 12
    """
    physical_line = physical_line.rstrip('\n')    # chr(10), newline
    physical_line = physical_line.rstrip('\r')    # chr(13), carriage return
    physical_line = physical_line.rstrip('\x0c')  # chr(12), form feed, ^L
    stripped = physical_line.rstrip(' \t\v')
    if physical_line != stripped:
        if stripped:
            return len(stripped), "W291 trailing whitespace"
        else:
            return 0, "W293 blank line contains whitespace"


@register_check
def trailing_blank_lines(physical_line, lines, line_number, total_lines):
    r"""Trailing blank lines are superfluous.

    Okay: spam(1)
    W391: spam(1)\n

    However the last line should end with a new line (warning W292).
    """
    if line_number == total_lines:
        stripped_last_line = physical_line.rstrip('\r\n')
        if physical_line and not stripped_last_line:
            return 0, "W391 blank line at end of file"
        if stripped_last_line == physical_line:
            return len(lines[-1]), "W292 no newline at end of file"


@register_check
def maximum_line_length(physical_line, max_line_length, multiline,
                        line_number, noqa):
    r"""Limit all lines to a maximum of 79 characters.

    There are still many devices around that are limited to 80 character
    lines; plus, limiting windows to 80 characters makes it possible to
    have several windows side-by-side.  The default wrapping on such
    devices looks ugly.  Therefore, please limit all lines to a maximum
    of 79 characters. For flowing long blocks of text (docstrings or
    comments), limiting the length to 72 characters is recommended.

    Reports error E501.
    """
    line = physical_line.rstrip()
    length = len(line)
    if length > max_line_length and not noqa:
        # Special case: ignore long shebang lines.
        if line_number == 1 and line.startswith('#!'):
            return
        # Special case for long URLs in multi-line docstrings or
        # comments, but still report the error when the 72 first chars
        # are whitespaces.
        chunks = line.split()
        if ((len(chunks) == 1 and multiline) or
            (len(chunks) == 2 and chunks[0] == '#')) and \
                len(line) - len(chunks[-1]) < max_line_length - 7:
            return
        if length > max_line_length:
            return (max_line_length, "E501 line too long "
                    "(%d > %d characters)" % (length, max_line_length))


########################################################################
# Plugins (check functions) for logical lines
########################################################################


def _is_one_liner(logical_line, indent_level, lines, line_number):
    if not STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        return False

    line_idx = line_number - 1

    if line_idx < 1:
        prev_indent = 0
    else:
        prev_indent = expand_indent(lines[line_idx - 1])

    if prev_indent > indent_level:
        return False

    while line_idx < len(lines):
        line = lines[line_idx].strip()
        if not line.startswith('@') and STARTSWITH_TOP_LEVEL_REGEX.match(line):
            break
        else:
            line_idx += 1
    else:
        return False  # invalid syntax: EOF while searching for def/class

    next_idx = line_idx + 1
    while next_idx < len(lines):
        if lines[next_idx].strip():
            break
        else:
            next_idx += 1
    else:
        return True  # line is last in the file

    return expand_indent(lines[next_idx]) <= indent_level


@register_check
def blank_lines(logical_line, blank_lines, indent_level, line_number,
                blank_before, previous_logical,
                previous_unindented_logical_line, previous_indent_level,
                lines):
    r"""Separate top-level function and class definitions with two blank
    lines.

    Method definitions inside a class are separated by a single blank
    line.

    Extra blank lines may be used (sparingly) to separate groups of
    related functions.  Blank lines may be omitted between a bunch of
    related one-liners (e.g. a set of dummy implementations).

    Use blank lines in functions, sparingly, to indicate logical
    sections.

    Okay: def a():\n    pass\n\n\ndef b():\n    pass
    Okay: def a():\n    pass\n\n\nasync def b():\n    pass
    Okay: def a():\n    pass\n\n\n# Foo\n# Bar\n\ndef b():\n    pass
    Okay: default = 1\nfoo = 1
    Okay: classify = 1\nfoo = 1

    E301: class Foo:\n    b = 0\n    def bar():\n        pass
    E302: def a():\n    pass\n\ndef b(n):\n    pass
    E302: def a():\n    pass\n\nasync def b(n):\n    pass
    E303: def a():\n    pass\n\n\n\ndef b(n):\n    pass
    E303: def a():\n\n\n\n    pass
    E304: @decorator\n\ndef a():\n    pass
    E305: def a():\n    pass\na()
    E306: def a():\n    def b():\n        pass\n    def c():\n        pass
    """  # noqa
    top_level_lines = BLANK_LINES_CONFIG['top_level']
    method_lines = BLANK_LINES_CONFIG['method']

    if not previous_logical and blank_before < top_level_lines:
        return  # Don't expect blank lines before the first line
    if previous_logical.startswith('@'):
        if blank_lines:
            yield 0, "E304 blank lines found after function decorator"
    elif (blank_lines > top_level_lines or
            (indent_level and blank_lines == method_lines + 1)
          ):
        yield 0, "E303 too many blank lines (%d)" % blank_lines
    elif STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
        # allow a group of one-liners
        if (
            _is_one_liner(logical_line, indent_level, lines, line_number) and
            blank_before == 0
        ):
            return
        if indent_level:
            if not (blank_before == method_lines or
                    previous_indent_level < indent_level or
                    DOCSTRING_REGEX.match(previous_logical)
                    ):
                ancestor_level = indent_level
                nested = False
                # Search backwards for a def ancestor or tree root
                # (top level).
                for line in lines[line_number - top_level_lines::-1]:
                    if line.strip() and expand_indent(line) < ancestor_level:
                        ancestor_level = expand_indent(line)
                        nested = STARTSWITH_DEF_REGEX.match(line.lstrip())
                        if nested or ancestor_level == 0:
                            break
                if nested:
                    yield 0, "E306 expected %s blank line before a " \
                        "nested definition, found 0" % (method_lines,)
                else:
                    yield 0, "E301 expected {} blank line, found 0".format(
                        method_lines)
        elif blank_before != top_level_lines:
            yield 0, "E302 expected %s blank lines, found %d" % (
                top_level_lines, blank_before)
    elif (logical_line and
            not indent_level and
            blank_before != top_level_lines and
            previous_unindented_logical_line.startswith(('def ', 'class '))
          ):
        yield 0, "E305 expected %s blank lines after " \
            "class or function definition, found %d" % (
                top_level_lines, blank_before)


@register_check
def extraneous_whitespace(logical_line):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in these situations:
    - Immediately inside parentheses, brackets or braces.
    - Immediately before a comma, semicolon, or colon.

    Okay: spam(ham[1], {eggs: 2})
    E201: spam( ham[1], {eggs: 2})
    E201: spam(ham[ 1], {eggs: 2})
    E201: spam(ham[1], { eggs: 2})
    E202: spam(ham[1], {eggs: 2} )
    E202: spam(ham[1 ], {eggs: 2})
    E202: spam(ham[1], {eggs: 2 })

    E203: if x == 4: print x, y; x, y = y , x
    E203: if x == 4: print x, y ; x, y = y, x
    E203: if x == 4 : print x, y; x, y = y, x
    """
    line = logical_line
    for match in EXTRANEOUS_WHITESPACE_REGEX.finditer(line):
        text = match.group()
        char = text.strip()
        found = match.start()
        if text[-1].isspace():
            # assert char in '([{'
            yield found + 1, "E201 whitespace after '%s'" % char
        elif line[found - 1] != ',':
            code = ('E202' if char in '}])' else 'E203')  # if char in ',;:'
            yield found, f"{code} whitespace before '{char}'"


@register_check
def whitespace_around_keywords(logical_line):
    r"""Avoid extraneous whitespace around keywords.

    Okay: True and False
    E271: True and  False
    E272: True  and False
    E273: True and\tFalse
    E274: True\tand False
    """
    for match in KEYWORD_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E274 tab before keyword"
        elif len(before) > 1:
            yield match.start(1), "E272 multiple spaces before keyword"

        if '\t' in after:
            yield match.start(2), "E273 tab after keyword"
        elif len(after) > 1:
            yield match.start(2), "E271 multiple spaces after keyword"


@register_check
def missing_whitespace_after_keyword(logical_line, tokens):
    r"""Keywords should be followed by whitespace.

    Okay: from foo import (bar, baz)
    E275: from foo import(bar, baz)
    E275: from importable.module import(bar, baz)
    E275: if(foo): bar
    """
    for tok0, tok1 in zip(tokens, tokens[1:]):
        # This must exclude the True/False/None singletons, which can
        # appear e.g. as "if x is None:", and async/await, which were
        # valid identifier names in old Python versions.
        if (tok0.end == tok1.start and
                keyword.iskeyword(tok0.string) and
                tok0.string not in SINGLETONS and
                not (tok0.string == 'except' and tok1.string == '*') and
                not (tok0.string == 'yield' and tok1.string == ')') and
                tok1.string not in ':\n'):
            yield tok0.end, "E275 missing whitespace after keyword"


@register_check
def indentation(logical_line, previous_logical, indent_char,
                indent_level, previous_indent_level,
                indent_size):
    r"""Use indent_size (PEP8 says 4) spaces per indentation level.

    For really old code that you don't want to mess up, you can continue
    to use 8-space tabs.

    Okay: a = 1
    Okay: if a == 0:\n    a = 1
    E111:   a = 1
    E114:   # a = 1

    Okay: for item in items:\n    pass
    E112: for item in items:\npass
    E115: for item in items:\n# Hi\n    pass

    Okay: a = 1\nb = 2
    E113: a = 1\n    b = 2
    E116: a = 1\n    # b = 2
    """
    c = 0 if logical_line else 3
    tmpl = "E11%d %s" if logical_line else "E11%d %s (comment)"
    if indent_level % indent_size:
        yield 0, tmpl % (
            1 + c,
            "indentation is not a multiple of " + str(indent_size),
        )
    indent_expect = previous_logical.endswith(':')
    if indent_expect and indent_level <= previous_indent_level:
        yield 0, tmpl % (2 + c, "expected an indented block")
    elif not indent_expect and indent_level > previous_indent_level:
        yield 0, tmpl % (3 + c, "unexpected indentation")

    if indent_expect:
        expected_indent_amount = 8 if indent_char == '\t' else 4
        expected_indent_level = previous_indent_level + expected_indent_amount
        if indent_level > expected_indent_level:
            yield 0, tmpl % (7, 'over-indented')


@register_check
def continued_indentation(logical_line, tokens, indent_level, hang_closing,
                          indent_char, indent_size, noqa, verbose):
    r"""Continuation lines indentation.

    Continuation lines should align wrapped elements either vertically
    using Python's implicit line joining inside parentheses, brackets
    and braces, or using a hanging indent.

    When using a hanging indent these considerations should be applied:
    - there should be no arguments on the first line, and
    - further indentation should be used to clearly distinguish itself
      as a continuation line.

    Okay: a = (\n)
    E123: a = (\n    )

    Okay: a = (\n    42)
    E121: a = (\n   42)
    E122: a = (\n42)
    E123: a = (\n    42\n    )
    E124: a = (24,\n     42\n)
    E125: if (\n    b):\n    pass
    E126: a = (\n        42)
    E127: a = (24,\n      42)
    E128: a = (24,\n    42)
    E129: if (a or\n    b):\n    pass
    E131: a = (\n    42\n 24)
    """
    first_row = tokens[0][2][0]
    nrows = 1 + tokens[-1][2][0] - first_row
    if noqa or nrows == 1:
        return

    # indent_next tells us whether the next block is indented; assuming
    # that it is indented by 4 spaces, then we should not allow 4-space
    # indents on the final continuation line; in turn, some other
    # indents are allowed to have an extra 4 spaces.
    indent_next = logical_line.endswith(':')

    row = depth = 0
    valid_hangs = (indent_size,) if indent_char != '\t' \
        else (indent_size, indent_size * 2)
    # remember how many brackets were opened on each line
    parens = [0] * nrows
    # relative indents of physical lines
    rel_indent = [0] * nrows
    # for each depth, collect a list of opening rows
    open_rows = [[0]]
    # for each depth, memorize the hanging indentation
    hangs = [None]
    # visual indents
    indent_chances = {}
    last_indent = tokens[0][2]
    visual_indent = None
    last_token_multiline = False
    # for each depth, memorize the visual indent column
    indent = [last_indent[1]]
    if verbose >= 3:
        print(">>> " + tokens[0][4].rstrip())

    for token_type, text, start, end, line in tokens:

        newline = row < start[0] - first_row
        if newline:
            row = start[0] - first_row
            newline = not last_token_multiline and token_type not in NEWLINE

        if newline:
            # this is the beginning of a continuation line.
            last_indent = start
            if verbose >= 3:
                print("... " + line.rstrip())

            # record the initial indent.
            rel_indent[row] = expand_indent(line) - indent_level

            # identify closing bracket
            close_bracket = (token_type == tokenize.OP and text in ']})')

            # is the indent relative to an opening bracket line?
            for open_row in reversed(open_rows[depth]):
                hang = rel_indent[row] - rel_indent[open_row]
                hanging_indent = hang in valid_hangs
                if hanging_indent:
                    break
            if hangs[depth]:
                hanging_indent = (hang == hangs[depth])
            # is there any chance of visual indent?
            visual_indent = (not close_bracket and hang > 0 and
                             indent_chances.get(start[1]))

            if close_bracket and indent[depth]:
                # closing bracket for visual indent
                if start[1] != indent[depth]:
                    yield (start, "E124 closing bracket does not match "
                           "visual indentation")
            elif close_bracket and not hang:
                # closing bracket matches indentation of opening
                # bracket's line
                if hang_closing:
                    yield start, "E133 closing bracket is missing indentation"
            elif indent[depth] and start[1] < indent[depth]:
                if visual_indent is not True:
                    # visual indent is broken
                    yield (start, "E128 continuation line "
                           "under-indented for visual indent")
            elif hanging_indent or (indent_next and
                                    rel_indent[row] == 2 * indent_size):
                # hanging indent is verified
                if close_bracket and not hang_closing:
                    yield (start, "E123 closing bracket does not match "
                           "indentation of opening bracket's line")
                hangs[depth] = hang
            elif visual_indent is True:
                # visual indent is verified
                indent[depth] = start[1]
            elif visual_indent in (text, str):
                # ignore token lined up with matching one from a
                # previous line
                pass
            else:
                # indent is broken
                if hang <= 0:
                    error = "E122", "missing indentation or outdented"
                elif indent[depth]:
                    error = "E127", "over-indented for visual indent"
                elif not close_bracket and hangs[depth]:
                    error = "E131", "unaligned for hanging indent"
                else:
                    hangs[depth] = hang
                    if hang > indent_size:
                        error = "E126", "over-indented for hanging indent"
                    else:
                        error = "E121", "under-indented for hanging indent"
                yield start, "%s continuation line %s" % error

        # look for visual indenting
        if (parens[row] and
                token_type not in (tokenize.NL, tokenize.COMMENT) and
                not indent[depth]):
            indent[depth] = start[1]
            indent_chances[start[1]] = True
            if verbose >= 4:
                print(f"bracket depth {depth} indent to {start[1]}")
        # deal with implicit string concatenation
        elif token_type in (tokenize.STRING, tokenize.COMMENT, FSTRING_START):
            indent_chances[start[1]] = str
        # visual indent after assert/raise/with
        elif not row and not depth and text in ["assert", "raise", "with"]:
            indent_chances[end[1] + 1] = True
        # special case for the "if" statement because len("if (") == 4
        elif not indent_chances and not row and not depth and text == 'if':
            indent_chances[end[1] + 1] = True
        elif text == ':' and line[end[1]:].isspace():
            open_rows[depth].append(row)

        # keep track of bracket depth
        if token_type == tokenize.OP:
            if text in '([{':
                depth += 1
                indent.append(0)
                hangs.append(None)
                if len(open_rows) == depth:
                    open_rows.append([])
                open_rows[depth].append(row)
                parens[row] += 1
                if verbose >= 4:
                    print("bracket depth %s seen, col %s, visual min = %s" %
                          (depth, start[1], indent[depth]))
            elif text in ')]}' and depth > 0:
                # parent indents should not be more than this one
                prev_indent = indent.pop() or last_indent[1]
                hangs.pop()
                for d in range(depth):
                    if indent[d] > prev_indent:
                        indent[d] = 0
                for ind in list(indent_chances):
                    if ind >= prev_indent:
                        del indent_chances[ind]
                del open_rows[depth + 1:]
                depth -= 1
                if depth:
                    indent_chances[indent[depth]] = True
                for idx in range(row, -1, -1):
                    if parens[idx]:
                        parens[idx] -= 1
                        break
            assert len(indent) == depth + 1
            if start[1] not in indent_chances:
                # allow lining up tokens
                indent_chances[start[1]] = text

        last_token_multiline = (start[0] != end[0])
        if last_token_multiline:
            rel_indent[end[0] - first_row] = rel_indent[row]

    if indent_next and expand_indent(line) == indent_level + indent_size:
        pos = (start[0], indent[0] + indent_size)
        if visual_indent:
            code = "E129 visually indented line"
        else:
            code = "E125 continuation line"
        yield pos, "%s with same indent as next logical line" % code


@register_check
def whitespace_before_parameters(logical_line, tokens):
    r"""Avoid extraneous whitespace.

    Avoid extraneous whitespace in the following situations:
    - before the open parenthesis that starts the argument list of a
      function call.
    - before the open parenthesis that starts an indexing or slicing.

    Okay: spam(1)
    E211: spam (1)

    Okay: dict['key'] = list[index]
    E211: dict ['key'] = list[index]
    E211: dict['key'] = list [index]
    """
    prev_type, prev_text, __, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, __ = tokens[index]
        if (
            token_type == tokenize.OP and
            text in '([' and
            start != prev_end and
            (prev_type == tokenize.NAME or prev_text in '}])') and
            # Syntax "class A (B):" is allowed, but avoid it
            (index < 2 or tokens[index - 2][1] != 'class') and
            # Allow "return (a.foo for a in range(5))"
            not keyword.iskeyword(prev_text) and
            (
                sys.version_info < (3, 9) or
                # 3.12+: type is a soft keyword but no braces after
                prev_text == 'type' or
                not keyword.issoftkeyword(prev_text)
            )
        ):
            yield prev_end, "E211 whitespace before '%s'" % text
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_operator(logical_line):
    r"""Avoid extraneous whitespace around an operator.

    Okay: a = 12 + 3
    E221: a = 4  + 5
    E222: a = 4 +  5
    E223: a = 4\t+ 5
    E224: a = 4 +\t5
    """
    for match in OPERATOR_REGEX.finditer(logical_line):
        before, after = match.groups()

        if '\t' in before:
            yield match.start(1), "E223 tab before operator"
        elif len(before) > 1:
            yield match.start(1), "E221 multiple spaces before operator"

        if '\t' in after:
            yield match.start(2), "E224 tab after operator"
        elif len(after) > 1:
            yield match.start(2), "E222 multiple spaces after operator"


@register_check
def missing_whitespace(logical_line, tokens):
    r"""Surround operators with the correct amount of whitespace.

    - Always surround these binary operators with a single space on
      either side: assignment (=), augmented assignment (+=, -= etc.),
      comparisons (==, <, >, !=, <=, >=, in, not in, is, is not),
      Booleans (and, or, not).

    - Each comma, semicolon or colon should be followed by whitespace.

    - If operators with different priorities are used, consider adding
      whitespace around the operators with the lowest priorities.

    Okay: i = i + 1
    Okay: submitted += 1
    Okay: x = x * 2 - 1
    Okay: hypot2 = x * x + y * y
    Okay: c = (a + b) * (a - b)
    Okay: foo(bar, key='word', *args, **kwargs)
    Okay: alpha[:-i]
    Okay: [a, b]
    Okay: (3,)
    Okay: a[3,] = 1
    Okay: a[1:4]
    Okay: a[:4]
    Okay: a[1:]
    Okay: a[1:4:2]

    E225: i=i+1
    E225: submitted +=1
    E225: x = x /2 - 1
    E225: z = x **y
    E225: z = 1and 1
    E226: c = (a+b) * (a-b)
    E226: hypot2 = x*x + y*y
    E227: c = a|b
    E228: msg = fmt%(errno, errmsg)
    E231: ['a','b']
    E231: foo(bar,baz)
    E231: [{'a':'b'}]
    """
    need_space = False
    prev_type = tokenize.OP
    prev_text = prev_end = None
    operator_types = (tokenize.OP, tokenize.NAME)
    brace_stack = []
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.OP and text in {'[', '(', '{'}:
            brace_stack.append(text)
        elif token_type == FSTRING_START:  # pragma: >=3.12 cover
            brace_stack.append('f')
        elif token_type == tokenize.NAME and text == 'lambda':
            brace_stack.append('l')
        elif brace_stack:
            if token_type == tokenize.OP and text in {']', ')', '}'}:
                brace_stack.pop()
            elif token_type == FSTRING_END:  # pragma: >=3.12 cover
                brace_stack.pop()
            elif (
                    brace_stack[-1] =+ sed -i '1 i #!/usr/bin/env python3' /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle-2.10.0.py
+ tail -n +2 /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle.py
= 'l' and
                    token_type == tokenize.OP and
                    text == ':'
            ):
                brace_stack.pop()

        if token_type in SKIP_COMMENTS:
            continue

        if token_type == tokenize.OP and text in {',', ';', ':'}:
            next_char = line[end[1]:end[1] + 1]
            if next_char not in WHITESPACE and next_char not in '\r\n':
                # slice
                if text == ':' and brace_stack[-1:] == ['[']:
                    pass
                # 3.12+ fstring format specifier
                elif text == ':' and brace_stack[-2:] == ['f', '{']:  # pragma: >=3.12 cover  # noqa: E501
                    pass
                # tuple (and list for some reason?)
                elif text == ',' and next_char in ')]':
                    pass
                else:
                    yield start, f'E231 missing whitespace after {text!r}'

        if need_space:
            if start != prev_end:
                # Found a (probably) needed space
                if need_space is not True and not need_space[1]:
                    yield (need_space[0],
                           "E225 missing whitespace around operator")
                need_space = False
            elif (
                    # def f(a, /, b):
                    #           ^
                    # def f(a, b, /):
                    #              ^
                    # f = lambda a, /:
                    #                ^
                    prev_text == '/' and text in {',', ')', ':'} or
                    # def f(a, b, /):
                    #               ^
                    prev_text == ')' and text == ':'
            ):
                # Tolerate the "/" operator in function definition
                # For more info see PEP570
                pass
            else:
                if need_space is True or need_space[1]:
                    # A needed trailing space was not found
                    yield prev_end, "E225 missing whitespace around operator"
                elif prev_text != '**':
                    code, optype = 'E226', 'arithmetic'
                    if prev_text == '%':
                        code, optype = 'E228', 'modulo'
                    elif prev_text not in ARITHMETIC_OP:
                        code, optype = 'E227', 'bitwise or shift'
                    yield (need_space[0], "%s missing whitespace "
                           "around %s operator" % (code, optype))
                need_space = False
        elif token_type in operator_types and prev_end is not None:
            if (
                    text == '=' and (
                        # allow lambda default args: lambda x=None: None
                        brace_stack[-1:] == ['l'] or
                        # allow keyword args or defaults: foo(bar=None).
                        brace_stack[-1:] == ['('] or
                        # allow python 3.8 fstring repr specifier
                        brace_stack[-2:] == ['f', '{']
                    )
            ):
                pass
            elif text in WS_NEEDED_OPERATORS:
                need_space = True
            elif text in UNARY_OPERATORS:
                # Check if the operator is used as a binary operator
                # Allow unary operators: -123, -x, +1.
                # Allow argument unpacking: foo(*args, **kwargs).
                if prev_type == tokenize.OP and prev_text in '}])' or (
                    prev_type != tokenize.OP and
                    prev_text not in KEYWORDS and (
                        sys.version_info < (3, 9) or
                        not keyword.issoftkeyword(prev_text)
                    )
                ):
                    need_space = None
            elif text in WS_OPTIONAL_OPERATORS:
                need_space = None

            if need_space is None:
                # Surrounding space is optional, but ensure that
                # trailing space matches opening space
                need_space = (prev_end, start != prev_end)
            elif need_space and start == prev_end:
                # A needed opening space was not found
                yield prev_end, "E225 missing whitespace around operator"
                need_space = False
        prev_type = token_type
        prev_text = text
        prev_end = end


@register_check
def whitespace_around_comma(logical_line):
    r"""Avoid extraneous whitespace after a comma or a colon.

    Note: these checks are disabled by default

    Okay: a = (1, 2)
    E241: a = (1,  2)
    E242: a = (1,\t2)
    """
    line = logical_line
    for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line):
        found = m.start() + 1
        if '\t' in m.group():
            yield found, "E242 tab after '%s'" % m.group()[0]
        else:
            yield found, "E241 multiple spaces after '%s'" % m.group()[0]


@register_check
def whitespace_around_named_parameter_equals(logical_line, tokens):
    r"""Don't use spaces around the '=' sign in function arguments.

    Don't use spaces around the '=' sign when used to indicate a
    keyword argument or a default parameter value, except when
    using a type annotation.

    Okay: def complex(real, imag=0.0):
    Okay: return magic(r=real, i=imag)
    Okay: boolean(a == b)
    Okay: boolean(a != b)
    Okay: boolean(a <= b)
    Okay: boolean(a >= b)
    Okay: def foo(arg: int = 42):
    Okay: async def foo(arg: int = 42):

    E251: def complex(real, imag = 0.0):
    E251: return magic(r = real, i = imag)
    E252: def complex(real, image: float=0.0):
    """
    parens = 0
    no_space = False
    require_space = False
    prev_end = None
    annotated_func_arg = False
    in_def = bool(STARTSWITH_DEF_REGEX.match(logical_line))

    message = "E251 unexpected spaces around keyword / parameter equals"
    missing_message = "E252 missing whitespace around parameter equals"

    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.NL:
            continue
        if no_space:
            no_space = False
            if start != prev_end:
                yield (prev_end, message)
        if require_space:
            require_space = False
            if start == prev_end:
                yield (prev_end, missing_message)
        if token_type == tokenize.OP:
            if text in '([':
                parens += 1
            elif text in ')]':
                parens -= 1
            elif in_def and text == ':' and parens == 1:
                annotated_func_arg = True
            elif parens == 1 and text == ',':
                annotated_func_arg = False
            elif parens and text == '=':
                if annotated_func_arg and parens == 1:
                    require_space = True
                    if start == prev_end:
                        yield (prev_end, missing_message)
                else:
                    no_space = True
                    if start != prev_end:
                        yield (prev_end, message)
            if not parens:
                annotated_func_arg = False

        prev_end = end


@register_check
def whitespace_before_comment(logical_line, tokens):
    """Separate inline comments by at least two spaces.

    An inline comment is a comment on the same line as a statement.
    Inline comments should be separated by at least two spaces from the
    statement. They should start with a # and a single space.

    Each line of a block comment starts with a # and one or multiple
    spaces as there can be indented text inside the comment.

    Okay: x = x + 1  # Increment x
    Okay: x = x + 1    # Increment x
    Okay: # Block comments:
    Okay: #  - Block comment list
    Okay: # \xa0- Block comment list
    E261: x = x + 1 # Increment x
    E262: x = x + 1  #Increment x
    E262: x = x + 1  #  Increment x
    E262: x = x + 1  # \xa0Increment x
    E265: #Block comment
    E266: ### Block comment
    """
    prev_end = (0, 0)
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            inline_comment = line[:start[1]].strip()
            if inline_comment:
                if prev_end[0] == start[0] and start[1] < prev_end[1] + 2:
                    yield (prev_end,
                           "E261 at least two spaces before inline comment")
            symbol, sp, comment = text.partition(' ')
            bad_prefix = symbol not in '#:' and (symbol.lstrip('#')[:1] or '#')
            if inline_comment:
                if bad_prefix or comment[:1] in WHITESPACE:
                    yield start, "E262 inline comment should start with '# '"
            elif bad_prefix and (bad_prefix != '!' or start[0] > 1):
                if bad_prefix != '#':
                    yield start, "E265 block comment should start with '# '"
                elif comment:
                    yield start, "E266 too many leading '#' for block comment"
        elif token_type != tokenize.NL:
            prev_end = end


@register_check
def imports_on_separate_lines(logical_line):
    r"""Place imports on separate lines.

    Okay: import os\nimport sys
    E401: import sys, os

    Okay: from subprocess import Popen, PIPE
    Okay: from myclas import MyClass
    Okay: from foo.bar.yourclass import YourClass
    Okay: import myclass
    Okay: import foo.bar.yourclass
    """
    line = logical_line
    if line.startswith('import '):
        found = line.find(',')
        if -1 < found and ';' not in line[:found]:
            yield found, "E401 multiple imports on one line"


@register_check
def module_imports_on_top_of_file(
        logical_line, indent_level, checker_state, noqa):
    r"""Place imports at the top of the file.

    Always put imports at the top of the file, just after any module
    comments and docstrings, and before module globals and constants.

    Okay: import os
    Okay: # this is a comment\nimport os
    Okay: '''this is a module docstring'''\nimport os
    Okay: r'''this is a module docstring'''\nimport os
    E402: a=1\nimport os
    E402: 'One string'\n"Two string"\nimport os
    E402: a=1\nfrom sys import x

    Okay: if x:\n    import os
    """  # noqa
    def is_string_literal(line):
        if line[0] in 'uUbB':
            line = line[1:]
        if line and line[0] in 'rR':
            line = line[1:]
        return line and (line[0] == '"' or line[0] == "'")

    allowed_keywords = (
        'try', 'except', 'else', 'finally', 'with', 'if', 'elif')

    if indent_level:  # Allow imports in conditional statement/function
        return
    if not logical_line:  # Allow empty lines or comments
        return
    if noqa:
        return
    line = logical_line
    if line.startswith('import ') or line.startswith('from '):
        if checker_state.get('seen_non_imports', False):
            yield 0, "E402 module level import not at top of file"
    elif re.match(DUNDER_REGEX, line):
        return
    elif any(line.startswith(kw) for kw in allowed_keywords):
        # Allow certain keywords intermixed with imports in order to
        # support conditional or filtered importing
        return
    elif is_string_literal(line):
        # The first literal is a docstring, allow it. Otherwise, report
        # error.
        if checker_state.get('seen_docstring', False):
            checker_state['seen_non_imports'] = True
        else:
            checker_state['seen_docstring'] = True
    else:
        checker_state['seen_non_imports'] = True


@register_check
def compound_statements(logical_line):
    r"""Compound statements (on the same line) are generally
    discouraged.

    While sometimes it's okay to put an if/for/while with a small body
    on the same line, never do this for multi-clause statements.
    Also avoid folding such long lines!

    Always use a def statement instead of an assignment statement that
    binds a lambda expression directly to a name.

    Okay: if foo == 'blah':\n    do_blah_thing()
    Okay: do_one()
    Okay: do_two()
    Okay: do_three()

    E701: if foo == 'blah': do_blah_thing()
    E701: for x in lst: total += x
    E701: while t < 10: t = delay()
    E701: if foo == 'blah': do_blah_thing()
    E701: else: do_non_blah_thing()
    E701: try: something()
    E701: finally: cleanup()
    E701: if foo == 'blah': one(); two(); three()
    E702: do_one(); do_two(); do_three()
    E703: do_four();  # useless semicolon
    E704: def f(x): return 2*x
    E731: f = lambda x: 2*x
    """
    line = logical_line
    last_char = len(line) - 1
    found = line.find(':')
    prev_found = 0
    counts = {char: 0 for char in '{}[]()'}
    while -1 < found < last_char:
        update_counts(line[prev_found:found], counts)
        if (
                counts['{'] <= counts['}'] and  # {'a': 1} (dict)
                counts['['] <= counts[']'] and  # [1:2] (slice)
                counts['('] <= counts[')'] and  # (annotation)
                line[found + 1] != '='  # assignment expression
        ):
            lambda_kw = LAMBDA_REGEX.search(line, 0, found)
            if lambda_kw:
                before = line[:lambda_kw.start()].rstrip()
                if before[-1:] == '=' and before[:-1].strip().isidentifier():
                    yield 0, ("E731 do not assign a lambda expression, use a "
                              "def")
                break
            if STARTSWITH_DEF_REGEX.match(line):
                yield 0, "E704 multiple statements on one line (def)"
            elif STARTSWITH_INDENT_STATEMENT_REGEX.match(line):
                yield found, "E701 multiple statements on one line (colon)"
        prev_found = found
        found = line.find(':', found + 1)
    found = line.find(';')
    while -1 < found:
        if found < last_char:
            yield found, "E702 multiple statements on one line (semicolon)"
        else:
            yield found, "E703 statement ends with a semicolon"
        found = line.find(';', found + 1)


@register_check
def explicit_line_join(logical_line, tokens):
    r"""Avoid explicit line join between brackets.

    The preferred way of wrapping long lines is by using Python's
    implied line continuation inside parentheses, brackets and braces.
    Long lines can be broken over multiple lines by wrapping expressions
    in parentheses.  These should be used in preference to using a
    backslash for line continuation.

    E502: aaa = [123, \\n       123]
    E502: aaa = ("bbb " \\n       "ccc")

    Okay: aaa = [123,\n       123]
    Okay: aaa = ("bbb "\n       "ccc")
    Okay: aaa = "bbb " \\n    "ccc"
    Okay: aaa = 123  # \\
    """
    prev_start = prev_end = parens = 0
    comment = False
    backslash = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            comment = True
        if start[0] != prev_start and parens and backslash and not comment:
            yield backslash, "E502 the backslash is redundant between brackets"
        if end[0] != prev_end:
            if line.rstrip('\r\n').endswith('\\'):
                backslash = (end[0], len(line.splitlines()[-1]) - 1)
            else:
                backslash = None
            prev_start = prev_end = end[0]
        else:
            prev_start = start[0]
        if token_type == tokenize.OP:
            if text in '([{':
                parens += 1
            elif text in ')]}':
                parens -= 1


# The % character is strictly speaking a binary operator, but the
# common usage seems to be to put it next to the format parameters,
# after a line break.
_SYMBOLIC_OPS = frozenset("()[]{},:.;@=%~") | frozenset(("...",))


def _is_binary_operator(token_type, text):
    return (
        token_type == tokenize.OP or
        text in {'and', 'or'}
    ) and (
        text not in _SYMBOLIC_OPS
    )


def _break_around_binary_operators(tokens):
    """Private function to reduce duplication.

    This factors out the shared details between
    :func:`break_before_binary_operator` and
    :func:`break_after_binary_operator`.
    """
    line_break = False
    unary_context = True
    # Previous non-newline token types and text
    previous_token_type = None
    previous_text = None
    for token_type, text, start, end, line in tokens:
        if token_type == tokenize.COMMENT:
            continue
        if ('\n' in text or '\r' in text) and token_type != tokenize.STRING:
            line_break = True
        else:
            yield (token_type, text, previous_token_type, previous_text,
                   line_break, unary_context, start)
            unary_context = text in '([{,;'
            line_break = False
            previous_token_type = token_type
            previous_text = text


@register_check
def break_before_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks before binary operators.

    The preferred place to break around a binary operator is after the
    operator, not before it.

    W503: (width == 0\n + height == 0)
    W503: (width == 0\n and height == 0)
    W503: var = (1\n       & ~2)
    W503: var = (1\n       / -2)
    W503: var = (1\n       + -1\n       + -2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)
    """
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(token_type, text) and line_break and
                not unary_context and
                not _is_binary_operator(previous_token_type,
                                        previous_text)):
            yield start, "W503 line break before binary operator"


@register_check
def break_after_binary_operator(logical_line, tokens):
    r"""
    Avoid breaks after binary operators.

    The preferred place to break around a binary operator is before the
    operator, not after it.

    W504: (width == 0 +\n height == 0)
    W504: (width == 0 and\n height == 0)
    W504: var = (1 &\n       ~2)

    Okay: foo(\n    -x)
    Okay: foo(x\n    [])
    Okay: x = '''\n''' + ''
    Okay: x = '' + '''\n'''
    Okay: foo(x,\n    -y)
    Okay: foo(x,  # comment\n    -y)

    The following should be W504 but unary_context is tricky with these
    Okay: var = (1 /\n       -2)
    Okay: var = (1 +\n       -1 +\n       -2)
    """
    prev_start = None
    for context in _break_around_binary_operators(tokens):
        (token_type, text, previous_token_type, previous_text,
         line_break, unary_context, start) = context
        if (_is_binary_operator(previous_token_type, previous_text) and
                line_break and
                not unary_context and
                not _is_binary_operator(token_type, text)):
            yield prev_start, "W504 line break after binary operator"
        prev_start = start


@register_check
def comparison_to_singleton(logical_line, noqa):
    r"""Comparison to singletons should use "is" or "is not".

    Comparisons to singletons like None should always be done
    with "is" or "is not", never the equality operators.

    Okay: if arg is not None:
    E711: if arg != None:
    E711: if None == arg:
    E712: if arg == True:
    E712: if False == arg:

    Also, beware of writing if x when you really mean if x is not None
    -- e.g. when testing whether a variable or argument that defaults to
    None was set to some other value.  The other value might have a type
    (such as a container) that could be false in a boolean context!
    """
    if noqa:
        return

    for match in COMPARE_SINGLETON_REGEX.finditer(logical_line):
        singleton = match.group(1) or match.group(3)
        same = (match.group(2) == '==')

        msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton)
        if singleton in ('None',):
            code = 'E711'
        else:
            code = 'E712'
            nonzero = ((singleton == 'True' and same) or
                       (singleton == 'False' and not same))
            msg += " or 'if %scond:'" % ('' if nonzero else 'not ')
        yield match.start(2), ("%s comparison to %s should be %s" %
                               (code, singleton, msg))


@register_check
def comparison_negative(logical_line):
    r"""Negative comparison should be done using "not in" and "is not".

    Okay: if x not in y:\n    pass
    Okay: assert (X in Y or X is Z)
    Okay: if not (X in Y):\n    pass
    Okay: zz = x is not y
    E713: Z = not X in Y
    E713: if not X.B in Y:\n    pass
    E714: if not X is Y:\n    pass
    E714: Z = not X.B is Y
    """
    match = COMPARE_NEGATIVE_REGEX.search(logical_line)
    if match:
        pos = match.start(1)
        if match.group(2) == 'in':
            yield pos, "E713 test for membership should be 'not in'"
        else:
            yield pos, "E714 test for object identity should be 'is not'"


@register_check
def comparison_type(logical_line, noqa):
    r"""Object type comparisons should `is` / `is not` / `isinstance()`.

    Do not compare types directly.

    Okay: if isinstance(obj, int):
    Okay: if type(obj) is int:
    E721: if type(obj) == type(1):
    """
    match = COMPARE_TYPE_REGEX.search(logical_line)
    if match and not noqa:
        inst = match.group(1)
        if inst and inst.isidentifier() and inst not in SINGLETONS:
            return  # Allow comparison for types which are not obvious
        yield (
            match.start(),
            "E721 do not compare types, for exact checks use `is` / `is not`, "
            "for instance checks use `isinstance()`",
        )


@register_check
def bare_except(logical_line, noqa):
    r"""When catching exceptions, mention specific exceptions when
    possible.

    Okay: except Exception:
    Okay: except BaseException:
    E722: except:
    """
    if noqa:
        return

    match = BLANK_EXCEPT_REGEX.match(logical_line)
    if match:
        yield match.start(), "E722 do not use bare 'except'"


@register_check
def ambiguous_identifier(logical_line, tokens):
    r"""Never use the characters 'l', 'O', or 'I' as variable names.

    In some fonts, these characters are indistinguishable from the
    numerals one and zero. When tempted to use 'l', use 'L' instead.

    Okay: L = 0
    Okay: o = 123
    Okay: i = 42
    E741: l = 0
    E741: O = 123
    E741: I = 42

    Variables can be bound in several other contexts, including class
    and function definitions, lambda functions, 'global' and 'nonlocal'
    statements, exception handlers, and 'with' and 'for' statements.
    In addition, we have a special handling for function parameters.

    Okay: except AttributeError as o:
    Okay: with lock as L:
    Okay: foo(l=12)
    Okay: foo(l=I)
    Okay: for a in foo(l=12):
    Okay: lambda arg: arg * l
    Okay: lambda a=l[I:5]: None
    Okay: lambda x=a.I: None
    Okay: if l >= 12:
    E741: except AttributeError as O:
    E741: with lock as l:
    E741: global I
    E741: nonlocal l
    E741: def foo(l):
    E741: def foo(l=12):
    E741: l = foo(l=12)
    E741: for l in range(10):
    E741: [l for l in lines if l]
    E741: lambda l: None
    E741: lambda a=x[1:5], l: None
    E741: lambda **l:
    E741: def f(**l):
    E742: class I(object):
    E743: def l(x):
    """
    func_depth = None  # set to brace depth if 'def' or 'lambda' is found
    seen_colon = False  # set to true if we're done with function parameters
    brace_depth = 0
    idents_to_avoid = ('l', 'O', 'I')
    prev_type, prev_text, prev_start, prev_end, __ = tokens[0]
    for index in range(1, len(tokens)):
        token_type, text, start, end, line = tokens[index]
        ident = pos = None
        # find function definitions
        if prev_text in {'def', 'lambda'}:
            func_depth = brace_depth
            seen_colon = False
        elif (
                func_depth is not None and
                text == ':' and
                brace_depth == func_depth
        ):
            seen_colon = True
        # update parameter parentheses level
        if text in '([{':
            brace_depth += 1
        elif text in ')]}':
            brace_depth -= 1
        # identifiers on the lhs of an assignment operator
        if text == ':=' or (text == '=' and brace_depth == 0):
            if prev_text in idents_to_avoid:
                ident = prev_text
                pos = prev_start
        # identifiers bound to values with 'as', 'for',
        # 'global', or 'nonlocal'
        if prev_text in ('as', 'for', 'global', 'nonlocal'):
            if text in idents_to_avoid:
                ident = text
                pos = start
        # function / lambda parameter definitions
        if (
                func_depth is not None and
                not seen_colon and
                index < len(tokens) - 1 and tokens[index + 1][1] in ':,=)' and
                prev_text in {'lambda', ',', '*', '**', '('} and
                text in idents_to_avoid
        ):
            ident = text
            pos = start
        if prev_text == 'class':
            if text in idents_to_avoid:
                yield start, "E742 ambiguous class definition '%s'" % text
        if prev_text == 'def':
            if text in idents_to_avoid:
                yield start, "E743 ambiguous function definition '%s'" % text
        if ident:
            yield pos, "E741 ambiguous variable name '%s'" % ident
        prev_text = text
        prev_start = start


@register_check
def python_3000_invalid_escape_sequence(logical_line, tokens, noqa):
    r"""Invalid escape sequences are deprecated in Python 3.6.

    Okay: regex = r'\.png$'
    W605: regex = '\.png$'
    """
    if noqa:
        return

    # https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
    valid = [
        '\n',
        '\\',
        '\'',
        '"',
        'a',
        'b',
        'f',
        'n',
        'r',
        't',
        'v',
        '0', '1', '2', '3', '4', '5', '6', '7',
        'x',

        # Escape sequences only recognized in string literals
        'N',
        'u',
        'U',
    ]

    prefixes = []
    for token_type, text, start, _, _ in tokens:
        if token_type in {tokenize.STRING, FSTRING_START}:
            # Extract string modifiers (e.g. u or r)
            prefixes.append(text[:text.index(text[-1])].lower())

        if token_type in {tokenize.STRING, FSTRING_MIDDLE}:
            if 'r' not in prefixes[-1]:
                start_line, start_col = start
                pos = text.find('\\')
                while pos >= 0:
                    pos += 1
                    if text[pos] not in valid:
                        line = start_line + text.count('\n', 0, pos)
                        if line == start_line:
                            col = start_col + pos
                        else:
                            col = pos - text.rfind('\n', 0, pos) - 1
                        yield (
                            (line, col - 1),
                            f"W605 invalid escape sequence '\\{text[pos]}'"
                        )
                    pos = text.find('\\', pos + 1)

        if token_type in {tokenize.STRING, FSTRING_END}:
            prefixes.pop()


########################################################################
@register_check
def maximum_doc_length(logical_line, max_doc_length, noqa, tokens):
    r"""Limit all doc lines to a maximum of 72 characters.

    For flowing long blocks of text (docstrings or comments), limiting
    the length to 72 characters is recommended.

    Reports warning W505
    """
    if max_doc_length is None or noqa:
        return

    prev_token = None
    skip_lines = set()
    # Skip lines that
    for token_type, text, start, end, line in tokens:
        if token_type not in SKIP_COMMENTS.union([tokenize.STRING]):
            skip_lines.add(line)

    for token_type, text, start, end, line in tokens:
        # Skip lines that aren't pure strings
        if token_type == tokenize.STRING and skip_lines:
            continue
        if token_type in (tokenize.STRING, tokenize.COMMENT):
            # Only check comment-only lines
            if prev_token is None or prev_token in SKIP_TOKENS:
                lines = line.splitlines()
                for line_num, physical_line in enumerate(lines):
                    if start[0] + line_num == 1 and line.startswith('#!'):
                        return
                    length = len(physical_line)
                    chunks = physical_line.split()
                    if token_type == tokenize.COMMENT:
                        if (len(chunks) == 2 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if len(chunks) == 1 and line_num + 1 < len(lines):
                        if (len(chunks) == 1 and
                                length - len(chunks[-1]) < MAX_DOC_LENGTH):
                            continue
                    if length > max_doc_length:
                        doc_error = (start[0] + line_num, max_doc_length)
                        yield (doc_error, "W505 doc line too long "
                                          "(%d > %d characters)"
                               % (length, max_doc_length))
        prev_token = token_type


########################################################################
# Helper functions
########################################################################


def readlines(filename):
    """Read the source code."""
    try:
        with tokenize.open(filename) as f:
            return f.readlines()
    except (LookupError, SyntaxError, UnicodeError):
        # Fall back if file encoding is improperly declared
        with open(filename, encoding='latin-1') as f:
            return f.readlines()


def stdin_get_value():
    """Read the value from stdin."""
    return io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore').read()


noqa = lru_cache(512)(re.compile(r'# no(?:qa|pep8)\b', re.I).search)


def expand_indent(line):
    r"""Return the amount of indentation.

    Tabs are expanded to the next multiple of 8.
    """
    line = line.rstrip('\n\r')
    if '\t' not in line:
        return len(line) - len(line.lstrip())
    result = 0
    for char in line:
        if char == '\t':
            result = result // 8 * 8 + 8
        elif char == ' ':
            result += 1
        else:
            break
    return result


def mute_string(text):
    """Replace contents with 'xxx' to prevent syntax matching."""
    # String modifiers (e.g. u or r)
    start = text.index(text[-1]) + 1
    end = len(text) - 1
    # Triple quotes
    if text[-3:] in ('"""', "'''"):
        start += 2
        end -= 2
    return text[:start] + 'x' * (end - start) + text[end:]


def parse_udiff(diff, patterns=None, parent='.'):
    """Return a dictionary of matching lines."""
    # For each file of the diff, the entry key is the filename,
    # and the value is a set of row numbers to consider.
    rv = {}
    path = nrows = None
    for line in diff.splitlines():
        if nrows:
            if line[:1] != '-':
                nrows -= 1
            continue
        if line[:3] == '@@ ':
            hunk_match = HUNK_REGEX.match(line)
            (row, nrows) = (int(g or '1') for g in hunk_match.groups())
            rv[path].update(range(row, row + nrows))
        elif line[:3] == '+++':
            path = line[4:].split('\t', 1)[0]
            # Git diff will use (i)ndex, (w)ork tree, (c)ommit and
            # (o)bject instead of a/b/c/d as prefixes for patches
            if path[:2] in ('b/', 'w/', 'i/'):
                path = path[2:]
            rv[path] = set()
    return {
        os.path.join(parent, filepath): rows
        for (filepath, rows) in rv.items()
        if rows and filename_match(filepath, patterns)
    }


def normalize_paths(value, parent=os.curdir):
    """Parse a comma-separated list of paths.

    Return a list of absolute paths.
    """
    if not value:
        return []
    if isinstance(value, list):
        return value
    paths = []
    for path in value.split(','):
        path = path.strip()
        if '/' in path:
            path = os.path.abspath(os.path.join(parent, path))
        paths.append(path.rstrip('/'))
    return paths


def filename_match(filename, patterns, default=True):
    """Check if patterns contains a pattern that matches filename.

    If patterns is unspecified, this always returns True.
    """
    if not patterns:
        return default
    return any(fnmatch(filename, pattern) for pattern in patterns)


def update_counts(s, counts):
    r"""Adds one to the counts of each appearance of characters in s,
        for characters in counts"""
    for char in s:
        if char in counts:
            counts[char] += 1


def _is_eol_token(token):
    return token[0] in NEWLINE or token[4][token[3][1]:].lstrip() == '\\\n'


########################################################################
# Framework to run all checks
########################################################################


class Checker:
    """Load a Python source file, tokenize it, check coding style."""

    def __init__(self, filename=None, lines=None,
                 options=None, report=None, **kwargs):
        if options is None:
            options = StyleGuide(kwargs).options
        else:
            assert not kwargs
        self._io_error = None
        self._physical_checks = options.physical_checks
        self._logical_checks = options.logical_checks
        self._ast_checks = options.ast_checks
        self.max_line_length = options.max_line_length
        self.max_doc_length = options.max_doc_length
        self.indent_size = options.indent_size
        self.fstring_start = 0
        self.multiline = False  # in a multiline string?
        self.hang_closing = options.hang_closing
        self.indent_size = options.indent_size
        self.verbose = options.verbose
        self.filename = filename
        # Dictionary where a checker can store its custom state.
        self._checker_states = {}
        if filename is None:
            self.filename = 'stdin'
            self.lines = lines or []
        elif filename == '-':
            self.filename = 'stdin'
            self.lines = stdin_get_value().splitlines(True)
        elif lines is None:
            try:
                self.lines = readlines(filename)
            except OSError:
                (exc_type, exc) = sys.exc_info()[:2]
                self._io_error = f'{exc_type.__name__}: {exc}'
                self.lines = []
        else:
            self.lines = lines
        if self.lines:
            ord0 = ord(self.lines[0][0])
            if ord0 in (0xef, 0xfeff):  # Strip the UTF-8 BOM
                if ord0 == 0xfeff:
                    self.lines[0] = self.lines[0][1:]
                elif self.lines[0][:3] == '\xef\xbb\xbf':
                    self.lines[0] = self.lines[0][3:]
        self.report = report or options.report
        self.report_error = self.report.error
        self.noqa = False

    def report_invalid_syntax(self):
        """Check if the syntax is valid."""
        (exc_type, exc) = sys.exc_info()[:2]
        if len(exc.args) > 1:
            offset = exc.args[1]
            if len(offset) > 2:
                offset = offset[1:3]
        else:
            offset = (1, 0)
        self.report_error(offset[0], offset[1] or 0,
                          f'E901 {exc_type.__name__}: {exc.args[0]}',
                          self.report_invalid_syntax)

    def readline(self):
        """Get the next line from the input buffer."""
        if self.line_number >= self.total_lines:
            return ''
        line = self.lines[self.line_number]
        self.line_number += 1
        if self.indent_char is None and line[:1] in WHITESPACE:
            self.indent_char = line[0]
        return line

    def run_check(self, check, argument_names):
        """Run a check plugin."""
        arguments = []
        for name in argument_names:
            arguments.append(getattr(self, name))
        return check(*arguments)

    def init_checker_state(self, name, argument_names):
        """Prepare custom state for the specific checker plugin."""
        if 'checker_state' in argument_names:
            self.checker_state = self._checker_states.setdefault(name, {})

    def check_physical(self, line):
        """Run all physical checks on a raw input line."""
        self.physical_line = line
        for name, check, argument_names in self._physical_checks:
            self.init_checker_state(name, argument_names)
            result = self.run_check(check, argument_names)
            if result is not None:
                (offset, text) = result
                self.report_error(self.line_number, offset, text, check)
                if text[:4] == 'E101':
                    self.indent_char = line[0]

    def build_tokens_line(self):
        """Build a logical line from tokens."""
        logical = []
        comments = []
        length = 0
        prev_row = prev_col = mapping = None
        for token_type, text, start, end, line in self.tokens:
            if token_type in SKIP_TOKENS:
                continue
            if not mapping:
                mapping = [(0, start)]
            if token_type == tokenize.COMMENT:
                comments.append(text)
                continue
            if token_type == tokenize.STRING:
                text = mute_string(text)
            elif token_type == FSTRING_MIDDLE:  # pragma: >=3.12 cover
                text = 'x' * len(text)
            if prev_row:
                (start_row, start_col) = start
                if prev_row != start_row:    # different row
                    prev_text = self.lines[prev_row - 1][prev_col - 1]
                    if prev_text == ',' or (prev_text not in '{[(' and
                                            text not in '}])'):
                        text = ' ' + text
                elif prev_col != start_col:  # different column
                    text = line[prev_col:start_col] + text
            logical.append(text)
            length += len(text)
            mapping.append((length, end))
            (prev_row, prev_col) = end
        self.logical_line = ''.join(logical)
        self.noqa = comments and noqa(''.join(comments))
        return mapping

    def check_logical(self):
        """Build a line from tokens and run all logical checks on it."""
        self.report.increment_logical_line()
        mapping = self.build_tokens_line()
        if not mapping:
            return

        mapping_offsets = [offset for offset, _ in mapping]
        (start_row, start_col) = mapping[0][1]
        start_line = self.lines[start_row - 1]
        self.indent_level = expand_indent(start_line[:start_col])
        if self.blank_before < self.blank_lines:
            self.blank_before = self.blank_lines
        if self.verbose >= 2:
            print(self.logical_line[:80].rstrip())
        for name, check, argument_names in self._logical_checks:
            if self.verbose >= 4:
                print('   ' + name)
            self.init_checker_state(name, argument_names)
            for offset, text in self.run_check(check, argument_names) or ():
                if not isinstance(offset, tuple):
                    # As mappings are ordered, bisecting is a fast way
                    # to find a given offset in them.
                    token_offset, pos = mapping[bisect.bisect_left(
                        mapping_offsets, offset)]
                    offset = (pos[0], pos[1] + offset - token_offset)
                self.report_error(offset[0], offset[1], text, check)
        if self.logical_line:
            self.previous_indent_level = self.indent_level
            self.previous_logical = self.logical_line
            if not self.indent_level:
                self.previous_unindented_logical_line = self.logical_line
        self.blank_lines = 0
        self.tokens = []

    def check_ast(self):
        """Build the file's AST and run all AST checks."""
        try:
            tree = compile(''.join(self.lines), '', 'exec', PyCF_ONLY_AST)
        except (ValueError, SyntaxError, TypeError):
            return self.report_invalid_syntax()
        for name, cls, __ in self._ast_checks:
            checker = cls(tree, self.filename)
            for lineno, offset, text, check in checker.run():
                if not self.lines or not noqa(self.lines[lineno - 1]):
                    self.report_error(lineno, offset, text, check)

    def generate_tokens(self):
        """Tokenize file, run physical line checks and yield tokens."""
        if self._io_error:
            self.report_error(1, 0, 'E902 %s' % self._io_error, readlines)
        tokengen = tokenize.generate_tokens(self.readline)
        try:
            prev_physical = ''
            for token in tokengen:
                if token[2][0] > self.total_lines:
                    return
                self.noqa = token[4] and noqa(token[4])
                self.maybe_check_physical(token, prev_physical)
                yield token
                prev_physical = token[4]
        except (SyntaxError, tokenize.TokenError):
            self.report_invalid_syntax()

    def maybe_check_physical(self, token, prev_physical):
        """If appropriate for token, check current physical line(s)."""
        # Called after every token, but act only on end of line.

        if token.type == FSTRING_START:  # pragma: >=3.12 cover
            self.fstring_start = token.start[0]
        # a newline token ends a single physical line.
        elif _is_eol_token(token):
            # if the file does not end with a newline, the NEWLINE
            # token is inserted by the parser, but it does not contain
            # the previous physical line in `token[4]`
            if token.line == '':
                self.check_physical(prev_physical)
            else:
                self.check_physical(token.line)
        elif (
                token.type == tokenize.STRING and '\n' in token.string or
                token.type == FSTRING_END
        ):
            # Less obviously, a string that contains newlines is a
            # multiline string, either triple-quoted or with internal
            # newlines backslash-escaped. Check every physical line in
            # the string *except* for the last one: its newline is
            # outside of the multiline string, so we consider it a
            # regular physical line, and will check it like any other
            # physical line.
            #
            # Subtleties:
            # - we don't *completely* ignore the last line; if it
            #   contains the magical "# noqa" comment, we disable all
            #   physical checks for the entire multiline string
            # - have to wind self.line_number back because initially it
            #   points to the last line of the string, and we want
            #   check_physical() to give accurate feedback
            if noqa(token.line):
                return
            if token.type == FSTRING_END:  # pragma: >=3.12 cover
                start = self.fstring_start
            else:
                start = token.start[0]
            end = token.end[0]

            self.multiline = True
            self.line_number = start
            for line_number in range(start, end):
                self.check_physical(self.lines[line_number - 1] + '\n')
                self.line_number += 1
            self.multiline = False

    def check_all(self, expected=None, line_offset=0):
        """Run all checks on the input file."""
        self.report.init_file(self.filename, self.lines, expected, line_offset)
        self.total_lines = len(self.lines)
        if self._ast_checks:
            self.check_ast()
        self.line_number = 0
        self.indent_char = None
        self.indent_level = self.previous_indent_level = 0
        self.previous_logical = ''
        self.previous_unindented_logical_line = ''
        self.tokens = []
        self.blank_lines = self.blank_before = 0
        parens = 0
        for token in self.generate_tokens():
            self.tokens.append(token)
            token_type, text = token[0:2]
            if self.verbose >= 3:
                if token[2][0] == token[3][0]:
                    pos = '[{}:{}]'.format(token[2][1] or '', token[3][1])
                else:
                    pos = 'l.%s' % token[3][0]
                print('l.%s\t%s\t%s\t%r' %
                      (token[2][0], pos, tokenize.tok_name[token[0]], text))
            if token_type == tokenize.OP:
                if text in '([{':
                    parens += 1
                elif text in '}])':
                    parens -= 1
            elif not parens:
                if token_type in NEWLINE:
                    if token_type == tokenize.NEWLINE:
                        self.check_logical()
                        self.blank_before = 0
                    elif len(self.tokens) == 1:
                        # The physical line contains only this token.
                        self.blank_lines += 1
                        del self.tokens[0]
                    else:
                        self.check_logical()
        if self.tokens:
            self.check_physical(self.lines[-1])
            self.check_logical()
        return self.report.get_file_results()


class BaseReport:
    """Collect the results of the checks."""

    print_filename = False

    def __init__(self, options):
        self._benchmark_keys = options.benchmark_keys
        self._ignore_code = options.ignore_code
        # Results
        self.elapsed = 0
        self.total_errors = 0
        self.counters = dict.fromkeys(self._benchmark_keys, 0)
        self.messages = {}

    def start(self):
        """Start the timer."""
        self._start_time = time.time()

    def stop(self):
        """Stop the timer."""
        self.elapsed = time.time() - self._start_time

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self.filename = filename
        self.lines = lines
        self.expected = expected or ()
        self.line_offset = line_offset
        self.file_errors = 0
        self.counters['files'] += 1
        self.counters['physical lines'] += len(lines)

    def increment_logical_line(self):
        """Signal a new logical line."""
        self.counters['logical lines'] += 1

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = text[:4]
        if self._ignore_code(code):
            return
        if code in self.counters:
            self.counters[code] += 1
        else:
            self.counters[code] = 1
            self.messages[code] = text[5:]
        # Don't care about expected errors or warnings
        if code in self.expected:
            return
        if self.print_filename and not self.file_errors:
            print(self.filename)
        self.file_errors += 1
        self.total_errors += 1
        return code

    def get_file_results(self):
        """Return the count of errors and warnings for this file."""
        return self.file_errors

    def get_count(self, prefix=''):
        """Return the total count of errors and warnings."""
        return sum(self.counters[key]
                   for key in self.messages if key.startswith(prefix))

    def get_statistics(self, prefix=''):
        """Get statistics for message codes that start with the prefix.

        prefix='' matches all errors and warnings
        prefix='E' matches all errors
        prefix='W' matches all warnings
        prefix='E4' matches all errors that have to do with imports
        """
        return ['%-7s %s %s' % (self.counters[key], key, self.messages[key])
                for key in sorted(self.messages) if key.startswith(prefix)]

    def print_statistics(self, prefix=''):
        """Print overall statistics (number of errors and warnings)."""
        for line in self.get_statistics(prefix):
            print(line)

    def print_benchmark(self):
        """Print benchmark numbers."""
        print('{:<7.2f} {}'.format(self.elapsed, 'seconds elapsed'))
        if self.elapsed:
            for key in self._benchmark_keys:
                print('%-7d %s per second (%d total)' %
                      (self.counters[key] / self.elapsed, key,
                       self.counters[key]))


class FileReport(BaseReport):
    """Collect the results of the checks and print the filenames."""

    print_filename = True


class StandardReport(BaseReport):
    """Collect and print the results of the checks."""

    def __init__(self, options):
        super().__init__(options)
        self._fmt = REPORT_FORMAT.get(options.format.lower(),
                                      options.format)
        self._repeat = options.repeat
        self._show_source = options.show_source
        self._show_pep8 = options.show_pep8

    def init_file(self, filename, lines, expected, line_offset):
        """Signal a new file."""
        self._deferred_print = []
        return super().init_file(
            filename, lines, expected, line_offset)

    def error(self, line_number, offset, text, check):
        """Report an error, according to options."""
        code = super().error(line_number, offset, text, check)
        if code and (self.counters[code] == 1 or self._repeat):
            self._deferred_print.append(
                (line_number, offset, code, text[5:], check.__doc__))
        return code

    def get_file_results(self):
        """Print results and return the overall count for this file."""
        self._deferred_print.sort()
        for line_number, offset, code, text, doc in self._deferred_print:
            print(self._fmt % {
                'path': self.filename,
                'row': self.line_offset + line_number, 'col': offset + 1,
                'code': code, 'text': text,
            })
            if self._show_source:
                if line_number > len(self.lines):
                    line = ''
                else:
                    line = self.lines[line_number - 1]
                print(line.rstrip())
                print(re.sub(r'\S', ' ', line[:offset]) + '^')
            if self._show_pep8 and doc:
                print('    ' + doc.strip())

            # stdout is block buffered when not stdout.isatty().
            # line can be broken where buffer boundary since other
            # processes write to same file.
            # flush() after print() to avoid buffer boundary.
            # Typical buffer size is 8192. line written safely when
            # len(line) < 8192.
            sys.stdout.flush()
        return self.file_errors


class DiffReport(StandardReport):
    """Collect and print the results for the changed lines only."""

    def __init__(self, options):
        super().__init__(options)
        self._selected = options.selected_lines

    def error(self, line_number, offset, text, check):
        if line_number not in self._selected[self.filename]:
            return
        return super().error(line_number, offset, text, check)


class StyleGuide:
    """Initialize a PEP-8 instance with few options."""

    def __init__(self, *args, **kwargs):
        # build options from the command line
        self.checker_class = kwargs.pop('checker_class', Checker)
        parse_argv = kwargs.pop('parse_argv', False)
        config_file = kwargs.pop('config_file', False)
        parser = kwargs.pop('parser', None)
        # build options from dict
        options_dict = dict(*args, **kwargs)
        arglist = None if parse_argv else options_dict.get('paths', None)
        verbose = options_dict.get('verbose', None)
        options, self.paths = process_options(
            arglist, parse_argv, config_file, parser, verbose)
        if options_dict:
            options.__dict__.update(options_dict)
            if 'paths' in options_dict:
                self.paths = options_dict['paths']

        self.runner = self.input_file
        self.options = options

        if not options.reporter:
            options.reporter = BaseReport if options.quiet else StandardReport

        options.select = tuple(options.select or ())
        if not (options.select or options.ignore) and DEFAULT_IGNORE:
            # The default choice: ignore controversial checks
            options.ignore = tuple(DEFAULT_IGNORE.split(','))
        else:
            # Ignore all checks which are not explicitly selected
            options.ignore = ('',) if options.select else tuple(options.ignore)
        options.benchmark_keys = BENCHMARK_KEYS[:]
        options.ignore_code = self.ignore_code
        options.physical_checks = self.get_checks('physical_line')
        options.logical_checks = self.get_checks('logical_line')
        options.ast_checks = self.get_checks('tree')
        self.init_report()

    def init_report(self, reporter=None):
        """Initialize the report instance."""
        self.options.report = (reporter or self.options.reporter)(self.options)
        return self.options.report

    def check_files(self, paths=None):
        """Run all checks on the paths."""
        if paths is None:
            paths = self.paths
        report = self.options.report
        runner = self.runner
        report.start()
        try:
            for path in paths:
                if os.path.isdir(path):
                    self.input_dir(path)
                elif not self.excluded(path):
                    runner(path)
        except KeyboardInterrupt:
            print('... stopped')
        report.stop()
        return report

    def input_file(self, filename, lines=None, expected=None, line_offset=0):
        """Run all checks on a Python source file."""
        if self.options.verbose:
            print('checking %s' % filename)
        fchecker = self.checker_class(
            filename, lines=lines, options=self.options)
        return fchecker.check_all(expected=expected, line_offset=line_offset)

    def input_dir(self, dirname):
        """Check all files in this directory and all subdirectories."""
        dirname = dirname.rstrip('/')
        if self.excluded(dirname):
            return 0
        counters = self.options.report.counters
        verbose = self.options.verbose
        filepatterns = self.options.filename
        runner = self.runner
        for root, dirs, files in os.walk(dirname):
            if verbose:
                print('directory ' + root)
            counters['directories'] += 1
            for subdir in sorted(dirs):
                if self.excluded(subdir, root):
                    dirs.remove(subdir)
            for filename in sorted(files):
                # contain a pattern that matches?
                if (
                    filename_match(filename, filepatterns) and
                    not self.excluded(filename, root)
                ):
                    runner(os.path.join(root, filename))

    def excluded(self, filename, parent=None):
        """Check if the file should be excluded.

        Check if 'options.exclude' contains a pattern matching filename.
        """
        if not self.options.exclude:
            return False
        basename = os.path.basename(filename)
        if filename_match(basename, self.options.exclude):
            return True
        if parent:
            filename = os.path.join(parent, filename)
        filename = os.path.abspath(filename)
        return filename_match(filename, self.options.exclude)

    def ignore_code(self, code):
        """Check if the error code should be ignored.

        If 'options.select' contains a prefix of the error code,
        return False.  Else, if 'options.ignore' contains a prefix of
        the error code, return True.
        """
        if len(code) < 4 and any(s.startswith(code)
                                 for s in self.options.select):
            return False
        return (code.startswith(self.options.ignore) and
                not code.startswith(self.options.select))

    def get_checks(self, argument_name):
        """Get all the checks for this category.

        Find all globally visible functions where the first argument
        name starts with argument_name and which contain selected tests.
        """
        checks = []
        for check, attrs in _checks[argument_name].items():
            (codes, args) = attrs
            if any(not (code and self.ignore_code(code)) for code in codes):
                checks.append((check.__name__, check, args))
        return sorted(checks)


def get_parser(prog='pycodestyle', version=__version__):
    """Create the parser for the program."""
    parser = OptionParser(prog=prog, version=version,
                          usage="%prog [options] input ...")
    parser.config_options = [
        'exclude', 'filename', 'select', 'ignore', 'max-line-length',
        'max-doc-length', 'indent-size', 'hang-closing', 'count', 'format',
        'quiet', 'show-pep8', 'show-source', 'statistics', 'verbose']
    parser.add_option('-v', '--verbose', default=0, action='count',
                      help="print status messages, or debug with -vv")
    parser.add_option('-q', '--quiet', default=0, action='count',
                      help="report only file names, or nothing with -qq")
    parser.add_option('-r', '--repeat', default=True, action='store_true',
                      help="(obsolete) show all occurrences of the same error")
    parser.add_option('--first', action='store_false', dest='repeat',
                      help="show first occurrence of each error")
    parser.add_option('--exclude', metavar='patterns', default=DEFAULT_EXCLUDE,
                      help="exclude files or directories which match these "
                           "comma separated patterns (default: %default)")
    parser.add_option('--filename', metavar='patterns', default='*.py',
                      help="when parsing directories, only check filenames "
                           "matching these comma separated patterns "
                           "(default: %default)")
    parser.add_option('--select', metavar='errors', default='',
                      help="select errors and warnings (e.g. E,W6)")
    parser.add_option('--ignore', metavar='errors', default='',
                      help="skip errors and warnings (e.g. E4,W) "
                           "(default: %s)" % DEFAULT_IGNORE)
    parser.add_option('--show-source', action='store_true',
                      help="show source code for each error")
    parser.add_option('--show-pep8', action='store_true',
                      help="show text of PEP 8 for each error "
                           "(implies --first)")
    parser.add_option('--statistics', action='store_true',
                      help="count errors and warnings")
    parser.add_option('--count', action='store_true',
                      help="print total number of errors and warnings "
                           "to standard error and set exit code to 1 if "
                           "total is not null")
    parser.add_option('--max-line-length', type='int', metavar='n',
                      default=MAX_LINE_LENGTH,
                      help="set maximum allowed line length "
                           "(default: %default)")
    parser.add_option('--max-doc-length', type='int', metavar='n',
                      default=None,
                      help="set maximum allowed doc line length and perform "
                           "these checks (unchecked if not set)")
    parser.add_option('--indent-size', type='int', metavar='n',
                      default=INDENT_SIZE,
                      help="set how many spaces make up an indent "
                           "(default: %default)")
    parser.add_option('--hang-closing', action='store_true',
                      help="hang closing bracket instead of matching "
                           "indentation of opening bracket's line")
    parser.add_option('--format', metavar='format', default='default',
                      help="set the error format [default|pylint|<custom>]")
    parser.add_option('--diff', action='store_true',
                      help="report changes only within line number ranges in "
                           "the unified diff received on STDIN")
    group = parser.add_option_group("Testing Options")
    group.add_option('--benchmark', action='store_true',
                     help="measure processing speed")
    return parser


def read_config(options, args, arglist, parser):
    """Read and parse configurations.

    If a config file is specified on the command line with the
    "--config" option, then only it is used for configuration.

    Otherwise, the user configuration (~/.config/pycodestyle) and any
    local configurations in the current directory or above will be
    merged together (in that order) using the read method of
    ConfigParser.
    """
    config = configparser.RawConfigParser()

    cli_conf = options.config

    local_dir = os.curdir

    if USER_CONFIG and os.path.isfile(USER_CONFIG):
        if options.verbose:
            print('user configuration: %s' % USER_CONFIG)
        config.read(USER_CONFIG)

    parent = tail = args and os.path.abspath(os.path.commonprefix(args))
    while tail:
        if config.read(os.path.join(parent, fn) for fn in PROJECT_CONFIG):
            local_dir = parent
            if options.verbose:
                print('local configuration: in %s' % parent)
            break
        (parent, tail) = os.path.split(parent)

    if cli_conf and os.path.isfile(cli_conf):
        if options.verbose:
            print('cli configuration: %s' % cli_conf)
        config.read(cli_conf)

    pycodestyle_section = None
    if config.has_section(parser.prog):
        pycodestyle_section = parser.prog
    elif config.has_section('pep8'):
        pycodestyle_section = 'pep8'  # Deprecated
        warnings.warn('[pep8] section is deprecated. Use [pycodestyle].')

    if pycodestyle_section:
        option_list = {o.dest: o.type or o.action for o in parser.option_list}

        # First, read the default values
        (new_options, __) = parser.parse_args([])

        # Second, parse the configuration
        for opt in config.options(pycodestyle_section):
            if opt.replace('_', '-') not in parser.config_options:
                print("  unknown option '%s' ignored" % opt)
                continue
            if options.verbose > 1:
                print("  {} = {}".format(opt,
                                         config.get(pycodestyle_section, opt)))
            normalized_opt = opt.replace('-', '_')
            opt_type = option_list[normalized_opt]
            if opt_type in ('int', 'count'):
                value = config.getint(pycodestyle_section, opt)
            elif opt_type in ('store_true', 'store_false'):
                value = config.getboolean(pycodestyle_section, opt)
            else:
                value = config.get(pycodestyle_section, opt)
                if normalized_opt == 'exclude':
                    value = normalize_paths(value, local_dir)
            setattr(new_options, normalized_opt, value)

        # Third, overwrite with the command-line options
        (options, __) = parser.parse_args(arglist, values=new_options)
    return options


def process_options(arglist=None, parse_argv=False, config_file=None,
                    parser=None, verbose=None):
    """Process options passed either via arglist or command line args.

    Passing in the ``config_file`` parameter allows other tools, such as
    flake8 to specify their own options to be processed in pycodestyle.
    """
    if not parser:
        parser = get_parser()
    if not parser.has_option('--config'):
        group = parser.add_option_group("Configuration", description=(
            "The project options are read from the [%s] section of the "
            "tox.ini file or the setup.cfg file located in any parent folder "
            "of the path(s) being processed.  Allowed options are: %s." %
            (parser.prog, ', '.join(parser.config_options))))
        group.add_option('--config', metavar='path', default=config_file,
                         help="user config file location")
    # Don't read the command line if the module is used as a library.
    if not arglist and not parse_argv:
        arglist = []
    # If parse_argv is True and arglist is None, arguments are
    # parsed from the command line (sys.argv)
    (options, args) = parser.parse_args(arglist)
    options.reporter = None

    # If explicitly specified verbosity, override any `-v` CLI flag
    if verbose is not None:
        options.verbose = verbose

    if parse_argv and not args:
        if options.diff or any(os.path.exists(name)
                               for name in PROJECT_CONFIG):
            args = ['.']
        else:
            parser.error('input not specified')
    options = read_config(options, args, arglist, parser)
    options.reporter = parse_argv and options.quiet == 1 and FileReport

    options.filename = _parse_multi_options(options.filename)
    options.exclude = normalize_paths(options.exclude)
    options.select = _parse_multi_options(options.select)
    options.ignore = _parse_multi_options(options.ignore)

    if options.diff:
        options.reporter = DiffReport
        stdin = stdin_get_value()
        options.selected_lines = parse_udiff(stdin, options.filename, args[0])
        args = sorted(options.selected_lines)

    return options, args


def _parse_multi_options(options, split_token=','):
    r"""Split and strip and discard empties.

    Turns the following:

    A,
    B,

    into ["A", "B"]
    """
    if options:
        return [o.strip() for o in options.split(split_token) if o.strip()]
    else:
        return options


def _main():
    """Parse options and run checks on Python source."""
    import signal

    # Handle "Broken pipe" gracefully
    try:
        signal.signal(signal.SIGPIPE, lambda signum, frame: sys.exit(1))
    except AttributeError:
        pass    # not supported on Windows

    style_guide = StyleGuide(parse_argv=True)
    options = style_guide.options

    report = style_guide.check_files()

    if options.statistics:
        report.print_statistics()

    if options.benchmark:
        report.print_benchmark()

    if report.total_errors:
        if options.count:
            sys.stderr.write(str(report.total_errors) + '\n')
        sys.exit(1)


if __name__ == '__main__':
    _main()
+ sed -i '1 i #!/usr/bin/env python3' /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle.py
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-ldconfig
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip /bin/true
+ /usr/lib/rpm/brp-strip-comment-note /bin/true /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-lto /bin/true
+ /usr/lib/rpm/brp-strip-static-archive /bin/true
+ /usr/lib/rpm/redhat/brp-mangle-shebangs
mangling shebang in /usr/share/java/pycharm-community/bin/pycharm.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/format.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/ltedit.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/jetbrains_client.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/bin/inspect.sh from /bin/sh to #!/usr/bin/sh
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/typeshed/scripts/sync_s2clientprotocol_protobuf_stubs.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/typeshed/scripts/generate_proto_stubs.sh from /usr/bin/env bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/typeshed/scripts/sync_tensorflow_protobuf_stubs.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_linux.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_mac.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/linux_and_mac/compile_linux_aarch64.sh from /bin/bash to #!/usr/bin/bash
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle-2.10.0.py from /usr/bin/env python3 to #!/usr/bin/python3
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/py3only/docutils/utils/math/math2html.py from /usr/bin/env python3 to #!/usr/bin/python3
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/py3only/docutils/writers/odf_odt/prepstyles.py from /usr/bin/env python3 to #!/usr/bin/python3
mangling shebang in /usr/share/java/pycharm-community/plugins/python-ce/helpers/pycodestyle.py from /usr/bin/env python3 to #!/usr/bin/python3
*** WARNING: ./usr/share/java/pycharm-community/plugins/python-ce/helpers/pockets/autolog.py is executable but has no shebang, removing executable bit
+ /usr/lib/rpm/brp-remove-la-files
+ env
SHELL=/bin/bash
RPM_SOURCE_DIR=/builddir/build/SOURCES
HISTCONTROL=ignoredups
PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig
HOSTNAME=482d9a3ac5f244b780e8e462cec04fdd
HISTSIZE=1000
RPM_SPECPARTS_DIR=/builddir/build/BUILD/pycharm-community-2024.3.2-SPECPARTS
container_host_version_id=41
FFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules 
PWD=/builddir/build/BUILD/pycharm-community-2024.3.2
SOURCE_DATE_EPOCH=1738022400
LOGNAME=mockbuild
CXX=g++
CXXFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer 
RPM_ARCH=x86_64
container=systemd-nspawn
LDFLAGS=-Wl,-z,relro -Wl,--as-needed  -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes 
HOME=/builddir
LANG=C.UTF-8
RPM_LD_FLAGS=-Wl,-z,relro -Wl,--as-needed  -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes 
RUSTFLAGS=-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn
PROMPT_COMMAND=printf "\033]0;<mock-chroot>\007"
RPM_PACKAGE_RELEASE=1.fc40
RPM_OS=linux
LT_SYS_LIBRARY_PATH=/usr/lib64:
FCFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules 
TERM=vt100
USER=mockbuild
NOTIFY_SOCKET=/run/host/notify
SHLVL=1
RPM_BUILD_DIR=/builddir/build/BUILD
container_host_id=fedora
RPM_OPT_FLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
VALAFLAGS=-g
RPM_DOC_DIR=/usr/share/doc
RPM_PACKAGE_VERSION=2024.3.2
DEBUGINFOD_IMA_CERT_PATH=/etc/keys/ima:
container_host_variant_id=cloud
CONFIG_SITE=NONE
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin
CC=gcc
CFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer 
MAIL=/var/spool/mail/mockbuild
RPM_BUILD_NCPUS=2
container_uuid=ec271218-f468-4232-836b-5b0581c32ae6
RPM_PACKAGE_NAME=pycharm-community
RPM_BUILD_ROOT=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64
OLDPWD=/builddir/build/BUILD
_=/usr/bin/env
+ /usr/lib/rpm/redhat/brp-python-hardlink
Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.OixIBM
+ umask 022
+ cd /builddir/build/BUILD
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules '
+ export FCFLAGS
+ VALAFLAGS=-g
+ export VALAFLAGS
+ RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn'
+ export RUSTFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed  -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes '
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib64:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd pycharm-community-2024.3.2
+ appstream-util validate-relax --nonet /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/metainfo/pycharm-community.metainfo.xml
/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/metainfo/pycharm-community.metainfo.xml: OK
+ desktop-file-validate /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/applications/pycharm-community.desktop
+ RPM_EC=0
++ jobs -p
+ exit 0
Processing files: pycharm-community-2024.3.2-1.fc40.x86_64
Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.uGqei4
+ umask 022
+ cd /builddir/build/BUILD
+ cd pycharm-community-2024.3.2
+ LICENSEDIR=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ export LC_ALL=
+ LC_ALL=
+ export LICENSEDIR
+ /usr/bin/mkdir -p /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/LICENSE.txt /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/NOTICE.txt /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/javahelp_license.txt /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/javolution_license.txt /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/launcher-third-party-libraries.html /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/saxon-conditions.html /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/third-party-libraries.html /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/third-party-libraries.json /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/license/yourkit-license-redist.txt /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/licenses/pycharm-community
+ RPM_EC=0
++ jobs -p
+ exit 0
warning: absolute symlink: /usr/bin/pycharm-community -> /usr/share/java/pycharm-community/bin/pycharm
Provides: application() application(pycharm-community.desktop) metainfo() metainfo(pycharm-community.metainfo.xml) mimehandler(application/x-python-code) mimehandler(application/xml) mimehandler(text/markdown) mimehandler(text/plain) mimehandler(text/x-python) pycharm-community = 2024.3.2-1.fc40 pycharm-community(x86-64) = 2024.3.2-1.fc40
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /usr/bin/sh libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.15)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.9)(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_3.3)(64bit) libgcc_s.so.1(GCC_4.2.0)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.12)(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) librt.so.1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) rtld(GNU_HASH)
Obsoletes: pycharm-community-jre < 2024.3.2-1.fc40
Processing files: pycharm-community-doc-2024.3.2-1.fc40.noarch
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.bzNLhy
+ umask 022
+ cd /builddir/build/BUILD
+ cd pycharm-community-2024.3.2
+ DOCDIR=/builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/doc/pycharm-community-doc
+ export LC_ALL=
+ LC_ALL=
+ export DOCDIR
+ /usr/bin/mkdir -p /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/doc/pycharm-community-doc
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/help /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/doc/pycharm-community-doc
+ cp -pr /builddir/build/BUILD/pycharm-community-2024.3.2/Install-Linux-tar.txt /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64/usr/share/doc/pycharm-community-doc
+ RPM_EC=0
++ jobs -p
+ exit 0
Provides: pycharm-community-doc = 2024.3.2-1.fc40
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64
Wrote: /builddir/build/RPMS/pycharm-community-doc-2024.3.2-1.fc40.noarch.rpm
Wrote: /builddir/build/RPMS/pycharm-community-2024.3.2-1.fc40.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.EWvkBS
+ umask 022
+ cd /builddir/build/BUILD
+ cd pycharm-community-2024.3.2
+ /usr/bin/rm -rf /builddir/build/BUILDROOT/pycharm-community-2024.3.2-1.fc40.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(rmbuild): /bin/sh -e /var/tmp/rpm-tmp.Km5Axf
+ umask 022
+ cd /builddir/build/BUILD
+ rm -rf /builddir/build/BUILD/pycharm-community-2024.3.2-SPECPARTS
+ rm -rf pycharm-community-2024.3.2 pycharm-community-2024.3.2.gemspec
+ RPM_EC=0
++ jobs -p
+ exit 0

RPM build warnings:
    absolute symlink: /usr/bin/pycharm-community -> /usr/share/java/pycharm-community/bin/pycharm
Finish: rpmbuild pycharm-community-2024.3.2-1.fc40.src.rpm
Finish: build phase for pycharm-community-2024.3.2-1.fc40.src.rpm
INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan
INFO: /var/lib/mock/fedora-40-x86_64-1738090623.831555/root/var/log/dnf5.log
INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz
/bin/tar: Removing leading `/' from member names
INFO: Done(/var/lib/copr-rpmbuild/results/pycharm-community-2024.3.2-1.fc40.src.rpm) Config(child) 16 minutes 45 seconds
INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results
INFO: Cleaning up build root ('cleanup_on_success=True')
Start: clean chroot
INFO: unmounting tmpfs.
Finish: clean chroot
Finish: run
Running RPMResults tool
Package info:
{
    "packages": [
        {
            "name": "pycharm-community-doc",
            "epoch": null,
            "version": "2024.3.2",
            "release": "1.fc40",
            "arch": "noarch"
        },
        {
            "name": "pycharm-community",
            "epoch": null,
            "version": "2024.3.2",
            "release": "1.fc40",
            "arch": "src"
        },
        {
            "name": "pycharm-community",
            "epoch": null,
            "version": "2024.3.2",
            "release": "1.fc40",
            "arch": "x86_64"
        }
    ]
}
RPMResults finished