subtree updates

meta-raspberrypi: fde68b24f0..4c033eb074:
  Harunobu Kurokawa (1):
        rpi-cmdline, rpi-u-boot-src: Support USB boot

meta-arm: 0b61cc659a..4d22f982bc:
  Debbie Martin (2):
        arm-systemready: Add parted dependency and inherit testimage
        ci: Add Arm SystemReady firmware and IR ACS builds

  Harsimran Singh Tungal (3):
        arm-bsp/documentation: corstone1000: fix the steps in the user guide and instructions
        corstone1000:arm-bsp/optee: Update optee to v4.0
        corstone1000:arm-bsp/tftf: Fix tftf tests on mps3

  Jon Mason (5):
        arm/trusted-firmware-a: move patch file to bbappend
        arm/trusted-firmware-a: update to 2.10
        arm/hafnium: update to v2.10
        CI: rename meta-secure-core directory
        arm/edk2: update to 202311

  Ross Burton (1):
        CI: switch back to master

poky: 028b6f6226..4675bbb757:
  Adrian Freihofer (4):
        cmake-qemu.bbclass: make it more usable
        oe-selftest: add a cpp-example recipe
        oeqa/core/decorator: add skip if not qemu-usermode
        oe-selftest: add tests for C and C++ build tools

  Alassane Yattara (22):
        bitbake: toaster/test: bug-fix on tests/browser/test_all_builds_page
        bitbake: toaster/test: from test_no_builds_message.py wait for the empty state div to appear
        bitbake: toaster/test: delay driver action until elements to appear
        bitbake: toaster/tests: Ensure to kill toaster process create for tests functional
        bitbake: toaster/tests: Added functional/utils, contains useful methods using by functional tests
        bitbake: toaster/tests: Refactorize tests/functional
        bitbake: toaster/tests: Bug fixes, functional tests dependent on each other
        bitbake: toaster/tests: Fixes warnings in autobuilder
        bitbake: toaster/tests: bug-fix tests writing files into /tmp on the autobuilders
        bitbake: toaster/test: fix Copyright
        bitbake: toaster/tests: logging warning in console, trying to kill unavailable Runbuilds process
        bitbake: toaster/tests: Removed all time.sleep occurrence
        bitbake: toaster/tests: Bug-Fix testcase functional/test_project_page_tab_config.py
        bitbake: toaster/tests: bug-fix element click intercepted in browser/test_layerdetails_page.py
        bitbake: toaster/tests: Update tests/functional/functional_helpers test_functional_basic
        bitbake: toaster/tests: Fixes functional tests warning on autobuilder
        bitbake: toaster/tests: Bug-fix test_functional_basic, delay driver actions
        bitbake: toaster/tests: bug-fix An element matching "#projectstable" should be visible
        bitbake: toaster/tests: bug-fix An element matching "#lastest_builds" should be on the page
        bitbake: toaster/tests: Skip to show more then 100 item in ToasterTable
        bitbake: toaster/tests: Bug-fix "#project-created-notification" should be visible
        bitbake: toaster/toastergui: Bug-fix verify given layer path only if import/add local layer

  Alex Bennée (1):
        qemurunner: more cleanups for output blocking

  Alex Kiernan (17):
        cargo: Rename MANIFEST_PATH -> CARGO_MANIFEST_PATH
        cargo: Move CARGO_MANIFEST_PATH/CARGO_SRC_DIR to cargo_common
        rust: cargo: Convert single-valued variables to weak defaults
        cargo: Add CARGO_LOCK_PATH for path to Cargo.lock
        rust: Upgrade 1.70.0 -> 1.71.0
        rust: Upgrade 1.71.0 -> 1.71.1
        sstate-cache-management: Rewrite in python
        devtool: selftest: Fix test_devtool_modify_git_crates_subpath inequality
        devtool: selftest: Fix test_devtool_modify_git_crates_subpath bbappend check
        meta-selftest: hello-rs: Simple rust test recipe
        devtool: selftest: Swap to hello-rs for crates testing
        zvariant: Drop recipe
        rust: Upgrade 1.71.1 -> 1.72.0
        rust: Upgrade 1.72.0 -> 1.72.1
        rust: Upgrade 1.72.1 -> 1.73.0
        rust: Upgrade 1.73.0 -> 1.74.0
        rust: Upgrade 1.74.0 -> 1.74.1

  Alexander Kanavin (21):
        selftest/sstatetest: print output from bitbake with actual newlines, not \n
        selftest/sstatetests: do not delete custom $TMPDIRs under build-st when testing printdiff
        sstatesig/find_siginfo: special-case gcc-source when looking in sstate caches
        oeqa/selftest/sstatetests: re-work CDN tests, add local cache tests
        gobject-introspection: depend on setuptools to obtain distutils module
        libcap-ng-python: depend on setuptools to obtain distutils copy
        dnf: remove obsolete python3-gpg dependency (provided by gpgme)
        gpgme: disable python support (until upstream fixes 3.12 compatibility)
        python3-setuptools-rust: remove distutils dependency
        python3-babel: replace distutils with setuptools, as supported by upstream
        python3-pip: remove distutils depedency
        glib-2.0: replace distutils dependency with setuptools
        python3-pytest-runner: remove distutils dependency
        python3-numpy: distutils is no longer required
        bitbake: bitbake/codeparser.py: address ast module deprecations in py 3.12
        glibc-y2038-tests: do not run tests using 32 bit time APIs
        bitbake: bitbake/runqueue: add debugging for find_siginfo() calls
        bitbake: bitbake-diffsigs/runqueue: adapt to reworked find_siginfo()
        bitbake: bitbake/runqueue: prioritize local stamps over sstate signatures in printdiff
        sstatesig/find_siginfo: unify a disjointed API
        lib/sstatesig/find_siginfo: raise an error instead of returning None when obtaining mtime

  Alexander Lussier-Cullen (6):
        bitbake: toaster: fix pytest build test execution and test discovery
        bitbake: toaster: Add verbose printout for missing chrome(driver) dependencies
        bitbake: bitbake: toaster: add functional testing toaster error details
        bitbake: toaster/tests: Exit tests on chromedriver creation failure
        bitbake: toaster/tests: fix functional tests setup and teardown
        bitbake: toaster/tests: fix chrome argument syntax and wait for driver exit

  Alexandre Belloni (1):
        oeqa/selftest/recipetool: stop looking for md5sum

  Anuj Mittal (9):
        sqlite3: upgrade 3.44.0 -> 3.44.2
        base-passwd: upgrade 3.6.2 -> 3.6.3
        bluez5: upgrade 5.70 -> 5.71
        glib-2.0: upgrade 2.78.1 -> 2.78.3
        glib-networking: upgrade 2.76.1 -> 2.78.0
        puzzles: upgrade to latest revision
        stress-ng: upgrade 0.17.01 -> 0.17.03
        libusb1: fix upstream version check
        enchant2: upgrade 2.6.2 -> 2.6.4

  Archana Polampalli (1):
        bluez5: fix CVE-2023-45866

  Bruce Ashfield (31):
        linux-yocto/6.5: cfg: split runtime and symbol debug
        linux-yocto/6.5: update to v6.5.11
        linux-yocto/6.1: update to v6.1.62
        linux-yocto-dev: bump to v6.7
        linux-yocto/6.5: update to v6.5.12
        linux-yocto/6.5: update to v6.5.13
        linux-yocto/6.1: update to v6.1.65
        linux-yocto/6.1: drop removed IMA option
        linux-yocto/6.5: drop removed IMA option
        linux-yocto-rt/6.1: update to -rt18
        linux-yocto/6.1: update to v6.1.66
        linux-yocto/6.1: update to v6.1.67
        linux-yocto/6.5: fix AB-INT: QEMU kernel panic: No irq handler for vector
        linux-yocto/6.1: update to v6.1.68
        oeqa/runtime/parselogs: add qemux86 ACPI ignore for kernel v6.6+
        linux-libc-headers: update to v6.6-lts
        linux-yocto: introduce 6.6 reference kernel
        linux-yocto/6.6: fix AB-INT: QEMU kernel panic: No irq handler for vector
        linux-yocto-rt/6.6: fix CVE exclusion include
        linux-yocto/6.6: update CVE exclusions
        linux-yocto/6.6: update to v6.6.8
        linux-yocto/6.1: update to v6.1.69
        linux-yocto/6.5: drop 6.5 recipes
        linux-yocto-rt/6.6: correct meta data branch
        linux-yocto/6.6: update to v6.6.9
        linux-yocto/6.6: update CVE exclusions
        linux-yocto/6.1: update to v6.1.70
        linux-yocto/6.1: update CVE exclusions
        linux-yocto/6.6: ARM fix configuration audit warning
        linux-yocto/6.6: arm: jitter entropy backport
        poky/poky-tiny: make 6.6 the default kernel

  Changqing Li (1):
        man-pages: remove conflict pages

  Chen Qi (1):
        devtool: use straight print in check-upgrade-status output

  Clay Chang (1):
        devtool: deploy: provide max_process to strip_execs

  Daniel Ammann (1):
        base: Unpack .7z files with p7zip

  Deepthi Hemraj (1):
        autoconf: Add missing perl modules to RDEPENDS

  Dhairya Nagodra (2):
        cve-update-nvd2-native: faster requests with API keys
        cve-update-nvd2-native: increase the delay between subsequent request failures

  Eilís 'pidge' Ní Fhlannagáin (3):
        useradd: Fix issues with useradd dependencies
        useradd: Add testcase for bugzilla issue (currently disabled)
        usergrouptests.py: Add test for switching between static-ids

  Enrico Scholz (1):
        tcp-wrappers: drop libnsl2 build dependency

  Etienne Cordonnier (2):
        gdb/systemd: enable minidebuginfo support conditionally
        manuals: document minidebuginfo

  Fabio Estevam (3):
        libdrm: Upgrade to 2.4.119
        kmscube: Upgrade to latest revision
        bmap-tools: Upgrade to 3.7

  Hongxu Jia (2):
        socat: 1.7.4.4 -> 1.8.0.0
        man-db: 2.11.2 -> 2.12.0

  Jason Andryuk (3):
        linux-firmware: Package iwlwifi .pnvm files
        linux-firmware: Change bnx2 packaging
        linux-firmware: Create bnx2x subpackage

  Jeremy A. Puhlman (1):
        create-spdx-2.2: combine spdx can try to write before dir creation

  Jermain Horsman (2):
        lib/bblayers/makesetup.py: Remove unused imports
        lib/bblayers/buildconf.py: Remove unused imports/variables

  Jose Quaresma (2):
        go: update 1.20.10 -> 1.20.11
        go: update 1.20.11 -> 1.20.12

  Joshua Watt (11):
        bitbake: bitbake-hashserv: Add description of permissions
        bitbake.conf: Add runtimedir
        rpcbind: Specify state directory under /run
        libinput: Add packageconfig for tests
        ipk: Switch to using zstd compression
        lib/oe/path.py: Add relsymlink()
        lib/packagedata.py: Fix broken symlinks for providers with a '/'
        bitbake: contrib/vim: Syntax improvements
        classes-global/sstate: Fix variable typo
        lib/packagedata.py: Add API to iterate over rprovides
        classes-global/insane: Look up all runtime providers for file-rdeps

  Julien Stephan (19):
        recipetool: create_buildsys_python.py: initialize metadata
        recipetool: create: add trailing newlines
        recipetool: create: add new optional process_url callback for plugins
        recipetool: create_buildsys_python: add pypi support
        oeqa/selftest/recipetool: remove spaces on empty lines
        oeqa/selftest/recipetool/devtool: add test for pypi class
        recipetool: appendsrcfile(s): add dry-run mode
        recipeutils: bbappend_recipe: fix undefined variable
        recipeutils: bbappend_recipe: fix docstring
        recipeutils: bbappend_recipe: add a way to specify the name of the file to add
        recipeutils: bbappend_recipe: remove old srcuri entry if parameters are different
        recipetool: appendsrcfile(s): use params instead of extraline
        recipeutils: bbappend_recipe: allow to patch the recipe itself
        recipetool: appendsrcfile(s): add a mode to update the recipe itself
        oeqa/selftest/recipetool: appendsrfile: add test for machine
        oeqa/selftest/recipetool: appendsrc: add test for update mode
        oeqa/selftest/recipetool: add back checksum checks on pypi tests
        oeqa/selftest/recipetool: remove left over from development
        oeqa/selftest/recipetool: fix metadata corruption on meta layer

  Kevin Hao (2):
        beaglebone-yocto: Remove the redundant kernel-devicetree
        beaglebone-yocto: Remove the obsolete variables for uImage

  Khem Raj (13):
        tiff: Backport fixes for CVE-2023-6277
        kmod: Fix build with latest musl
        elfutils: Use own basename API implementation
        util-linux: Fix build with latest musl
        sysvinit: Include libgen.h for basename API
        attr: Fix build with latest musl
        opkg: Use own version of portable basename function
        util-linux: Delete md-raid tests
        gdb: Update to gdb 14.1 release
        systemd: Fix build with latest musl
        qemu: Fix build with latest musl
        qemu: Add packageconfig knob to enable pipewire support
        weston: Include libgen.h for basename

  Lee Chee Yang (5):
        migration-guides: reword fix in release-notes-4.3.1
        migration-guides: add release notes for 4.0.15
        perlcross: update to 1.5.2
        perl: 5.38.0 -> 5.38.2
        curl: update to 8.5.0

  Lucas Stach (1):
        mesa: upgrade 23.2.1 -> 23.3.1

  Ludovic Jozeau (1):
        image-live.bbclass: LIVE_ROOTFS_TYPE support compression

  Lukas Funke (1):
        selftest: wic: add test for zerorize option of empty plugin

  Malte Schmidt (1):
        wic: extend empty plugin with options to write zeros to partiton

  Markus Volk (3):
        gtk4: upgrade 4.12.3 -> 4.12.4
        libadwaita: update 1.4.0 -> 1.4.2
        appstream: Upgrade 0.16.3 -> 1.0.0

  Marlon Rodriguez Garcia (5):
        bitbake: toaster/tests: Update build test
        bitbake: toaster: Added new feature to import eventlogs from command line into toaster using replay functionality
        bitbake: toaster: remove test and update setup to avoid rebuilding image
        bitbake: toaster: Commandline build import table improvements
        bitbake: toaster: Added validation to stop import if there is a build in progress

  Marta Rybczynska (1):
        bitbake: toastergui: verify that an existing layer path is given

  Massimiliano Minella (1):
        zstd: fix LICENSE statement

  Michael Opdenacker (8):
        test-manual: text and formatting fixes
        test-manual: resource updates
        test-manual: use working example
        test-manual: add links to python unittest
        test-manual: explicit or fix file paths
        test-manual: add or improve hyperlinks
        dev-manual: runtime-testing: fix test module name
        poky.conf: update SANITY_TESTED_DISTROS to match autobuilder

  Mikko Rapeli (1):
        runqemu: match .rootfs. in addition to -image- for rootfs

  Ming Liu (1):
        grub: fs/fat: Don't error when mtime is 0

  Mingli Yu (2):
        python3-license-expression: Fix the ptest failure
        ptest-packagelists.inc: Add python3-license-expression

  Pavel Zhukov (2):
        bitbake: utils: Do not create directories with ${ in the name
        oeqa/selftest/bbtests: Add test for unexpanded variables in the dirname

  Peter Kjellerstedt (11):
        oeqa/selftest/devtool: Correct git clone of local repository
        oeqa/selftest/devtool: Avoid global Git hooks when amending a patch
        oeqa/selftest/devtool: Make test_devtool_load_plugin more resilient
        oeqa/selftest/recipetool: Make test_recipetool_load_plugin more resilient
        lib/oe/recipeutils: Avoid wrapping any SRC_URI[sha*sum] variables
        recipetool: create: Improve identification of licenses
        recipetool: create: Only include the expected SRC_URI checksums
        devtool: upgrade: Update all existing checksums for the SRC_URI
        devtool: modify: Make --no-extract work again
        devtool: modify: Handle recipes with a menuconfig task correctly
        dev-manual: Discourage the use of SRC_URI[md5sum]

  Peter Marko (1):
        dtc: preserve version also from shallow git clones

  Philip Balister (1):
        sanity.bbclass: Check for additional native perl modules.

  Renat Khalikov (1):
        python3-maturin: Add missing space appending to CFLAGS

  Richard Purdie (41):
        bitbake: runqueue: Improve inter setscene task dependency handling
        bitbake: bb/toaster: Fix assertEquals deprecation warnings
        bitbake: toaster: Fix assertRegexpMatches deprecation warnings
        bitbake: toastermain/settings: Avoid python filehandle closure warnings
        bitbake: toastergui: Fix regex markup issues
        bitbake: bitbake: Move to version 2.6.1 to mark runqueue changes
        bitbake: toaster-eventreplay: Remove ordering assumptions
        sanity.conf: Require bitbake 2.6.1 for recent runqueue change
        sstate: Remove unneeded code from setscene_depvalid() related to useradd
        oeqa/runtime/systemd: Ensure test runs only on systemd images
        bitbake: toaster: Update to use qemux86-64 machine by default
        bitbake: toaster/tests/builds: Add BB_HASHSERVE passthrough
        pseudo: Update to pull in syncfs probe fix
        useradd: Fix useradd do_populate_sysroot dependency bug
        sstate: Fix dir ownership issues in SSTATE_DIR
        oeqa/sstatetests: Disable gcc source printdiff test for now
        build-appliance-image: Update to master head revision
        bitbake: utils: Fix mkdir with PosixPath
        bitbake: runqueue: Remove tie between rqexe and starts_worker
        build-appliance-image: Update to master head revision
        testimage: Exclude wtmp from target-dumper commands
        qemurunner: Improve stdout logging handling
        qemurunner: Improve handling of serial port output blocking
        oeqa/selftest/overlayfs: Don't overwrite DISTRO_FEATURES
        testimage: Drop target_dumper and most of monitor_dumper
        oeqa/selftest/overlayfs: Fix whitespace
        qemu: Clean up DEPENDS
        qemu: Ensure pip and the python venv aren't used for meson
        curl: Disable two intermittently failing tests
        linux/cve-exclusion6.1: Update to latest kernel point release
        lib/prservice: Improve lock handling robustness
        oeqa/selftest/prservice: Improve test robustness
        scripts: Drop shell sstate-cache-management
        oeqa/selftest/sstatetests: Update sstate management script tests to python script
        curl: Disable test 1091 due to intermittent failures
        bitbake: lib/bb: Add workaround for libgcc issues with python 3.8 and 3.9
        bitbake: bitbake: Post release version bump to 2.7.0
        bitbake: siggen: Ensure version of siggen is verified
        bitbake: bitbake: Version bump for find_siginfo chanages
        sstatesig: Add version information for find_sigingfo
        sanity: Require bitbake 2.7.1

  Robert Berger (1):
        uninative-tarball.xz - reproducibility fix

  Robert Yang (5):
        gettext: Upgrade 0.22.3 -> 0.22.4
        nfs-utils: Upgrade 2.6.3 -> 2.6.4
        archiver.bbclass: Improve work-shared checking
        nfs-utils: Update Upstream-Status
        archiver.bbclass: Drop tarfile module to improve performance

  Ross Burton (23):
        avahi: update URL for new project location
        oeqa/runtime/parselogs: load ignores from disk
        oeqa/runtime/parselogs: migrate ignores
        meta-yocto-bsp/oeqa/parselogs: add BSP-specific ignores
        linux-yocto: update CVE exclusions
        genericx86: remove redundant assignments
        images: remove redundant IMAGE_BASENAME assignments
        insane: ensure more paths have the workdir removed
        tcl: skip timing-dependent tests in run-ptest
        qemurunner: remove unused import
        go: set vendor in CVE_PRODUCT
        runqemu: add qmp socket support
        linux-yocto: update CVE exclusions
        tcl: skip async and event tests in run-ptest
        images: add core-image-initramfs-boot
        machine/arch-armv9: remove crc and sve tunes, they are mandatory
        python3: re-enable profile guided optimisation
        openssl: mark assembler sections as call targets for PAC/BTI support on aarch64
        nativesdk: ensure features don't get backfilled
        nativesdk: don't unset MACHINE_FEATURES, let machine-sdk/ set it
        conf/machine-sdk: declare qemu-usermode SDK_MACHINE_FEATURE
        libseccomp: remove redundant PV assignment
        oeqa/parselogs-ignores-qemuarmv5: add comments and organise

  Saul Wold (1):
        package.py: OEHasPackage: Add MLPREFIX to packagename

  Shubham Kulkarni (1):
        tzdata: Upgrade to 2023d

  Simone Weiß (2):
        manuals: brief-yoctoprojectqs: align variable order with default local.conf
        patchtest: Add test for deprecated CVE_CHECK_IGNORE

  Soumya Sambu (1):
        ncurses: Fix - tty is hung after reset

  Sundeep KOKKONDA (1):
        rust: rustdoc reproducibility issue fix - disable PGO

  Tim Orling (12):
        python3-bcrypt: upgrade 4.0.1 -> 4.1.1
        python3-pygments: upgrade 2.16.1 -> 2.17.2
        recipetool: pypi: do not clobber SRC_URI checksums
        python3-setuptools-rust: BBCLASSEXTEND + nativesdk
        python3-maturin: add v1.4.0
        python3-maturin: bzip2-sys reproduciblility
        classes-recipe: add python_maturin.bbclass
        recipetool: add python_maturin support
        oe-selfest: add maturn runtime (testimage) test
        oeqa: add simple 'maturin' SDK (testsdk) test case
        oeqa: add "maturin develop" SDK test case
        oeqa: add runtime 'maturin develop' test case

  Tom Rini (1):
        inetutils: Update to the 2.5 release

  Trevor Gamblin (1):
        scripts/runqemu: fix regex escape sequences

  Victor Kamensky (5):
        systemtap: upgrade 4.9 -> 5.0
        systemtap: do not install uprobes and uprobes sources
        systemtap-uprobes: removed as obsolete
        systemtap: explicit handling debuginfod library dependency
        systemtap: fix libdebuginfod auto detection logic

  Vijay Anusuri (1):
        avahi: backport CVE-2023-1981 & CVE's follow-up patches

  Viswanath Kraleti (2):
        image-uefi.conf: Add EFI_UKI_PATH variable
        systemd-boot: Add recipe to compile native

  Wang Mingyu (38):
        kbd: upgrade 2.6.3 -> 2.6.4
        libatomic-ops: upgrade 7.8.0 -> 7.8.2
        libnl: upgrade 3.8.0 -> 3.9.0
        libseccomp: upgrade 2.5.4 -> 2.5.5
        libva-utils: upgrade 2.20.0 -> 2.20.1
        dnf: upgrade 4.18.1 -> 4.18.2
        gpgme: upgrade 1.23.1 -> 1.23.2
        kea: upgrade 2.4.0 -> 2.4.1
        opkg-utils: upgrade 0.6.2 -> 0.6.3
        repo: upgrade 2.39 -> 2.40
        sysstat: upgrade 12.7.4 -> 12.7.5
        p11-kit: upgrade 0.25.2 -> 0.25.3
        python3-babel: upgrade 2.13.1 -> 2.14.0
        python3-dbusmock: upgrade 0.29.1 -> 0.30.0
        python3-hatchling: upgrade 1.18.0 -> 1.20.0
        python3-hypothesis: upgrade 6.90.0 -> 6.92.1
        python3-importlib-metadata: upgrade 6.8.0 -> 7.0.0
        python3-license-expression: upgrade 30.1.1 -> 30.2.0
        python3-pathspec: upgrade 0.11.2 -> 0.12.1
        python3-pip: upgrade 23.3.1 -> 23.3.2
        python3-psutil: upgrade 5.9.6 -> 5.9.7
        python3-pytest-runner: upgrade 6.0.0 -> 6.0.1
        python3-trove-classifiers: upgrade 2023.11.22 -> 2023.11.29
        python3-typing-extensions: upgrade 4.8.0 -> 4.9.0
        python3-wcwidth: upgrade 0.2.11 -> 0.2.12
        ttyrun: upgrade 2.29.0 -> 2.30.0
        xwayland: upgrade 23.2.2 -> 23.2.3
        diffoscope: upgrade 252 -> 253
        iputils: upgrade 20221126 -> 20231222
        gstreamer1.0: upgrade 1.22.7 -> 1.22.8
        dhcpcd: upgrade 10.0.5 -> 10.0.6
        fontconfig: upgrade 2.14.2 -> 2.15.0
        python3-setuptools: upgrade 69.0.2 -> 69.0.3
        python3-dbusmock: upgrade 0.30.0 -> 0.30.1
        python3-hatchling: upgrade 1.20.0 -> 1.21.0
        python3-importlib-metadata: upgrade 7.0.0 -> 7.0.1
        python3-lxml: upgrade 4.9.3 -> 4.9.4
        aspell: upgrade 0.60.8 -> 0.60.8.1

  Yash Shinde (1):
        rust: Disable rust oe-selftest

  Yi Zhao (3):
        json-glib: upgrade 1.6.6 -> 1.8.0
        psplash: upgrade to latest revision
        debianutils: upgrade 5.14 -> 5.15

  Yoann Congal (2):
        lib/oe/patch: handle creating patches for CRLF sources
        strace: Disable bluetooth support by default

  Zang Ruochen (2):
        ell: upgrade 0.60 -> 0.61
        musl: add typedefs for Elf64_Relr and Elf32_Relr

  Zoltan Boszormenyi (1):
        update_gtk_icon_cache: Fix for GTK4-only builds

  venkata pyla (1):
        wic: use E2FSPROGS_FAKE_TIME and hash_seed to generate reproducible ext4 images

meta-openembedded: 5ad7203f68..7d8115d550:
  Alex Kiernan (7):
        mdns: Fix HOMEPAGE URL
        mbedtls: Upgrade 3.5.0 -> 3.5.1
        c-ares: Upgrade 1.22.1 -> 1.24.0
        mdns: Upgrade 2200.40.37.0.1 -> 2200.60.25.0.4
        c-ares: Move to tarballs, add ptest and static support
        thin-provisioning-tools: Upgrade 1.0.4 -> 1.0.9
        bearssl: Upgrade to latest

  Alexander Kanavin (29):
        python3-pyinotify: remove as unmaintained
        python3-supervisor: do not rely on smtpd module
        python3-meld3: do not rely on smtpd module
        python3-m2crypto: do not rely on smtpd module
        python3-uinput: remove as unmaintained
        python3-mcrypto: rely on setuptools for distutils copy
        python3-joblib: do not rely in distutils
        python3-web3: remove distutils dependency
        python3-cppy: remove unused distutils dependency
        python3-pyroute2: remove unused distutils dependency
        python3-eventlet: backport a patch to remove distutils dependency
        python3-unoconv: rely on setuptools to obtain distutils copy
        python3-astroid: remove unneeded distutils dependency
        python3-django: remove unneeded distutils dependency
        python3-pillow: remove unneeded distutils dependency
        python3-grpcio: update 1.56.2 -> 1.59.3
        gstd: correctly delete files in do_install
        libplist: fix python 3.12 compatibility
        libcamera: skip until upstream resolves python 3.12 compatibility
        nodejs: backport (partially) python 3.12 support
        nodejs: backport (partially) python 3.12 support
        polkit: remove long obsolete 0.119 version
        mozjs-115: split the way-too-long PYTHONPATH line
        polkit: update mozjs dependency 102 -> 115
        mozjs-115: backport py 3.12 compatibility
        mozjs-102: remove the recipe
        gthumb: update 3.12.2 -> 3.12.4
        flatpak: do not rely on executables from the host
        bolt: package systemd units

  Archana Polampalli (1):
        cjson: upgrade 1.7.16 -> 1.7.17

  Bruce Ashfield (1):
        zfs: update to 2.2.2

  Changqing Li (2):
        postgresql: upgrade 15.4 -> 15.5
        redis: upgrade 6.2.13 -> 6.2.14

  Derek Straka (70):
        python3-greenlet: update to version 3.0.2
        python3-ujson: update to version 5.9.0
        python3-termcolor: update to version 2.4.0
        python3-cmake: update to version 3.28.0
        python3-pint: upgrade to 0.23
        python3-gnupg: update to 0.5.2
        python3-pyzmq: update to 25.1.2
        python3-tox: update to version 4.11.4
        python3-olefile: update to version 0.47
        python3-distlib: update to version 0.3.8
        python3-colorlog: update to version 6.8.0
        python3-pymongo: update version to 4.6.1
        python3-bandit: update to version 1.7.6
        python3-gmqtt: update to version 0.6.13
        python3-portion: update to version 2.4.2
        python3-prompt-toolkit: update to version 3.0.43
        python3-asyncinotify: update to version 4.0.4
        python3-bitstring: update to version 4.1.4
        python3-ipython: update to version 8.18.1
        nginx: update versions for both the stable branch and mainline
        python3-portalocker: update to version 2.8.2
        python3-astroid: update to version 3.0.2
        python3-alembic: update to version 1.13.1
        python3-pymisp: update to verion 2.4.182
        python3-ninja: update to version 1.11.1.1
        python3-coverage: update to version 7.3.4
        python3-pdm: update to version 2.11.1
        python3-paramiko: update to version 3.4.0
        python3-zeroconf: update to version 0.131.0
        python3-wtforms: update to version 3.1.1
        python3-isort: update to version 5.13.2
        python3-protobuf: update to version 4.25.1
        python3-lazy-object-proxy: update to version 1.10.0
        python3-cantools: update to version 39.4.0
        python3-sentry-sdk: update to version 1.39.1
        python3-xmlschema: update to version 2.5.1
        python3-apiflask: update to version 2.1.0
        python3-rapidjson: update to version 1.14
        python3-bitarray: update to version 2.9.0
        python3-pyfanotify: update to version 0.2.2
        python3-eventlet: update to version 0.34.1
        python3-flask-wtf: update to version 1.2.1
        python3-grpcio: update to version 1.60.0
        python3-grpcio-tools: update to version 1.60.0
        python3-cmake: update to version 3.28.1
        python3-flask-sqlalchemy: fix upstream uri check
        python3-wtforms: fix upstream uri and version check
        gyp: update to the latest commit
        python3-ipython-genutils: fix upstream uri and version check
        python3-flask: fix upstream uri and version check
        python3-wpa-supplicant: fix upstream uri and version check
        python3-uswid: update to version 0.4.7
        python3-flask-wtf: fix upstream uri and version check
        python3-gspread: update to version 5.12.3
        python3-pytest-html: update to version 4.1.1
        python3-setuptools-scm-git-archive: remove obsolete package
        python3-pyroute2: update to version 0.7.10
        python3-constantly: update to version 23.10.4
        python3-mypy: update to version 1.8.0
        python3-flask-jwt-extended: update to version 4.6.0
        python3-greenlet: update to version 3.0.3
        python3-web3: update to version 6.13.0
        python3-parse: update to version 1.20.0
        python3-kmod: add comment about update to version 0.9.2
        python3-engineio: update to version 4.8.1
        python3-sqlalchemy: update to version 2.0.24
        python3-pdm-backend: update to version 2.1.8
        python3-cantools: update to version 39.4.1
        python3-argh: update to version 0.30.5
        python3-dominate: update to version 2.9.1

  Dmitry Baryshkov (2):
        android-tools: remove two Debianisms
        networkmanager: drop libnewt dependency

  Frederic Martinsons (3):
        crash: factorize recipe with inc file to prepare cross-canadian version
        crash: add cross canadian version
        crash: update to 8.0.4

  Jan Vermaete (1):
        netdata: added Python as rdepends

  Jean-Marc BOUCHE (1):
        terminus-font: build compressed archives with -n

  Jose Quaresma (1):
        ostree: Upgrade 2023.7 -> 2023.8

  Joshua Watt (1):
        redis: Create state directory in systemd service

  Jörg Sommer (1):
        i2cdev: New recipe with i2c tools

  Kai Kang (1):
        lvm2: 2.03.16 -> 2.03.22

  Khem Raj (3):
        Revert "nodejs: backport (partially) python 3.12 support"
        Revert "libcamera: skip until upstream resolves python 3.12 compatibility"
        libcamera: Fix build with python 3.12

  Leon Anavi (11):
        sip: Upgrade 6.7.12 -> 6.8.0
        python3-expandvars: add recipe
        python3-frozenlist: upgrade 1.4.0 -> 1.4.1
        python3-yarl: upgrade 1.9.2 -> 1.9.4
        python3-coverage: upgrade 7.3.2 -> 7.3.3
        python3-cycler: upgrade 0.11.0 -> 0.12.1
        python3-aiohue: upgrade 4.6.2 -> 4.7.0
        python3-sdbus: upgrade 0.11.0 -> 0.11.1
        python3-zeroconf: upgrade 0.128.4 -> 0.130.0
        python3-dominate: upgrade 2.8.0 -> 2.9.0
        python3-rlp: upgrade 3.0.0 -> 4.0.0

  Marek Vasut (1):
        faad2: Upgrade 2.10.0 -> 2.11.1

  Markus Volk (3):
        wireplumber: update 0.4.15 -> 0.4.17
        tracker: dont inherit gsettings
        gnome-software: update 45.1 -> 45.2

  Martin Jansa (4):
        monocypher: pass LIBDIR to fix installed-vs-shipped QA issue with multilib
        rygel: fix build with gtk+3 PACKAGECONFIG disabled
        rygel: add x11 to DISTRO_FEATURES
        driverctl: fix installed-vs-shipped

  Meenali Gupta (1):
        nginx: upgrade 1.25.2 -> 1.25.3

  Mingli Yu (2):
        mariadb: Upgrade to 10.11.6
        tk: Remove buildpath issue

  Nathan BRIENT (1):
        cyaml: new recipe

  Niko Mauno (1):
        pkcs11-provider: Add recipe

  Ny Antra Ranaivoarison (1):
        python3-click-spinner: backport patch that fixes deprecated methods

  Patrick Wicki (1):
        poco: upgrade 1.12.4 -> 1.12.5p2

  Petr Chernikov (1):
        abseil-cpp: remove -Dcmake_cxx_standard=14 flag from extra_oecmake

  Robert Yang (1):
        minifi-cpp: Fix do_configure error builder aarch64

  Ross Burton (13):
        Remove unused SRC_DISTRIBUTE_LICENSES
        gspell: inherit gtk-doc
        gspell: update DEPENDS, switch iso-codes for icu
        librest: remove spurious build dependencies
        librest: inherit gtk-doc
        keybinder: use autotools-brokensep instead of setting B
        keybinder: disable gtk-doc documentation
        gtksourceview3: remove obsolete DEPENDS
        libgsf: remove obsolete DEPENDS
        evolution-data-server: remove obsolete intltool DEPENDS
        php: remove lemon-native build dependency
        lemon: upgrade to 3.44.2
        renderdoc: no need to depend on vim-native

  Samuli Piippo (1):
        jasper: enable opengl only wih x11

  Theodore A. Roth (1):
        python3-flask-sqlalchemy: upgrade 2.5.1 -> 3.1.1

  Thomas Perrot (2):
        networkmanager: add missing modemmanager rdepends
        networkmanager: fix some missing pkgconfig

  Tim Orling (8):
        python3-pydantic-core: add v2.14.5
        python3-annotated-types: add v0.6.0
        python3-pydantic: fix RDEPENDS
        python3-dirty-equals: add v0.7.1
        python3-pydantic-core: enable ptest
        python3-cloudpickle: add v3.0.0
        python3-pydantic: enable ptest
        python3-yappi: upgrade 1.4.0 -> 1.6.0; fix ptests

  Wang Mingyu (61):
        python3-alembic: upgrade 1.12.1 -> 1.13.0
        python3-ansi2html: upgrade 1.8.0 -> 1.9.1
        python3-argcomplete: upgrade 3.1.6 -> 3.2.1
        python3-dbus-fast: upgrade 2.15.0 -> 2.21.0
        python3-django: upgrade 4.2.7 -> 5.0
        python3-flask-restx: upgrade 1.2.0 -> 1.3.0
        python3-google-api-core: upgrade 2.14.0 -> 2.15.0
        python3-google-api-python-client: upgrade 2.108.0 -> 2.111.0
        python3-googleapis-common-protos: upgrade 1.61.0 -> 1.62.0
        python3-google-auth: upgrade 2.23.4 -> 2.25.2
        python3-imageio: upgrade 2.33.0 -> 2.33.1
        python3-isort: upgrade 5.12.0 -> 5.13.1
        python3-path: upgrade 16.7.1 -> 16.9.0
        python3-platformdirs: upgrade 4.0.0 -> 4.1.0
        python3-pytest-asyncio: upgrade 0.22.0 -> 0.23.2
        python3-sentry-sdk: upgrade 1.37.1 -> 1.39.0
        python3-bitarray: upgrade 2.8.3 -> 2.8.5
        python3-eth-keyfile: upgrade 0.6.1 -> 0.7.0
        python3-eth-rlp: upgrade 0.3.0 -> 1.0.0
        python3-fastnumbers: upgrade 5.0.1 -> 5.1.0
        python3-pylint: upgrade 3.0.2 -> 3.0.3
        python3-tornado: upgrade 6.3.3 -> 6.4
        python3-traitlets: upgrade 5.13.0 -> 5.14.0
        python3-types-setuptools: upgrade 68.2.0.2 -> 69.0.0.0
        python3-virtualenv: upgrade 20.24.7 -> 20.25.0
        python3-web3: upgrade 6.11.3 -> 6.12.0
        python3-websocket-client: upgrade 1.6.4 -> 1.7.0
        python3-zeroconf: upgrade 0.127.0 -> 0.128.4
        ctags: upgrade 6.0.20231126.0 -> 6.0.20231210.0
        gensio: upgrade 2.8.0 -> 2.8.2
        hwdata: upgrade 0.376 -> 0.377
        lvgl: upgrade 8.3.10 -> 8.3.11
        gjs: upgrade 1.78.0 -> 1.78.1
        ifenslave: upgrade 2.13 -> 2.14
        libei: upgrade 1.1.0 -> 1.2.0
        pkcs11-helper: upgrade 1.29.0 -> 1.30.0
        strongswan: upgrade 5.9.12 -> 5.9.13
        webkitgtk3: upgrade 2.42.2 -> 2.42.3
        sip: upgrade 6.8.0 -> 6.8.1
        paho-mqtt-cpp: upgrade 1.3.1 -> 1.3.2
        dbus-cxx: upgrade 2.4.0 -> 2.5.0
        exiftool: upgrade 12.70 -> 12.71
        uftp: upgrade 5.0.2 -> 5.0.3
        ctags: upgrade 6.0.20231210.0 -> 6.0.20231224.0
        jasper: Fix install conflict when enable multilib.
        jq: upgrade 1.7 -> 1.7.1
        libmbim: upgrade 1.31.1 -> 1.31.2
        libqmi: upgrade 1.34.0 -> 1.35.1
        opencl-headers: upgrade 2023.04.17 -> 2023.12.14
        valijson: upgrade 1.0.1 -> 1.0.2
        python3-apispec: upgrade 6.3.0 -> 6.3.1
        python3-asyncinotify: upgrade 4.0.4 -> 4.0.5
        python3-bitarray: upgrade 2.9.0 -> 2.9.1
        python3-cassandra-driver: upgrade 3.28.0 -> 3.29.0
        python3-ipython: upgrade 8.18.1 -> 8.19.0
        python3-pydantic: upgrade 2.5.2 -> 2.5.3
        python3-regex: upgrade 2023.10.3 -> 2023.12.25
        opencl-icd-loader: upgrade 2023.04.17 -> 2023.12.14
        python3-distro: upgrade 1.8.0 -> 1.9.0
        zchunk: upgrade 1.3.2 -> 1.4.0
        python3-eventlet: upgrade 0.34.1 -> 0.34.2

  William Lyu (1):
        networkmanager: Improved SUMMARY and added DESCRIPTION

  Xiangyu Chen (1):
        layer.conf: add libbpf to NON_MULTILIB_RECIPES

  Yi Zhao (2):
        open-vm-tools: upgrade 12.1.5 -> 12.3.5
        samba: upgrade 4.18.8 -> 4.18.9

  Zoltán Böszörményi (2):
        mutter: Make gnome-desktop and libcanberra dependencies optional
        zenity: Upgrade to 4.0.0

  alperak (29):
        jasper: upgrade 2.0.33 -> 4.1.1
        xcursorgen: upgrade 1.0.7 -> 1.0.8
        xstdcmap: upgrade 1.0.4 -> 1.0.5
        xlsclients: upgrade 1.1.4 -> 1.1.5
        xlsatoms: upgrade 1.1.3 -> 1.1.4
        xkbevd: upgrade 1.1.4 -> 1.1.5
        xgamma: upgrade 1.0.6 -> 1.0.7
        sessreg: upgrade 1.1.2 -> 1.1.3
        xbitmaps: upgrade 1.1.2 -> 1.1.3
        xcursor-themes: add recipe
        xorg-docs: add recipe
        xorg-sgml-doctools: update summary depends and inc file
        xf86-video-ati: upgrade 19.1.0 -> 22.0.0
        xf86-input-void: upgrade 1.4.1 -> 1.4.2
        libxaw: upgrade 1.0.14 -> 1.0.15
        xf86-video-mga: upgrade 2.0.0 -> 2.0.1
        snappy: upgrade 1.1.9 -> 1.1.10
        xsetroot: upgrade 1.1.2 -> 1.1.3
        libbytesize: Removed unnecessary setting of B
        libmxml: use autotools-brokensep instead of setting B
        libsombok3: use autotools-brokensep instead of setting B
        pgpool2: use autotools-brokensep instead of setting B
        qpdf: upgrade 11.6.3 -> 11.6.4
        cpprest: upgrade 2.10.18 -> 2.10.19
        avro-c: upgrade 1.11.2 -> 1.11.3
        dool: upgrade 1.1.0 -> 1.3.1
        driverctl: upgrade 0.111 -> 0.115
        hstr: upgrade 2.5.0 -> 3.1.0
        libharu: upgrade 2.3.0 -> 2.4.4

meta-security: 070a1e82cc..b2e1511338:
  Armin Kuster (6):
        libgssglue: update to 0.8
        python3-privacyidea: Update to 3.9.1
        lynis: Update SRC_URI to improve updater
        layers: Move READMEs to markdown format
        arpwatch: adjust CONFIGURE params to allow to build again.
        python3-pyinotify: fail2ban needs this module

  Dawid Dabrowski (1):
        libhoth recipe update

  Erik Schilling (2):
        dm-verity-img.bbclass: use bc-native
        dm-verity-img.bbclass: remove IMAGE_NAME_SUFFIX

  Mikko Rapeli (2):
        tpm2-tss: support native builds
        dm-verity-img.bbclass: add DM_VERITY_DEPLOY_DIR

Change-Id: I94d7f1ee5ff2da4555c05fbf63a1293ec8f249c2
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/meta-arm/.gitlab-ci.yml b/meta-arm/.gitlab-ci.yml
index 9dee580..22ecfd7 100644
--- a/meta-arm/.gitlab-ci.yml
+++ b/meta-arm/.gitlab-ci.yml
@@ -9,6 +9,8 @@
   # by default
   FF_KUBERNETES_HONOR_ENTRYPOINT: 1
   FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY: 0
+  ACS_TEST: 0
+  ACS_TAG: ""
 
 stages:
   - prep
@@ -67,8 +69,8 @@
     name: "logs"
     when: always
     paths:
-      - $CI_PROJECT_DIR/work/build/tmp/work*/**/temp/log.do_*.*
-      - $CI_PROJECT_DIR/work/build/tmp/work*/**/testimage/*
+      - $CI_PROJECT_DIR/work/build/tmp*/work*/**/temp/log.do_*.*
+      - $CI_PROJECT_DIR/work/build/tmp*/work*/**/testimage/*
 
 #
 # Prep stage, update repositories once.
@@ -126,6 +128,20 @@
     matrix:
       - TESTING: testimage
       - FIRMWARE: edk2
+      - SYSTEMREADY_FIRMWARE: arm-systemready-firmware
+
+arm-systemready-ir-acs:
+  extends: .build
+  timeout: 12h
+  parallel:
+    matrix:
+      # arm-systemready-ir-acs must be specified after fvp-base for ordering
+      # purposes for the jobs-to-kas output. It is not enough to just have it
+      # in the job name because fvp-base.yml overwrites the target.
+      - PLATFORM: fvp-base
+        ARM_SYSTEMREADY_IR_ACS: arm-systemready-ir-acs
+  tags:
+    - ${ACS_TAG}
 
 fvps:
   extends: .build
diff --git a/meta-arm/ci/arm-systemready-firmware.yml b/meta-arm/ci/arm-systemready-firmware.yml
new file mode 100644
index 0000000..1854c2a
--- /dev/null
+++ b/meta-arm/ci/arm-systemready-firmware.yml
@@ -0,0 +1,4 @@
+header:
+  version: 11
+  includes:
+    - kas/arm-systemready-firmware.yml
diff --git a/meta-arm/ci/arm-systemready-ir-acs.yml b/meta-arm/ci/arm-systemready-ir-acs.yml
new file mode 100644
index 0000000..6cfead6
--- /dev/null
+++ b/meta-arm/ci/arm-systemready-ir-acs.yml
@@ -0,0 +1,14 @@
+header:
+  version: 11
+  includes:
+    - kas/arm-systemready-ir-acs.yml
+
+env:
+  ACS_TEST: "0"
+
+local_conf_header:
+  testimage: |
+    TESTIMAGE_AUTO = "${ACS_TEST}"
+
+target:
+  - arm-systemready-ir-acs
diff --git a/meta-arm/ci/base.yml b/meta-arm/ci/base.yml
index dd3ab21..4296d27 100644
--- a/meta-arm/ci/base.yml
+++ b/meta-arm/ci/base.yml
@@ -5,7 +5,7 @@
 
 defaults:
   repos:
-    branch: nanbield
+    branch: master
 
 repos:
   meta-arm:
diff --git a/meta-arm/ci/meta-secure-core.yml b/meta-arm/ci/meta-secure-core.yml
index 94b11a7..2d9fc2c 100644
--- a/meta-arm/ci/meta-secure-core.yml
+++ b/meta-arm/ci/meta-secure-core.yml
@@ -5,7 +5,7 @@
   meta-secure-core:
     url: https://github.com/Wind-River/meta-secure-core.git
     layers:
-      meta:
+      meta-secure-core-common:
       meta-signing-key:
       meta-efi-secure-boot:
       
diff --git a/meta-arm/kas/arm-systemready-ir-acs.yml b/meta-arm/kas/arm-systemready-ir-acs.yml
index 38604d7..aef3e71 100644
--- a/meta-arm/kas/arm-systemready-ir-acs.yml
+++ b/meta-arm/kas/arm-systemready-ir-acs.yml
@@ -8,10 +8,5 @@
   # The full testimage run typically takes around 12-24h on fvp-base.
   TEST_OVERALL_TIMEOUT: "${@ 24*60*60}"
 
-local_conf_header:
-  systemready-ir-acs: |
-    IMAGE_CLASSES:append = " testimage"
-
-
 target:
   - arm-systemready-ir-acs
diff --git a/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc b/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc
index 749350e..063a315 100644
--- a/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc
+++ b/meta-arm/meta-arm-bsp/conf/machine/include/corstone1000.inc
@@ -36,7 +36,7 @@
 UBOOT_EXTLINUX = "0"
 
 #optee
-PREFERRED_VERSION_optee-os ?= "3.22%"
+PREFERRED_VERSION_optee-os ?= "4.0.%"
 PREFERRED_VERSION_optee-client ?= "3.22%"
 EXTRA_IMAGEDEPENDS += "optee-os"
 OPTEE_ARCH = "arm64"
diff --git a/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf b/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf
index 74a0a66..2a246de 100644
--- a/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf
+++ b/meta-arm/meta-arm-bsp/conf/machine/n1sdp.conf
@@ -27,6 +27,7 @@
 # TF-A
 EXTRA_IMAGEDEPENDS += "trusted-firmware-a"
 TFA_PLATFORM = "n1sdp"
+PREFERRED_VERSION_trusted-firmware-a ?= "2.9.%"
 
 # SCP
 EXTRA_IMAGEDEPENDS += "virtual/control-processor-firmware"
diff --git a/meta-arm/meta-arm-bsp/conf/machine/sgi575.conf b/meta-arm/meta-arm-bsp/conf/machine/sgi575.conf
index 3c2c94b..7f2a285 100644
--- a/meta-arm/meta-arm-bsp/conf/machine/sgi575.conf
+++ b/meta-arm/meta-arm-bsp/conf/machine/sgi575.conf
@@ -9,6 +9,7 @@
 EXTRA_IMAGEDEPENDS += "virtual/control-processor-firmware"
 
 EXTRA_IMAGEDEPENDS += "trusted-firmware-a"
+PREFERRED_VERSION_trusted-firmware-a ?= "2.9.%"
 
 KERNEL_IMAGETYPE ?= "Image"
 PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
diff --git a/meta-arm/meta-arm-bsp/documentation/corstone1000/software-architecture.rst b/meta-arm/meta-arm-bsp/documentation/corstone1000/software-architecture.rst
index ce8bd7e..6bc8ace 100644
--- a/meta-arm/meta-arm-bsp/documentation/corstone1000/software-architecture.rst
+++ b/meta-arm/meta-arm-bsp/documentation/corstone1000/software-architecture.rst
@@ -235,7 +235,7 @@
 .. _Arm security features: https://www.arm.com/architecture/security-features/platform-security
 .. _linux repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
 .. _FF-A: https://developer.arm.com/documentation/den0077/latest
-.. _FF-M: https://developer.arm.com/-/media/Files/pdf/PlatformSecurityArchitecture/Architect/DEN0063-PSA_Firmware_Framework-1.0.0-2.pdf?revision=2d1429fa-4b5b-461a-a60e-4ef3d8f7f4b4&hash=3BFD6F3E687F324672F18E5BE9F08EDC48087C93
+.. _FF-M: https://developer.arm.com/architectures/Firmware%20Framework%20for%20M-Profile
 .. _FWU: https://developer.arm.com/documentation/den0118/a/
 .. _OPTEE-OS: https://github.com/OP-TEE/optee_os
 .. _PSA: https://www.psacertified.org/
diff --git a/meta-arm/meta-arm-bsp/documentation/corstone1000/user-guide.rst b/meta-arm/meta-arm-bsp/documentation/corstone1000/user-guide.rst
index 134ed41..318cddf 100644
--- a/meta-arm/meta-arm-bsp/documentation/corstone1000/user-guide.rst
+++ b/meta-arm/meta-arm-bsp/documentation/corstone1000/user-guide.rst
@@ -18,7 +18,7 @@
 Prerequisites
 -------------
 
-This guide assumes that your host PC is running Ubuntu 20.04 LTS, with at least
+This guide assumes that your host machine is running Ubuntu 20.04 LTS, with at least
 32GB of free disk space and 16GB of RAM as minimum requirement.
 
 The following prerequisites must be available on the host system:
@@ -435,7 +435,7 @@
      dd conv=notrunc if=openSUSE-Tumbleweed-ARM-JeOS-efi.aarch64-<date>-Snapshot<date>.raw skip=<blockaddress_1st_partition> of=corstone1000-efi-partition.img seek=<blockaddress_1st_partition> iflag=fullblock seek=<blockaddress_1st_partition> bs=512 count=<sectorsize_1s_partition> && sync
 
 
-#. Use the provided disk-layout below to label the ESP correctly.
+#. Create the file efi_disk.layout locally. Copy the content of provided disk layout below to the efi_disk.layout to label the ESP correctly.
 
    efi_disk.layout
    ::
@@ -470,7 +470,10 @@
 **Using ESP in FPGA:**
 
 Once the ESP is created, it needs to be flashed to a second USB drive different than ACS image.
-This can be done with the development machine.
+This can be done with the development machine. In the given example here
+we assume the USB device is ``/dev/sdb`` (the user should use ``lsblk`` command to
+confirm). Be cautious here and don't confuse your host machine own hard drive with the
+USB drive. Run the following commands to prepare the ACS image in USB stick:
 
 ::
 
@@ -560,7 +563,7 @@
     └── ramdisk-busybox.img
 
 RESULT partition is used to store the test results.
-**NOTE**: PLEASE MAKE SURE THAT THE RESULT PARTITION IS EMPTY BEFORE YOU START THE TESTING. OTHERWISE THE TEST RESULTS
+**NOTE**: PLEASE MAKE SURE THAT "acs_results" FOLDER UNDER THE RESULT PARTITION IS EMPTY BEFORE YOU START THE TESTING. OTHERWISE THE TEST RESULTS
 WILL NOT BE CONSISTENT
 
 FPGA instructions for ACS image
@@ -589,7 +592,7 @@
 
 Then, the user should prepare a USB stick with ACS image. In the given example here,
 we assume the USB device is ``/dev/sdb`` (the user should use ``lsblk`` command to
-confirm). Be cautious here and don't confuse your host PC's own hard drive with the
+confirm). Be cautious here and don't confuse your host machine own hard drive with the
 USB drive. Run the following commands to prepare the ACS image in USB stick:
 
 ::
@@ -604,6 +607,11 @@
 
 The FPGA will reset multiple times during the test, and it might take approx. 24-36 hours to finish the test.
 
+**NOTE**: The USB stick which contains the ESP partition might cause grub to
+unable to find the bootable partition (only in the FPGA). If that's the case, please
+remove the USB stick and run the ACS tests. ESP partition can be mounted after
+the platform is booted to linux at the end of the ACS tests.
+
 
 FVP instructions for ACS image and run
 ======================================
@@ -639,6 +647,20 @@
 Once test is finished, the FVP can be stoped, and result can be copied following above
 instructions.
 
+**NOTE:** A rare issue has been noticed (5-6% occurence) during which the FVP hangs during booting the system while running ACS tests.
+If this happens, please apply the following patch, rebuild the software stack for FVP and re-run the ACS tests.
+
+::
+
+  cd <_workspace>
+  git clone https://git.gitlab.arm.com/arm-reference-solutions/systemready-patch.git -b CORSTONE1000-2023.11
+  cp -f systemready-patch/embedded-a/corstone1000/sr_ir_workaround/0001-embedded-a-corstone1000-sr-ir-workaround.patch meta-arm
+  cd meta-arm
+  git am 0001-embedded-a-corstone1000-sr-ir-workaround.patch
+  cd ..
+  kas shell meta-arm/kas/corstone1000-fvp.yml:meta-arm/ci/debug.yml -c="bitbake u-boot -c cleanall; bitbake trusted-firmware-a -c cleanall; corstone1000-image -c cleanall; bitbake corstone1000-image"
+
+
 Common to FVP and FPGA
 ======================
 
@@ -657,7 +679,7 @@
 Manual capsule update and ESRT checks
 -------------------------------------
 
-The following section describes running manual capsule update with the ``direct`` method.
+The following section describes running manual capsule update.
 
 The steps described in this section perform manual capsule update and show how to use the ESRT feature
 to retrieve the installed capsule details.
@@ -681,6 +703,13 @@
   make tools-only_defconfig
   make tools-only
 
+**NOTE:** The following error could happen if the linux build system does not have "libgnutls28-dev".
+ **error: "tools/mkeficapsule.c:21:10: fatal error: gnutls/gnutls.h: No such file or directory"**. If that's the case please install libgnutls28-dev and its dependencies by using the following command.
+
+::
+
+  sudo apt-get install -y libgnutls28-dev
+
 Download systemready-patch repo under <_workspace>:
 ::
 
@@ -788,20 +817,7 @@
 
    sudo umount /mnt/test
 
-**NOTE:**
-
-The size of first partition in the image file is calculated in the following way. The data is
-just an example and might vary with different ir-acs-live-image-generic-arm64.wic files.
-
-::
-
-   fdisk -lu <path-to-img>/ir-acs-live-image-generic-arm64.wic
-   ->  Device                                                     Start     End Sectors  Size Type
-       <path-to-img>/ir-acs-live-image-generic-arm64.wic1    2048  206847  204800   100M Microsoft basic data
-       <path-to-img>/ir-acs-live-image-generic-arm64.wic2  206848 1024239  817392 399.1M Linux filesystem
-       <path-to-img>/ir-acs-live-image-generic-arm64.wic3 1026048 1128447  102400    50M Microsoft basic data
-
-   ->  <offset_1st_partition> = 2048 * 512 (sector size) = 1048576
+**NOTE:** Please refer to `FVP instructions for ACS image and run`_ section to find the first partition offset.
 
 ******************************
 Performing the capsule update
@@ -819,10 +835,7 @@
 
    <_workspace>/meta-arm/scripts/runfvp --terminals=xterm <_workspace>/build/tmp/deploy/images/corstone1000-fvp/corstone1000-image-corstone1000-fvp.fvpconf -- -C board.msd_mmc.p_mmc_file=<path-to-img>/ir-acs-live-image-generic-arm64.wic
 
-**NOTE:**
-
-<path-to-img> must start from the root directory.
-make sure there are no spaces before or after of "=". board.msd_mmc.p_mmc_file=<path-to-img>/ir-acs-live-image-generic-arm64.wic.
+**NOTE:** <path-to-img> must start from the root directory. make sure there are no spaces before or after of "=". board.msd_mmc.p_mmc_file=<path-to-img>/ir-acs-live-image-generic-arm64.wic.
 
 Running the FPGA with the IR prebuilt image
 ===========================================
@@ -1060,6 +1073,15 @@
 
 On FPGA, please update the cs1000.bin on the SD card with the newly generated wic file.
 
+**NOTE:** Skip the shim patch only applies to Debian installation. The user should remove the patch from meta-arm before running the software to boot OpenSUSE or executing any other tests in this user guide. You can make sure of removing the skip the shim patch by executing the steps below.
+
+::
+
+  cd <_workspace>/meta-arm
+  git reset --hard HEAD~1
+  cd ..
+  kas shell meta-arm/kas/corstone1000-fvp.yml:meta-arm/ci/debug.yml -c="bitbake u-boot -c cleanall; bitbake trusted-firmware-a -c cleanall; corstone1000-image -c cleanall; bitbake corstone1000-image"
+
 *************************************************
 Preparing the Installation Media
 *************************************************
@@ -1084,7 +1106,7 @@
 In the example given below, we assume the USB device is ``/dev/sdb`` (the user
 should use the `lsblk` command to confirm).
 
-**NOTE:** Please don't confuse your host PC's own hard drive with the USB drive.
+**NOTE:** Please don't confuse your host machine own hard drive with the USB drive.
 Then, copy the contents of the iso file into the first USB stick by running the
 following command in the development machine:
 
@@ -1100,6 +1122,7 @@
 With a minimum size of 8GB formatted with gpt.
 
 ::
+
   #Generating mmc2
   dd if=/dev/zero of=<_workspace>/mmc2_file.img bs=1 count=0 seek=8G; sync;
   parted -s mmc2_file.img mklabel gpt
@@ -1147,7 +1170,7 @@
 Debian may need some extra steps, that are indicated below:
 
 During Debian installation, please answer the following question:
- - "Force GRUB installation to the EFI removable media path?" Yes
+ - "Force grub installation to the EFI removable media path?" Yes
  - "Update NVRAM variables to automatically boot into Debian?" No
 
 If the grub installation fails, these are the steps to follow on the subsequent
@@ -1198,7 +1221,7 @@
   <_workspace>/meta-arm/scripts/runfvp --terminals=xterm <_workspace>/build/tmp/deploy/images/corstone1000-fvp/corstone1000-image-corstone1000-fvp.fvpconf -- -C board.msd_mmc.p_mmc_file="<_workspace>/mmc2_file.img"
 
 
-Once the FVP begins booting, you will need to quickly change the boot option in GRUB,
+Once the FVP begins booting, you will need to quickly change the boot option in grub,
 to boot into recovery mode. 
 
 **NOTE:** This option will disappear quickly, so it's best to preempt it.
@@ -1212,11 +1235,21 @@
 
 ::
 
-  vi /etc/systemd/system.conf #Only applicable to Debian
+  #Only applicable to Debian
+  vi /etc/systemd/system.conf
   DefaultDeviceTimeoutSec=infinity
-  vi /usr/lib/systemd/system.conf # Only applicable to openSUSE
+
+::
+
+  #Only applicable to openSUSE
+  vi /usr/lib/systemd/system.conf
   DefaultDeviceTimeoutSec=infinity
 
+  The system.conf has been moved from /etc/systemd/ to /usr/lib/systemd/ and directly modifying
+  the /usr/lib/systemd/system.conf is not working and it is getting overridden. We have to create
+  drop ins system configurations in /etc/systemd/system.conf.d/ directory. So, copy the 
+  /usr/lib/systemd/system.conf to /etc/systemd/system.conf.d/ directory after the mentioned modifications.
+
 The file to be edited next is different depending on the installed distro:
 
 ::
@@ -1242,6 +1275,8 @@
 Login with the username root and its corresponding password (already set at
 installation time).
 
+**NOTE:** Debian/OpenSUSE Timeouts are not applicable for all systems. Some systems are faster than the others (especially when running the FVP) and works well with default timeouts. If the system boots to Debian or OpenSUSE unmodified, the user can skip this section.
+
 PSA API tests
 -------------
 
@@ -1261,7 +1296,7 @@
 
 ::
 
-  insmod /lib/modules/*-yocto-standard/extra/arm-ffa-tee.ko
+  insmod /lib/modules/*-yocto-standard/updates/arm-ffa-tee.ko
 
 Then, check whether the FF-A TEE driver is loaded correctly by using the following command:
 
@@ -1273,7 +1308,7 @@
 
 ::
 
-   arm_ffa_tee 16384 - - Live 0xffffffc000510000 (O)
+   arm_ffa_tee <ID> - - Live <address> (O)
 
 Now, run the PSA API tests in the following order:
 
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/fiptool-native_2.9.0.bb b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/fiptool-native_2.9.0.bb
similarity index 100%
rename from meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/fiptool-native_2.9.0.bb
rename to meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/fiptool-native_2.9.0.bb
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_%.bbappend b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_%.bbappend
index 074bc68..eef21b9 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_%.bbappend
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_%.bbappend
@@ -2,5 +2,8 @@
 
 COMPATIBLE_MACHINE:corstone1000 = "corstone1000"
 SRCREV:corstone1000 = "5f591f67738a1bbe6b262c53d9dad46ed8bbcd67"
+EXTRA_OEMAKE:append:corstone1000 = " DEBUG=0"
+EXTRA_OEMAKE:append:corstone1000 = " LOG_LEVEL=30"
+TFTF_MODE:corstone1000 = "release"
 
 COMPATIBLE_MACHINE:n1sdp = "n1sdp"
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_2.8.0.bb b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_2.8.0.bb
index ed3b349..160ada6 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_2.8.0.bb
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_2.8.0.bb
@@ -19,6 +19,9 @@
 EXTRA_OEMAKE += "SHELL_COLOR=1"
 EXTRA_OEMAKE += "DEBUG=1"
 
+# Modify mode based on debug or release mode
+TFTF_MODE ?= "debug"
+
 # Platform must be set for each machine
 TFA_PLATFORM ?= "invalid"
 
@@ -45,7 +48,7 @@
 
 do_install() {
     install -d -m 755 ${D}/firmware
-    install -m 0644 ${B}/${TFA_PLATFORM}/debug/tftf.bin ${D}/firmware/tftf.bin
+    install -m 0644 ${B}/${TFA_PLATFORM}/${TFTF_MODE}/tftf.bin ${D}/firmware/tftf.bin
 }
 
 do_deploy() {
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.9.0.bb b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_2.9.0.bb
similarity index 100%
rename from meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.9.0.bb
rename to meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/tf-a-tests_2.9.0.bb
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.8.6.bb b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.8.6.bb
index cffc6db..ef7ea59 100644
--- a/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.8.6.bb
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.8.6.bb
@@ -13,3 +13,7 @@
 SRCREV_mbedtls = "89f040a5c938985c5f30728baed21e49d0846a53"
 
 LIC_FILES_CHKSUM_MBEDTLS = "file://mbedtls/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+do_compile:prepend() {
+    sed -i '/^LDLIBS/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/fiptool/Makefile
+}
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.9.0.bb b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.9.0.bb
similarity index 68%
rename from meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.9.0.bb
rename to meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.9.0.bb
index 5e52695..d9fdf32 100644
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.9.0.bb
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.9.0.bb
@@ -1,13 +1,8 @@
-require trusted-firmware-a.inc
+require recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
 
 # TF-A v2.9.0
 SRCREV_tfa = "d3e71ead6ea5bc3555ac90a446efec84ef6c6122"
 
-# Enable passing TOS_FW_CONFIG from FIP package to Trusted OS.
-SRC_URI:append:qemuarm64-secureboot = " \
-            file://0001-Add-spmc_manifest-for-qemu.patch \
-        "
-
 LIC_FILES_CHKSUM += "file://docs/license.rst;md5=b2c740efedc159745b9b31f88ff03dde"
 
 # mbedtls-3.4.0
@@ -15,3 +10,7 @@
 SRCREV_mbedtls = "1873d3bfc2da771672bd8e7e8f41f57e0af77f33"
 
 LIC_FILES_CHKSUM_MBEDTLS = "file://mbedtls/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+do_compile:prepend() {
+    sed -i '/^LDLIBS/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/fiptool/Makefile
+}
diff --git a/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os_4.0.0.bbappend b/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os_4.0.0.bbappend
new file mode 100644
index 0000000..6c94303
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-security/optee/optee-os_4.0.0.bbappend
@@ -0,0 +1,6 @@
+
+# Machine specific configurations
+MACHINE_OPTEE_OS_REQUIRE ?= ""
+MACHINE_OPTEE_OS_REQUIRE:corstone1000 = "optee-os-corstone1000-common.inc"
+
+require ${MACHINE_OPTEE_OS_REQUIRE}
diff --git a/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass b/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass
index e988802..28e800c 100644
--- a/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass
+++ b/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass
@@ -12,12 +12,11 @@
 INHIBIT_DEFAULT_DEPS = "1"
 COMPATIBLE_HOST = "aarch64-*"
 PACKAGE_ARCH = "${MACHINE_ARCH}"
-inherit nopackages deploy rootfs-postcommands ${IMAGE_CLASSES} python3native
+inherit nopackages deploy rootfs-postcommands ${IMAGE_CLASSES} python3native testimage
 
 do_configure[noexec] = "1"
 do_compile[noexec] = "1"
 do_install[noexec] = "1"
-do_testimage[depends] += "mtools-native:do_populate_sysroot"
 
 # Deploy with this suffix so it is picked up in the machine configuration
 IMAGE_DEPLOY_SUFFIX ?= ".wic"
@@ -80,7 +79,9 @@
 
 do_testimage[postfuncs] += "acs_logs_handle"
 do_testimage[depends] += "edk2-test-parser-native:do_populate_sysroot \
-                          arm-systemready-scripts-native:do_populate_sysroot"
+                          arm-systemready-scripts-native:do_populate_sysroot \
+                          mtools-native:do_populate_sysroot \
+                          parted-native:do_populate_sysroot"
 
 # Process the logs
 python acs_logs_handle() {
diff --git a/meta-arm/meta-arm/recipes-bsp/hafnium/hafnium_2.9.bb b/meta-arm/meta-arm/recipes-bsp/hafnium/hafnium_2.10.bb
similarity index 97%
rename from meta-arm/meta-arm/recipes-bsp/hafnium/hafnium_2.9.bb
rename to meta-arm/meta-arm/recipes-bsp/hafnium/hafnium_2.10.bb
index 0997448..dea1bdc 100644
--- a/meta-arm/meta-arm/recipes-bsp/hafnium/hafnium_2.9.bb
+++ b/meta-arm/meta-arm/recipes-bsp/hafnium/hafnium_2.10.bb
@@ -18,7 +18,7 @@
            file://0001-Use-pkg-config-native-to-find-the-libssl-headers.patch;patchdir=third_party/linux \
            file://0001-work-around-visibility-issue.patch;patchdir=third_party/dtc \
           "
-SRCREV = "0715b8e002cdfb92e6b7efb71128cb24557b70cb"
+SRCREV = "946fde92bedc95e1320684b0bc2dc752bc1e1bc7"
 S = "${WORKDIR}/git"
 B = "${WORKDIR}/build"
 
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/0001-bl31_runtime-revert-usage-of-plat_ic_has_interrupt_t.patch b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/0001-bl31_runtime-revert-usage-of-plat_ic_has_interrupt_t.patch
new file mode 100644
index 0000000..f6f054d
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/files/0001-bl31_runtime-revert-usage-of-plat_ic_has_interrupt_t.patch
@@ -0,0 +1,38 @@
+From fd13a4d304da4233cb954329bf287ec9dfbb7367 Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@arm.com>
+Date: Mon, 4 Dec 2023 10:20:21 -0500
+Subject: [PATCH] bl31_runtime: revert usage of plat_ic_has_interrupt_type
+
+There is a regression caused by commit
+1f6bb41dd951714b47bf07bb9a332346ca261033 for the trusted services tests.
+This is due to the fact that the referenced commit changes the behavior
+from checking for both INTR_TYPE_EL3 and INTR_TYPE_S_EL1, to referencing
+an existing function that #if for _either_ INTR_TYPE_EL3 or
+INTR_TYPE_S_EL1 (depending on the value of GICV2_G0_FOR_EL3).  To work
+around this issue, revert the check back to its original form.
+
+Signed-off-by: Jon Mason <jon.mason@arm.com>
+Upstream-Status: Pending
+---
+ bl31/interrupt_mgmt.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/bl31/interrupt_mgmt.c b/bl31/interrupt_mgmt.c
+index 68c7f10add21..8e888b676b35 100644
+--- a/bl31/interrupt_mgmt.c
++++ b/bl31/interrupt_mgmt.c
+@@ -47,9 +47,9 @@ static intr_type_desc_t intr_type_descs[MAX_INTR_TYPES];
+  ******************************************************************************/
+ static int32_t validate_interrupt_type(uint32_t type)
+ {
+-	if (plat_ic_has_interrupt_type(type)) {
++	if ((type == INTR_TYPE_S_EL1) || (type == INTR_TYPE_NS) ||
++	    (type == INTR_TYPE_EL3))
+ 		return 0;
+-	}
+ 
+ 	return -EINVAL;
+ }
+-- 
+2.30.2
+
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/fiptool-native_2.10.0.bb b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/fiptool-native_2.10.0.bb
new file mode 100644
index 0000000..e45ea9c
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/fiptool-native_2.10.0.bb
@@ -0,0 +1,33 @@
+# Firmware Image Package (FIP)
+# It is a packaging format used by TF-A to package the
+# firmware images in a single binary.
+
+DESCRIPTION = "fiptool - Trusted Firmware tool for packaging"
+LICENSE = "BSD-3-Clause"
+
+SRC_URI_TRUSTED_FIRMWARE_A ?= "git://git.trustedfirmware.org/TF-A/trusted-firmware-a.git;protocol=https"
+SRC_URI = "${SRC_URI_TRUSTED_FIRMWARE_A};destsuffix=fiptool-${PV};branch=${SRCBRANCH}"
+LIC_FILES_CHKSUM = "file://docs/license.rst;md5=b2c740efedc159745b9b31f88ff03dde"
+
+# Use fiptool from TF-A v2.10.0
+SRCREV = "b6c0948400594e3cc4dbb5a4ef04b815d2675808"
+SRCBRANCH = "master"
+
+DEPENDS += "openssl-native"
+
+inherit native
+
+EXTRA_OEMAKE = "V=1 HOSTCC='${BUILD_CC}' OPENSSL_DIR=${STAGING_DIR_NATIVE}/${prefix_native}"
+
+do_compile () {
+    # This is still needed to have the native fiptool executing properly by
+    # setting the RPATH
+    sed -i '/^LDOPTS/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/fiptool/Makefile
+    sed -i '/^INCLUDE_PATHS/ s,$, \$\{BUILD_CFLAGS},' ${S}/tools/fiptool/Makefile
+
+    oe_runmake fiptool
+}
+
+do_install () {
+    install -D -p -m 0755 tools/fiptool/fiptool ${D}${bindir}/fiptool
+}
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.10.0.bb b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.10.0.bb
new file mode 100644
index 0000000..f3818b6
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/tf-a-tests_2.10.0.bb
@@ -0,0 +1,55 @@
+DESCRIPTION = "Trusted Firmware-A tests(aka TFTF)"
+LICENSE = "BSD-3-Clause & NCSA"
+
+LIC_FILES_CHKSUM += "file://docs/license.rst;md5=6175cc0aa2e63b6d21a32aa0ee7d1b4a"
+
+inherit deploy
+
+COMPATIBLE_MACHINE ?= "invalid"
+
+SRC_URI_TRUSTED_FIRMWARE_A_TESTS ?= "git://git.trustedfirmware.org/TF-A/tf-a-tests.git;protocol=https"
+SRC_URI = "${SRC_URI_TRUSTED_FIRMWARE_A_TESTS};branch=${SRCBRANCH} \
+          "
+SRCBRANCH = "master"
+SRCREV = "42b99719d5dde58bdde07712bcb70a20d87f9067"
+
+DEPENDS += "optee-os"
+
+EXTRA_OEMAKE += "USE_NVM=0"
+EXTRA_OEMAKE += "SHELL_COLOR=1"
+EXTRA_OEMAKE += "DEBUG=1"
+
+# Platform must be set for each machine
+TFA_PLATFORM ?= "invalid"
+
+EXTRA_OEMAKE += "ARCH=aarch64"
+EXTRA_OEMAKE += "LOG_LEVEL=50"
+
+S = "${WORKDIR}/git"
+B = "${WORKDIR}/build"
+
+# Add platform parameter
+EXTRA_OEMAKE += "BUILD_BASE=${B} PLAT=${TFA_PLATFORM}"
+
+# Requires CROSS_COMPILE set by hand as there is no configure script
+export CROSS_COMPILE="${TARGET_PREFIX}"
+
+LDFLAGS[unexport] = "1"
+do_compile() {
+    oe_runmake -C ${S} tftf
+}
+
+do_compile[cleandirs] = "${B}"
+
+FILES:${PN} = "/firmware/tftf.bin"
+SYSROOT_DIRS += "/firmware"
+
+do_install() {
+    install -d -m 755 ${D}/firmware
+    install -m 0644 ${B}/${TFA_PLATFORM}/debug/tftf.bin ${D}/firmware/tftf.bin
+}
+
+do_deploy() {
+    cp -rf ${D}/firmware/* ${DEPLOYDIR}/
+}
+addtask deploy after do_install
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
index 2bdf221..922c0a3 100644
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
@@ -168,7 +168,7 @@
 do_compile() {
     # This is still needed to have the native tools executing properly by
     # setting the RPATH
-    sed -i '/^LDLIBS/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/fiptool/Makefile
+    sed -i '/^LDOPTS/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/fiptool/Makefile
     sed -i '/^INCLUDE_PATHS/ s,$, \$\{BUILD_CFLAGS},' ${S}/tools/fiptool/Makefile
     sed -i '/^LIB/ s,$, \$\{BUILD_LDFLAGS},' ${S}/tools/cert_create/Makefile
 
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend
index e58a090..b3624bb 100644
--- a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_%.bbappend
@@ -6,6 +6,13 @@
 # arm/aarch32.  This is a known testing hole in TF-A.
 TOOLCHAIN:qemuarm-secureboot = "gcc"
 
+# Enable passing TOS_FW_CONFIG from FIP package to Trusted OS.
+FILESEXTRAPATHS:prepend:qemuarm64-secureboot := "${THISDIR}/files:"
+SRC_URI:append:qemuarm64-secureboot = " \
+            file://0001-Add-spmc_manifest-for-qemu.patch \
+            file://0001-bl31_runtime-revert-usage-of-plat_ic_has_interrupt_t.patch \
+        "
+
 TFA_PLATFORM:qemuarm64-secureboot = "qemu"
 TFA_PLATFORM:qemu-generic-arm64 = "qemu_sbsa"
 TFA_PLATFORM:qemuarm-secureboot = "qemu"
diff --git a/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.10.0.bb b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.10.0.bb
new file mode 100644
index 0000000..4f01984
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-bsp/trusted-firmware-a/trusted-firmware-a_2.10.0.bb
@@ -0,0 +1,12 @@
+require recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
+
+# TF-A v2.10.0
+SRCREV_tfa = "b6c0948400594e3cc4dbb5a4ef04b815d2675808"
+
+LIC_FILES_CHKSUM += "file://docs/license.rst;md5=b2c740efedc159745b9b31f88ff03dde"
+
+# mbedtls-3.5.1
+SRC_URI_MBEDTLS = "git://github.com/ARMmbed/mbedtls.git;name=mbedtls;protocol=https;destsuffix=git/mbedtls;branch=master"
+SRCREV_mbedtls = "edb8fec9882084344a314368ac7fd957a187519c"
+
+LIC_FILES_CHKSUM_MBEDTLS = "file://mbedtls/LICENSE;md5=379d5819937a6c2f1ef1630d341e026d"
diff --git a/meta-arm/meta-arm/recipes-bsp/uefi/edk2-basetools-native_202308.bb b/meta-arm/meta-arm/recipes-bsp/uefi/edk2-basetools-native_202311.bb
similarity index 92%
rename from meta-arm/meta-arm/recipes-bsp/uefi/edk2-basetools-native_202308.bb
rename to meta-arm/meta-arm/recipes-bsp/uefi/edk2-basetools-native_202311.bb
index 31b8fb0..6bd880b 100644
--- a/meta-arm/meta-arm/recipes-bsp/uefi/edk2-basetools-native_202308.bb
+++ b/meta-arm/meta-arm/recipes-bsp/uefi/edk2-basetools-native_202311.bb
@@ -10,7 +10,7 @@
 SRC_URI = "git://github.com/tianocore/edk2.git;branch=master;protocol=https"
 LIC_FILES_CHKSUM = "file://License.txt;md5=2b415520383f7964e96700ae12b4570a"
 
-SRCREV = "819cfc6b42a68790a23509e4fcc58ceb70e1965e"
+SRCREV = "8736b8fdca85e02933cdb0a13309de14c9799ece"
 
 S = "${WORKDIR}/git"
 
diff --git a/meta-arm/meta-arm/recipes-bsp/uefi/edk2-firmware_202308.bb b/meta-arm/meta-arm/recipes-bsp/uefi/edk2-firmware_202308.bb
deleted file mode 100644
index 8620a67..0000000
--- a/meta-arm/meta-arm/recipes-bsp/uefi/edk2-firmware_202308.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-SRCREV_edk2           ?= "819cfc6b42a68790a23509e4fcc58ceb70e1965e"
-SRCREV_edk2-platforms ?= "bb6841e3fd1c60b3f8510b4fc0a380784e05d326"
-
-# FIXME - clang is having issues with antlr
-TOOLCHAIN:aarch64 = "gcc"
-
-require recipes-bsp/uefi/edk2-firmware.inc
diff --git a/meta-arm/meta-arm/recipes-bsp/uefi/edk2-firmware_202311.bb b/meta-arm/meta-arm/recipes-bsp/uefi/edk2-firmware_202311.bb
new file mode 100644
index 0000000..aa11cfd
--- /dev/null
+++ b/meta-arm/meta-arm/recipes-bsp/uefi/edk2-firmware_202311.bb
@@ -0,0 +1,7 @@
+SRCREV_edk2           ?= "8736b8fdca85e02933cdb0a13309de14c9799ece"
+SRCREV_edk2-platforms ?= "d61836283a4c9198a02387fe7b31a8242e732f3f"
+
+# FIXME - clang is having issues with antlr
+TOOLCHAIN:aarch64 = "gcc"
+
+require recipes-bsp/uefi/edk2-firmware.inc
diff --git a/meta-arm/meta-arm/recipes-bsp/uefi/sbsa-acs_7.1.2.bb b/meta-arm/meta-arm/recipes-bsp/uefi/sbsa-acs_7.1.2.bb
index 781d6e0..a564e2a 100644
--- a/meta-arm/meta-arm/recipes-bsp/uefi/sbsa-acs_7.1.2.bb
+++ b/meta-arm/meta-arm/recipes-bsp/uefi/sbsa-acs_7.1.2.bb
@@ -1,4 +1,4 @@
-require recipes-bsp/uefi/edk2-firmware_202308.bb
+require recipes-bsp/uefi/edk2-firmware_202311.bb
 PROVIDES:remove = "virtual/bootloader"
 
 LICENSE += "& Apache-2.0"
diff --git a/meta-openembedded/meta-filesystems/recipes-filesystems/zfs/zfs_2.2.0.bb b/meta-openembedded/meta-filesystems/recipes-filesystems/zfs/zfs_2.2.2.bb
similarity index 95%
rename from meta-openembedded/meta-filesystems/recipes-filesystems/zfs/zfs_2.2.0.bb
rename to meta-openembedded/meta-filesystems/recipes-filesystems/zfs/zfs_2.2.2.bb
index db6f725..d3ea679 100644
--- a/meta-openembedded/meta-filesystems/recipes-filesystems/zfs/zfs_2.2.0.bb
+++ b/meta-openembedded/meta-filesystems/recipes-filesystems/zfs/zfs_2.2.2.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=7087caaf1dc8a2856585619f4a787faa"
 HOMEPAGE ="https://github.com/openzfs/zfs"
 
-SRCREV = "229ca7d738ccbf4c55076977467ee93e20b6f01b"
+SRCREV = "494aaaed89cb9fe9f2da3b6c6f465a4bc9f6a7e1"
 SRC_URI = "git://github.com/openzfs/zfs;protocol=https;branch=zfs-2.2-release \
            file://0001-Define-strndupa-if-it-does-not-exist.patch \
            file://aaf28a4630af60496c9d33db1d06a7d7d8983422.patch \
@@ -16,7 +16,7 @@
 # Using both 'module' and 'autotools' classes seems a bit odd, they both
 # define a do_compile function.
 # That's why we opt for module-base, also this prevents module splitting.
-inherit module-base pkgconfig autotools
+inherit module-base pkgconfig autotools bash-completion
 
 DEPENDS = "virtual/kernel zlib util-linux libtirpc openssl curl"
 
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/evolution-data-server/evolution-data-server.bb b/meta-openembedded/meta-gnome/recipes-gnome/evolution-data-server/evolution-data-server.bb
index edbe30f..11a52b4 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/evolution-data-server/evolution-data-server.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/evolution-data-server/evolution-data-server.bb
@@ -1,7 +1,7 @@
 require ${BPN}.inc
 
 DEPENDS = " \
-    ${BPN}-native intltool-native gperf-native \
+    ${BPN}-native gperf-native \
     glib-2.0 gtk+3 gtk4 libxml2 icu \
     dbus db virtual/libiconv zlib libsoup-3.0 libical nss libsecret \
 "
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.78.0.bb b/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.78.1.bb
similarity index 92%
rename from meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.78.0.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.78.1.bb
index 67efdab..34eef14 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.78.0.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gjs/gjs_1.78.1.bb
@@ -7,7 +7,7 @@
 
 inherit gnomebase gsettings gobject-introspection gettext features_check upstream-version-is-even pkgconfig
 
-SRC_URI[archive.sha256sum] = "fbaa20e0917668830800f92951688f9fc08f01296affd5cdb4b35f750be27dc9"
+SRC_URI[archive.sha256sum] = "7e90511c429127c39eac0068c4ac9a353df7e6fbbc646f5f18e8962882c18641"
 SRC_URI += " \
     file://0001-Support-cross-builds-a-bit-better.patch \
     file://0002-meson.build-Do-not-add-dir-installed-tests-when-inst.patch \
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software/0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch b/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software/0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch
new file mode 100644
index 0000000..5e051be
--- /dev/null
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software/0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch
@@ -0,0 +1,504 @@
+From 0655f358ed0e8455e12d9634f60bc4dbaee434e3 Mon Sep 17 00:00:00 2001
+From: Matthias Klumpp <matthias@tenstral.net>
+Date: Sun, 8 Oct 2023 20:22:44 +0200
+Subject: [PATCH] Adjust to build with AppStream 1.0 as well as 0.16.x
+
+Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/gnome-software/-/commit/0655f358ed0e8455e12d9634f60bc4dbaee434e3]
+---
+ lib/gs-app.c                             |  4 ++
+ lib/gs-appstream.c                       | 61 +++++++++++++++++++-----
+ lib/gs-utils.c                           |  8 ++--
+ meson.build                              | 22 +--------
+ plugins/core/gs-plugin-appstream.c       |  8 ----
+ plugins/fwupd/gs-fwupd-app.c             |  8 ++++
+ plugins/fwupd/gs-plugin-fwupd.c          |  4 ++
+ src/gs-hardware-support-context-dialog.c |  6 +++
+ src/gs-repos-dialog.c                    |  4 ++
+ src/gs-screenshot-carousel.c             |  4 +-
+ src/gs-screenshot-image.c                | 41 ++++++++++++----
+ src/gs-screenshot-image.h                |  7 +++
+ subprojects/appstream.wrap               |  2 +-
+ 13 files changed, 122 insertions(+), 57 deletions(-)
+
+diff --git a/lib/gs-app.c b/lib/gs-app.c
+index 2308de504d..ea348f8c01 100644
+--- a/lib/gs-app.c
++++ b/lib/gs-app.c
+@@ -609,7 +609,11 @@ gs_app_to_string_append (GsApp *app, GString *str)
+ 		AsScreenshot *ss = g_ptr_array_index (priv->screenshots, i);
+ 		g_autofree gchar *key = NULL;
+ 		tmp = as_screenshot_get_caption (ss);
++#if AS_CHECK_VERSION(1, 0, 0)
++		im = as_screenshot_get_image (ss, 0, 0, 1);
++#else
+ 		im = as_screenshot_get_image (ss, 0, 0);
++#endif
+ 		if (im == NULL)
+ 			continue;
+ 		key = g_strdup_printf ("screenshot-%02u", i);
+diff --git a/lib/gs-appstream.c b/lib/gs-appstream.c
+index deca176dcf..6504d6f25e 100644
+--- a/lib/gs-appstream.c
++++ b/lib/gs-appstream.c
+@@ -1011,8 +1011,11 @@ gs_appstream_refine_app_relation (GsApp           *app,
+ 			as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_CONTROL);
+ 			as_relation_set_value_control_kind (relation, as_control_kind_from_string (xb_node_get_text (child)));
+ 		} else if (g_str_equal (item_kind, "display_length")) {
+-			AsDisplayLengthKind display_length_kind;
+ 			const gchar *compare;
++			const gchar *side;
++#if !AS_CHECK_VERSION(1, 0, 0)
++			AsDisplayLengthKind display_length_kind;
++#endif
+ 
+ 			/* https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-relations-display_length */
+ 			as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_DISPLAY_LENGTH);
+@@ -1020,15 +1023,21 @@ gs_appstream_refine_app_relation (GsApp           *app,
+ 			compare = xb_node_get_attr (child, "compare");
+ 			as_relation_set_compare (relation, (compare != NULL) ? as_relation_compare_from_string (compare) : AS_RELATION_COMPARE_GE);
+ 
++#if AS_CHECK_VERSION(1, 0, 0)
++			side = xb_node_get_attr (child, "side");
++			as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST);
++			as_relation_set_value_px (relation, xb_node_get_text_as_uint (child));
++#else
+ 			display_length_kind = as_display_length_kind_from_string (xb_node_get_text (child));
+ 			if (display_length_kind != AS_DISPLAY_LENGTH_KIND_UNKNOWN) {
+ 				/* Ignore the `side` attribute */
+ 				as_relation_set_value_display_length_kind (relation, display_length_kind);
+ 			} else {
+-				const gchar *side = xb_node_get_attr (child, "side");
++				side = xb_node_get_attr (child, "side");
+ 				as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST);
+ 				as_relation_set_value_px (relation, xb_node_get_text_as_uint (child));
+ 			}
++#endif
+ 		} else {
+ 			g_debug ("Relation type ‘%s’ not currently supported for %s; ignoring",
+ 				 item_kind, gs_app_get_id (app));
+@@ -1472,7 +1481,7 @@ gs_appstream_refine_app (GsPlugin *plugin,
+ }
+ 
+ typedef struct {
+-	AsSearchTokenMatch	 match_value;
++	guint16			 match_value;
+ 	XbQuery			*query;
+ } GsAppstreamSearchHelper;
+ 
+@@ -1522,7 +1531,7 @@ gs_appstream_silo_search_component (GPtrArray *array, XbNode *component, const g
+ }
+ 
+ typedef struct {
+-	AsSearchTokenMatch	match_value;
++	guint16			match_value;
+ 	const gchar		*xpath;
+ } Query;
+ 
+@@ -1539,6 +1548,11 @@ gs_appstream_do_search (GsPlugin *plugin,
+ 	g_autoptr(GPtrArray) array = g_ptr_array_new_with_free_func ((GDestroyNotify) gs_appstream_search_helper_free);
+ 	g_autoptr(GPtrArray) components = NULL;
+ 	g_autoptr(GTimer) timer = g_timer_new ();
++#if AS_CHECK_VERSION(1, 0, 0)
++	const guint16 component_id_weight = as_utils_get_tag_search_weight ("id");
++#else
++	const guint16 component_id_weight = AS_SEARCH_TOKEN_MATCH_ID;
++#endif
+ 
+ 	g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
+ 	g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
+@@ -1585,7 +1599,7 @@ gs_appstream_do_search (GsPlugin *plugin,
+ 			 * Drop the ID token from it as it’s the highest
+ 			 * numeric value but isn’t visible to the user in the
+ 			 * UI, which leads to confusing results ordering. */
+-			gs_app_set_match_value (app, match_value & (~AS_SEARCH_TOKEN_MATCH_ID));
++			gs_app_set_match_value (app, match_value & (~component_id_weight));
+ 			gs_app_list_add (list, app);
+ 
+ 			if (gs_app_get_kind (app) == AS_COMPONENT_KIND_ADDON) {
+@@ -1624,18 +1638,32 @@ gs_appstream_search (GsPlugin *plugin,
+ 		     GCancellable *cancellable,
+ 		     GError **error)
+ {
++#if AS_CHECK_VERSION(1, 0, 0)
++	guint16 pkgname_weight = as_utils_get_tag_search_weight ("pkgname");
++	guint16 name_weight = as_utils_get_tag_search_weight ("name");
++	guint16 id_weight = as_utils_get_tag_search_weight ("id");
+ 	const Query queries[] = {
+-		#ifdef HAVE_AS_SEARCH_TOKEN_MATCH_MEDIATYPE
+-		{ AS_SEARCH_TOKEN_MATCH_MEDIATYPE,	"mimetypes/mimetype[text()~=stem(?)]" },
+-		#else
+-		{ AS_SEARCH_TOKEN_MATCH_MIMETYPE,	"mimetypes/mimetype[text()~=stem(?)]" },
+-		#endif
++		{ as_utils_get_tag_search_weight ("mediatype"),	"provides/mediatype[text()~=stem(?)]" },
+ 		/* Search once with a tokenize-and-casefold operator (`~=`) to support casefolded
+ 		 * full-text search, then again using substring matching (`contains()`), to
+ 		 * support prefix matching. Only do the prefix matches on a few fields, and at a
+ 		 * lower priority, otherwise things will get confusing.
+-		 * 
++		 *
+ 		 * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2277 */
++		{ pkgname_weight,				"pkgname[text()~=stem(?)]" },
++		{ pkgname_weight / 2,				"pkgname[contains(text(),stem(?))]" },
++		{ as_utils_get_tag_search_weight ("summary"),	"summary[text()~=stem(?)]" },
++		{ name_weight,					"name[text()~=stem(?)]" },
++		{ name_weight / 2,				"name[contains(text(),stem(?))]" },
++		{ as_utils_get_tag_search_weight ("keyword"),	"keywords/keyword[text()~=stem(?)]" },
++		{ id_weight,					"id[text()~=stem(?)]" },
++		{ id_weight,					"launchable[text()~=stem(?)]" },
++		{ as_utils_get_tag_search_weight ("origin"),	"../components[@origin~=stem(?)]" },
++		{ 0,						NULL }
++	};
++#else
++	const Query queries[] = {
++		{ AS_SEARCH_TOKEN_MATCH_MEDIATYPE,	"mimetypes/mimetype[text()~=stem(?)]" },
+ 		{ AS_SEARCH_TOKEN_MATCH_PKGNAME,	"pkgname[text()~=stem(?)]" },
+ 		{ AS_SEARCH_TOKEN_MATCH_PKGNAME / 2,	"pkgname[contains(text(),stem(?))]" },
+ 		{ AS_SEARCH_TOKEN_MATCH_SUMMARY,	"summary[text()~=stem(?)]" },
+@@ -1647,6 +1675,7 @@ gs_appstream_search (GsPlugin *plugin,
+ 		{ AS_SEARCH_TOKEN_MATCH_ORIGIN,		"../components[@origin~=stem(?)]" },
+ 		{ AS_SEARCH_TOKEN_MATCH_NONE,		NULL }
+ 	};
++#endif
+ 
+ 	return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error);
+ }
+@@ -1659,11 +1688,21 @@ gs_appstream_search_developer_apps (GsPlugin *plugin,
+ 				    GCancellable *cancellable,
+ 				    GError **error)
+ {
++#if AS_CHECK_VERSION(1, 0, 0)
++	const Query queries[] = {
++		{ as_utils_get_tag_search_weight ("pkgname"), "developer/name[text()~=stem(?)]" },
++		{ as_utils_get_tag_search_weight ("summary"), "project_group[text()~=stem(?)]" },
++		/* for legacy support */
++		{ as_utils_get_tag_search_weight ("pkgname"), "developer_name[text()~=stem(?)]" },
++		{ 0,					      NULL }
++	};
++#else
+ 	const Query queries[] = {
+ 		{ AS_SEARCH_TOKEN_MATCH_PKGNAME,	"developer_name[text()~=stem(?)]" },
+ 		{ AS_SEARCH_TOKEN_MATCH_SUMMARY,	"project_group[text()~=stem(?)]" },
+ 		{ AS_SEARCH_TOKEN_MATCH_NONE,		NULL }
+ 	};
++#endif
+ 
+ 	return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error);
+ }
+diff --git a/lib/gs-utils.c b/lib/gs-utils.c
+index cf9073025f..19e6ebd046 100644
+--- a/lib/gs-utils.c
++++ b/lib/gs-utils.c
+@@ -1694,9 +1694,9 @@ gs_utils_gstring_replace (GString *str,
+ 			  const gchar *find,
+ 			  const gchar *replace)
+ {
+-	#ifdef HAVE_AS_GSTRING_REPLACE_WITH_FOUR_ARGS
++#if AS_CHECK_VERSION(1, 0, 0)
+ 	as_gstring_replace (str, find, replace, 0);
+-	#else
+-	as_gstring_replace (str, find, replace);
+-	#endif
++#else
++	as_gstring_replace2 (str, find, replace, 0);
++#endif
+ }
+diff --git a/meson.build b/meson.build
+index bc19669dd5..8c82464cdb 100644
+--- a/meson.build
++++ b/meson.build
+@@ -113,7 +113,7 @@ add_project_arguments('-D_GNU_SOURCE', language : 'c')
+ conf.set('HAVE_LINUX_UNISTD_H', cc.has_header('linux/unistd.h'))
+ 
+ appstream = dependency('appstream',
+-  version : '>= 0.14.0',
++  version : '>= 0.16.4',
+   fallback : ['appstream', 'appstream_dep'],
+   default_options : [
+     'docs=false',
+@@ -121,26 +121,6 @@ appstream = dependency('appstream',
+     'install-docs=false'
+   ]
+ )
+-if appstream.type_name() == 'internal'
+-else
+-  if meson.get_compiler('c').has_header_symbol('appstream.h', 'AS_SEARCH_TOKEN_MATCH_MEDIATYPE', dependencies: appstream)
+-    conf.set('HAVE_AS_SEARCH_TOKEN_MATCH_MEDIATYPE', '1')
+-  endif
+-  if meson.get_compiler('c').has_header_symbol('appstream.h', 'AS_FORMAT_STYLE_CATALOG', dependencies: appstream)
+-    conf.set('HAVE_AS_FORMAT_STYLE_CATALOG', '1')
+-  endif
+-  if meson.get_compiler('c').has_function('as_metadata_components_to_catalog', prefix: '#include <appstream.h>', dependencies: appstream)
+-    conf.set('HAVE_AS_METADATA_COMPONENTS_TO_CATALOG', '1')
+-  endif
+-  if meson.get_compiler('c').links('''#include <appstream.h>
+-      int main (void)
+-      {
+-         as_gstring_replace (NULL, "a", "b", 0);
+-         return 0;
+-      }''', name: 'as_gstring_replace() has four arguments', dependencies: appstream)
+-    conf.set('HAVE_AS_GSTRING_REPLACE_WITH_FOUR_ARGS', '1')
+-  endif
+-endif
+ 
+ gdk_pixbuf = dependency('gdk-pixbuf-2.0', version : '>= 2.32.0')
+ libxmlb = dependency('xmlb', version : '>= 0.1.7', fallback : ['libxmlb', 'libxmlb_dep'])
+diff --git a/plugins/core/gs-plugin-appstream.c b/plugins/core/gs-plugin-appstream.c
+index cf9f3022b1..ef3226a591 100644
+--- a/plugins/core/gs-plugin-appstream.c
++++ b/plugins/core/gs-plugin-appstream.c
+@@ -414,11 +414,7 @@ gs_plugin_appstream_load_dep11_cb (XbBuilderSource *self,
+ 	if (bytes == NULL)
+ 		return NULL;
+ 
+-	#ifdef HAVE_AS_FORMAT_STYLE_CATALOG
+ 	as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_CATALOG);
+-	#else
+-	as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_COLLECTION);
+-	#endif
+ 	as_metadata_parse_bytes (mdata,
+ 				 bytes,
+ 				 AS_FORMAT_KIND_YAML,
+@@ -428,11 +424,7 @@ gs_plugin_appstream_load_dep11_cb (XbBuilderSource *self,
+ 		return NULL;
+ 	}
+ 
+-	#ifdef HAVE_AS_METADATA_COMPONENTS_TO_CATALOG
+ 	xml = as_metadata_components_to_catalog (mdata, AS_FORMAT_KIND_XML, &tmp_error);
+-	#else
+-	xml = as_metadata_components_to_collection (mdata, AS_FORMAT_KIND_XML, &tmp_error);
+-	#endif
+ 	if (xml == NULL) {
+ 		// This API currently returns NULL if there is nothing to serialize, so we
+ 		// have to test if this is an error or not.
+diff --git a/plugins/fwupd/gs-fwupd-app.c b/plugins/fwupd/gs-fwupd-app.c
+index 6dcda6ee92..5d3254da59 100644
+--- a/plugins/fwupd/gs-fwupd-app.c
++++ b/plugins/fwupd/gs-fwupd-app.c
+@@ -164,7 +164,11 @@ gs_fwupd_app_set_from_device (GsApp *app,
+ 		gs_app_set_install_date (app, fwupd_device_get_created (dev));
+ 	if (fwupd_device_get_description (dev) != NULL) {
+ 		g_autofree gchar *tmp = NULL;
++#if AS_CHECK_VERSION(1, 0, 0)
++		tmp = as_markup_convert (fwupd_device_get_description (dev), AS_MARKUP_KIND_TEXT, NULL);
++#else
+ 		tmp = as_markup_convert_simple (fwupd_device_get_description (dev), NULL);
++#endif
+ 		if (tmp != NULL)
+ 			gs_app_set_description (app, GS_APP_QUALITY_NORMAL, tmp);
+ 	}
+@@ -402,7 +406,11 @@ gs_fwupd_app_set_from_release (GsApp *app, FwupdRelease *rel)
+ 	}
+ 	if (fwupd_release_get_description (rel) != NULL) {
+ 		g_autofree gchar *tmp = NULL;
++#if AS_CHECK_VERSION(1, 0, 0)
++		tmp = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL);
++#else
+ 		tmp = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
++#endif
+ 		if (tmp != NULL)
+ 			gs_app_set_update_details_text (app, tmp);
+ 	}
+diff --git a/plugins/fwupd/gs-plugin-fwupd.c b/plugins/fwupd/gs-plugin-fwupd.c
+index d8c0cd2dd4..a9b05028a0 100644
+--- a/plugins/fwupd/gs-plugin-fwupd.c
++++ b/plugins/fwupd/gs-plugin-fwupd.c
+@@ -727,7 +727,11 @@ gs_plugin_add_updates (GsPlugin *plugin,
+ 				g_autofree gchar *desc = NULL;
+ 				if (fwupd_release_get_description (rel) == NULL)
+ 					continue;
++#if AS_CHECK_VERSION(1, 0, 0)
++				desc = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL);
++#else
+ 				desc = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
++#endif
+ 				if (desc == NULL)
+ 					continue;
+ 				g_string_append_printf (update_desc,
+diff --git a/src/gs-hardware-support-context-dialog.c b/src/gs-hardware-support-context-dialog.c
+index 0e48c8c266..14653401de 100644
+--- a/src/gs-hardware-support-context-dialog.c
++++ b/src/gs-hardware-support-context-dialog.c
+@@ -461,6 +461,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor     *monitor,
+ 			AsRelationCompare comparator = as_relation_get_compare (relation);
+ 			Range current_display_comparand, relation_comparand;
+ 
++#if !AS_CHECK_VERSION(1, 0, 0)
+ 			/* From https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-requires-recommends-display_length */
+ 			Range display_lengths[] = {
+ 				[AS_DISPLAY_LENGTH_KIND_XSMALL] = { 0, 360 },
+@@ -469,6 +470,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor     *monitor,
+ 				[AS_DISPLAY_LENGTH_KIND_LARGE] = { 1024, 3840 },
+ 				[AS_DISPLAY_LENGTH_KIND_XLARGE] = { 3840, G_MAXUINT },
+ 			};
++#endif
+ 
+ 			any_display_relations_set = TRUE;
+ 
+@@ -485,11 +487,14 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor     *monitor,
+ 			case AS_DISPLAY_SIDE_KIND_LAST:
+ 			default:
+ 				current_display_comparand.min = current_display_comparand.max = MAX (current_screen_size.width, current_screen_size.height);
++#if !AS_CHECK_VERSION(1, 0, 0)
+ 				relation_comparand.min = display_lengths[as_relation_get_value_display_length_kind (relation)].min;
+ 				relation_comparand.max = display_lengths[as_relation_get_value_display_length_kind (relation)].max;
++#endif
+ 				break;
+ 			}
+ 
++#if !AS_CHECK_VERSION(1, 0, 0)
+ 			if (evaluate_display_comparison (display_lengths[AS_DISPLAY_LENGTH_KIND_SMALL], comparator, relation_comparand)) {
+ 				*mobile_relation_kind_out = max_relation_kind (*mobile_relation_kind_out, as_relation_get_kind (relation));
+ 				*mobile_match_out = TRUE;
+@@ -499,6 +504,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor     *monitor,
+ 				*desktop_relation_kind_out = max_relation_kind (*desktop_relation_kind_out, as_relation_get_kind (relation));
+ 				*desktop_match_out = TRUE;
+ 			}
++#endif
+ 
+ 			if (evaluate_display_comparison (current_display_comparand, comparator, relation_comparand)) {
+ 				*current_relation_kind_out = max_relation_kind (*current_relation_kind_out, as_relation_get_kind (relation));
+diff --git a/src/gs-repos-dialog.c b/src/gs-repos-dialog.c
+index c41c4944a1..7dac0416d9 100644
+--- a/src/gs-repos-dialog.c
++++ b/src/gs-repos-dialog.c
+@@ -154,7 +154,11 @@ enable_repo (GsReposDialog *dialog,
+ 		g_autoptr(GError) error = NULL;
+ 
+ 		/* convert from AppStream markup */
++#if AS_CHECK_VERSION(1, 0, 0)
++		message = as_markup_convert (gs_app_get_agreement (repo), AS_MARKUP_KIND_TEXT, &error);
++#else
+ 		message = as_markup_convert_simple (gs_app_get_agreement (repo), &error);
++#endif
+ 		if (message == NULL) {
+ 			/* failed, so just try and show the original markup */
+ 			message = g_strdup (gs_app_get_agreement (repo));
+diff --git a/src/gs-screenshot-carousel.c b/src/gs-screenshot-carousel.c
+index 04bbf86a1e..d269af6605 100644
+--- a/src/gs-screenshot-carousel.c
++++ b/src/gs-screenshot-carousel.c
+@@ -141,8 +141,8 @@ gs_screenshot_carousel_load_screenshots (GsScreenshotCarousel *self, GsApp *app,
+ 		gtk_widget_set_can_focus (gtk_widget_get_first_child (ssimg), FALSE);
+ 		gs_screenshot_image_set_screenshot (GS_SCREENSHOT_IMAGE (ssimg), ss);
+ 		gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE (ssimg),
+-					      AS_IMAGE_NORMAL_WIDTH,
+-					      AS_IMAGE_NORMAL_HEIGHT);
++					      GS_IMAGE_NORMAL_WIDTH,
++					      GS_IMAGE_NORMAL_HEIGHT);
+ 		gtk_widget_add_css_class (ssimg, "screenshot-image-main");
+ 		gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE (ssimg), cancellable);
+ 
+diff --git a/src/gs-screenshot-image.c b/src/gs-screenshot-image.c
+index 93dba68f96..6b4db03d06 100644
+--- a/src/gs-screenshot-image.c
++++ b/src/gs-screenshot-image.c
+@@ -293,13 +293,13 @@ gs_screenshot_image_save_downloaded_img (GsScreenshotImage *ssimg,
+ 	if (images->len > 1)
+ 		return TRUE;
+ 
+-	if (width == AS_IMAGE_THUMBNAIL_WIDTH &&
+-	    height == AS_IMAGE_THUMBNAIL_HEIGHT) {
+-		width = AS_IMAGE_NORMAL_WIDTH;
+-		height = AS_IMAGE_NORMAL_HEIGHT;
++	if (width == GS_IMAGE_THUMBNAIL_WIDTH &&
++	    height == GS_IMAGE_THUMBNAIL_HEIGHT) {
++		width = GS_IMAGE_NORMAL_WIDTH;
++		height = GS_IMAGE_NORMAL_HEIGHT;
+ 	} else {
+-		width = AS_IMAGE_THUMBNAIL_WIDTH;
+-		height = AS_IMAGE_THUMBNAIL_HEIGHT;
++		width = GS_IMAGE_THUMBNAIL_WIDTH;
++		height = GS_IMAGE_THUMBNAIL_HEIGHT;
+ 	}
+ 
+ 	width *= ssimg->scale;
+@@ -591,16 +591,30 @@ gs_screenshot_image_get_url (GsScreenshotImage *ssimg)
+ 	} else if (as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE) {
+ 		AsImage *im;
+ 
++#if AS_CHECK_VERSION(1, 0, 0)
++		im = as_screenshot_get_image (ssimg->screenshot,
++					      ssimg->width,
++					      ssimg->height,
++					      ssimg->scale);
++#else
+ 		im = as_screenshot_get_image (ssimg->screenshot,
+ 					      ssimg->width * ssimg->scale,
+ 					      ssimg->height * ssimg->scale);
++#endif
+ 
+ 		/* if we've failed to load a HiDPI image, fallback to LoDPI */
+ 		if (im == NULL && ssimg->scale > 1) {
+ 			ssimg->scale = 1;
++#if AS_CHECK_VERSION(1, 0, 0)
++			im = as_screenshot_get_image (ssimg->screenshot,
++						      ssimg->width,
++						      ssimg->height,
++						      1);
++#else
+ 			im = as_screenshot_get_image (ssimg->screenshot,
+ 						      ssimg->width,
+ 						      ssimg->height);
++#endif
+ 		}
+ 
+ 		if (im)
+@@ -707,15 +721,22 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
+ 	 * smaller version of it straight away */
+ 	if (!ssimg->showing_image &&
+ 	    as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE &&
+-	    ssimg->width > AS_IMAGE_THUMBNAIL_WIDTH &&
+-	    ssimg->height > AS_IMAGE_THUMBNAIL_HEIGHT) {
++	    ssimg->width > GS_IMAGE_THUMBNAIL_WIDTH &&
++	    ssimg->height > GS_IMAGE_THUMBNAIL_HEIGHT) {
+ 		const gchar *url_thumb;
+ 		g_autofree gchar *basename_thumb = NULL;
+ 		g_autofree gchar *cache_kind_thumb = NULL;
+ 		AsImage *im;
++#if AS_CHECK_VERSION(1, 0, 0)
+ 		im = as_screenshot_get_image (ssimg->screenshot,
+-					      AS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale,
+-					      AS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale);
++					      GS_IMAGE_THUMBNAIL_WIDTH,
++					      GS_IMAGE_THUMBNAIL_HEIGHT,
++					      ssimg->scale);
++#else
++		im = as_screenshot_get_image (ssimg->screenshot,
++					      GS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale,
++					      GS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale);
++#endif
+ 		url_thumb = as_image_get_url (im);
+ 		basename_thumb = gs_screenshot_get_cachefn_for_url (url_thumb);
+ 		cache_kind_thumb = g_build_filename ("screenshots", "112x63", NULL);
+diff --git a/src/gs-screenshot-image.h b/src/gs-screenshot-image.h
+index 1f6cf81ce6..6e45f5d20a 100644
+--- a/src/gs-screenshot-image.h
++++ b/src/gs-screenshot-image.h
+@@ -21,6 +21,13 @@ G_BEGIN_DECLS
+ 
+ G_DECLARE_FINAL_TYPE (GsScreenshotImage, gs_screenshot_image, GS, SCREENSHOT_IMAGE, GtkWidget)
+ 
++#define GS_IMAGE_LARGE_HEIGHT		423
++#define GS_IMAGE_LARGE_WIDTH		752
++#define GS_IMAGE_NORMAL_HEIGHT		351
++#define GS_IMAGE_NORMAL_WIDTH		624
++#define GS_IMAGE_THUMBNAIL_HEIGHT	63
++#define GS_IMAGE_THUMBNAIL_WIDTH 	112
++
+ GtkWidget	*gs_screenshot_image_new		(SoupSession		*session);
+ 
+ AsScreenshot	*gs_screenshot_image_get_screenshot	(GsScreenshotImage	*ssimg);
+diff --git a/subprojects/appstream.wrap b/subprojects/appstream.wrap
+index 6f0beb0cbc..b9a9c7dbe5 100644
+--- a/subprojects/appstream.wrap
++++ b/subprojects/appstream.wrap
+@@ -1,5 +1,5 @@
+ [wrap-git]
+ directory = appstream
+ url = https://github.com/ximion/appstream.git
+-revision = v0.14.1
++revision = v0.16.4
+ depth = 1
+-- 
+GitLab
+
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software/e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch b/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software/e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch
new file mode 100644
index 0000000..b7bddc3
--- /dev/null
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software/e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch
@@ -0,0 +1,31 @@
+From e431ab003f3fabf616b6eb7dc93f8967bc9473e5 Mon Sep 17 00:00:00 2001
+From: Milan Crha <mcrha@redhat.com>
+Date: Wed, 22 Nov 2023 09:44:40 +0100
+Subject: [PATCH] gs-appstream: Remove use of AS_PROVIDED_KIND_PYTHON_2
+
+It's dropped in appstream 1.0.0 and it's not used anywhere in the gnome-software
+code, thus just remove it, rather than have it only for pre-1.0.0 appstream version.
+
+Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2388
+
+Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/gnome-software/-/commit/e431ab003f3fabf616b6eb7dc93f8967bc9473e5]
+---
+ lib/gs-appstream.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/lib/gs-appstream.c b/lib/gs-appstream.c
+index 6504d6f25..4fd7f5334 100644
+--- a/lib/gs-appstream.c
++++ b/lib/gs-appstream.c
+@@ -587,8 +587,6 @@ gs_appstream_refine_add_provides (GsApp *app, XbNode *component, GError **error)
+ 					kind = AS_PROVIDED_KIND_FIRMWARE_RUNTIME;
+ 				else if (g_strcmp0 (fw_type, "flashed") == 0)
+ 					kind = AS_PROVIDED_KIND_FIRMWARE_FLASHED;
+-			} else if (g_strcmp0 (element_name, "python2") == 0) {
+-				kind = AS_PROVIDED_KIND_PYTHON_2;
+ 			} else if (g_strcmp0 (element_name, "python3") == 0) {
+ 				kind = AS_PROVIDED_KIND_PYTHON;
+ 			} else if (g_strcmp0 (element_name, "dbus") == 0) {
+-- 
+GitLab
+
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.1.bb b/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.2.bb
similarity index 85%
rename from meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.1.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.2.bb
index f363a2b..fc2b696 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.1.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.2.bb
@@ -28,7 +28,11 @@
 
 EXTRA_OEMESON += "-Dtests=false -Dsoup2=false"
 
-SRC_URI[archive.sha256sum] = "d72485f7a6e0917f64edbedd68fd7b57246c6ebf10c5a45108b63946635778a2"
+SRC_URI += " \
+	file://0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch \
+	file://e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch \
+"
+SRC_URI[archive.sha256sum] = "0bdd8fc0caecd6eb013c6010dbca93077397118a6ef5eaf264e2a820a292f5b7"
 
 PACKAGECONFIG ?= "flatpak"
 PACKAGECONFIG[flatpak] = "-Dflatpak=true,-Dflatpak=false,flatpak ostree"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.12.2.bb b/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.12.2.bb
index 67e6491..2668fc0 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.12.2.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gspell/gspell_1.12.2.bb
@@ -3,9 +3,9 @@
 LICENSE = "LGPL-2.1-only"
 LIC_FILES_CHKSUM = "file://COPYING;md5=8c2e1ec1540fb3e0beb68361344cba7e"
 
-DEPENDS = "gtk+3 iso-codes enchant2"
+DEPENDS = "gtk+3 icu enchant2"
 
 GNOMEBASEBUILDCLASS = "autotools"
-inherit gnomebase gettext gobject-introspection vala
+inherit gnomebase gettext gobject-introspection vala gtk-doc
 
 SRC_URI[archive.sha256sum] = "b4e993bd827e4ceb6a770b1b5e8950fce3be9c8b2b0cbeb22fdf992808dd2139"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gthumb/gthumb_3.12.2.bb b/meta-openembedded/meta-gnome/recipes-gnome/gthumb/gthumb_3.12.4.bb
similarity index 81%
rename from meta-openembedded/meta-gnome/recipes-gnome/gthumb/gthumb_3.12.2.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/gthumb/gthumb_3.12.4.bb
index ecf8f6a..79db8b7 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gthumb/gthumb_3.12.2.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gthumb/gthumb_3.12.4.bb
@@ -23,9 +23,8 @@
     libsecret \
 "
 
-GNOMEBASEBUILDCLASS = "autotools"
 inherit features_check gnomebase gnome-help gsettings itstool mime-xdg
 
-SRC_URI[archive.sha256sum] = "97f8afe522535216541ebbf1e3b546d12a6beb38a8f0eb85f26e676934aad425"
+SRC_URI[archive.sha256sum] = "add693ac0aeb9a30d829ba03a06208289d3f6868dc3b02573549e88190c794e8"
 
 FILES:${PN} += "${datadir}/metainfo"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview3_3.24.11.bb b/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview3_3.24.11.bb
index 75f199b..e504186 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview3_3.24.11.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview3_3.24.11.bb
@@ -4,7 +4,7 @@
 LICENSE = "LGPL-2.1-only"
 LIC_FILES_CHKSUM = "file://COPYING;md5=fbc093901857fcd118f065f900982c24"
 
-DEPENDS = "gtk+3 libxml2 intltool-native gnome-common-native glib-2.0-native"
+DEPENDS = "gtk+3 libxml2 glib-2.0-native"
 
 PNAME = "gtksourceview"
 
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview4_4.8.4.bb b/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview4_4.8.4.bb
index 6acd003..353f02f 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview4_4.8.4.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview4_4.8.4.bb
@@ -4,7 +4,7 @@
 LICENSE = "LGPL-2.1-only"
 LIC_FILES_CHKSUM = "file://COPYING;md5=fbc093901857fcd118f065f900982c24"
 
-DEPENDS = "gtk+3 libxml2 intltool-native gnome-common-native glib-2.0-native"
+DEPENDS = "gtk+3 libxml2 glib-2.0-native"
 
 PNAME = "gtksourceview"
 
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview5_5.10.0.bb b/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview5_5.10.0.bb
index f43fe2c..a336b19 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview5_5.10.0.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/gtksourceview/gtksourceview5_5.10.0.bb
@@ -7,7 +7,6 @@
 DEPENDS = " \
     fribidi \
     glib-2.0-native \
-    gnome-common-native \
     fontconfig \
     gtk4 \
     libxml2 \
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/libgsf/libgsf_1.14.51.bb b/meta-openembedded/meta-gnome/recipes-gnome/libgsf/libgsf_1.14.51.bb
index a549915..5ee73f5 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/libgsf/libgsf_1.14.51.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/libgsf/libgsf_1.14.51.bb
@@ -4,7 +4,7 @@
 
 SECTION = "libs"
 
-DEPENDS= "libxml2 bzip2 glib-2.0 zlib gnome-common-native"
+DEPENDS= "libxml2 bzip2 glib-2.0 zlib"
 
 GNOMEBASEBUILDCLASS = "autotools"
 inherit gnomebase gobject-introspection gettext gtk-doc
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/mutter/mutter_45.1.bb b/meta-openembedded/meta-gnome/recipes-gnome/mutter/mutter_45.1.bb
index 60347aa..6093a0f 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/mutter/mutter_45.1.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/mutter/mutter_45.1.bb
@@ -6,6 +6,7 @@
     xserver-xorg-cvt-native \
     wayland-native \
     virtual/libx11 \
+    colord \
     graphene \
     gtk4 \
     gdk-pixbuf \
@@ -13,8 +14,6 @@
     pango \
     gsettings-desktop-schemas \
     json-glib \
-    gnome-desktop \
-    gnome-settings-daemon \
     libei \
     libxtst \
     libxkbfile \
@@ -41,6 +40,7 @@
     ${@bb.utils.contains('DISTRO_FEATURES', 'opengl x11', 'opengl glx', '', d)} \
     sm \
     startup-notification \
+    gnome-desktop \
 "
 
 EXTRA_OEMESON += " \
@@ -57,7 +57,9 @@
 PACKAGECONFIG[libwacom] = "-Dlibwacom=true, -Dlibwacom=false, libwacom"
 # Remove depending on pipewire-0.2 when mutter is upgraded to 3.36+
 PACKAGECONFIG[remote-desktop] = "-Dremote_desktop=true, -Dremote_desktop=false, pipewire"
+PACKAGECONFIG[gnome-desktop] = "-Dlibgnome_desktop=true, -Dlibgnome_desktop=false, gnome-desktop gnome-settings-daemon"
 PACKAGECONFIG[sm] = "-Dsm=true, -Dsm=false, libsm"
+PACKAGECONFIG[sound-player] = "-Dsound_player=true, -Dsound_player=false, libcanberra"
 PACKAGECONFIG[profiler] = "-Dprofiler=true,-Dprofiler=false,sysprof"
 PACKAGECONFIG[startup-notification] = "-Dstartup_notification=true, -Dstartup_notification=false, startup-notification, startup-notification"
 
@@ -102,5 +104,5 @@
     ${libdir}/${MUTTER_API_NAME}/lib*.so \
 "
 
-RDEPENDS:${PN} += "zenity ${PN}-gsettings"
+RDEPENDS:${PN} += "zenity ${PN}-gsettings gsettings-desktop-schemas"
 
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/rest/librest_0.8.1.bb b/meta-openembedded/meta-gnome/recipes-gnome/rest/librest_0.8.1.bb
index 51dc44c..63372af 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/rest/librest_0.8.1.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/rest/librest_0.8.1.bb
@@ -4,17 +4,14 @@
 LIC_FILES_CHKSUM = "file://COPYING;md5=2d5025d4aa3495befef8f17206a5b0a1"
 
 DEPENDS = " \
-    gi-docgen \
-    gi-docgen-native \
     glib-2.0 \
     glib-2.0-native \
-    json-glib \
     libsoup-2.4 \
-    libxml2-native \
+    libxml2 \
 "
 
 GNOMEBASEBUILDCLASS = "autotools"
-inherit gnomebase gobject-introspection vala pkgconfig
+inherit gnomebase gobject-introspection vala pkgconfig gtk-doc
 
 GNOMEBN = "rest"
 
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_3.6.0.bb b/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_3.6.0.bb
index c5b5c4e..603efbb 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_3.6.0.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/tracker/tracker_3.6.0.bb
@@ -19,7 +19,7 @@
 "
 
 
-inherit gettext gnomebase gsettings gobject-introspection vala gtk-doc  bash-completion python3native
+inherit gettext gnomebase gobject-introspection vala gtk-doc bash-completion python3native
 
 SRC_URI += "file://0001-fix-reproducibility.patch"
 SRC_URI[archive.sha256sum] = "52592cfe19baffd16dbe47475be7da750dbd0b6333fd7acb60faa9da5bc40df2"
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity/0001-Harcode-shebang-to-avoid-pointing-to-build-system-s-.patch b/meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity/0001-Harcode-shebang-to-avoid-pointing-to-build-system-s-.patch
deleted file mode 100644
index e054ff7..0000000
--- a/meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity/0001-Harcode-shebang-to-avoid-pointing-to-build-system-s-.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From c8be0d5e7d17930d819635df6570fa5331a5dedd Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@gmail.com>
-Date: Mon, 10 Jan 2022 20:18:00 +0100
-Subject: [PATCH] Harcode shebang to avoid pointing to build system's perl
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Upstream-Status: Pending
-
-Signed-off-by: Andreas Müller <schnitzeltony@gmail.com>
----
- src/gdialog.in | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/gdialog.in b/src/gdialog.in
-index 2fc4633..f891861 100755
---- a/src/gdialog.in
-+++ b/src/gdialog.in
-@@ -1,4 +1,4 @@
--#!@PERL@
-+#!/usr/bin/env perl
- 
- # gdialog -> zenity conversion wrapper
- #
--- 
-2.31.1
-
diff --git a/meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity_3.44.2.bb b/meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity_4.0.0.bb
similarity index 62%
rename from meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity_3.44.2.bb
rename to meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity_4.0.0.bb
index 92b9f66..a151f3c 100644
--- a/meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity_3.44.2.bb
+++ b/meta-openembedded/meta-gnome/recipes-gnome/zenity/zenity_4.0.0.bb
@@ -3,25 +3,23 @@
 LICENSE = "LGPL-2.1-or-later"
 LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c"
 
-
 inherit gnomebase pkgconfig itstool gtk-icon-cache features_check gettext
 
 DEPENDS = " \
     desktop-file-utils-native \
+    help2man-native \
     hicolor-icon-theme \
-    gtk+3 \
-    gtk+3-native \
+    gtk4 \
+    gtk4-native \
+    libadwaita \
 "
 
 ANY_OF_DISTRO_FEATURES = "${GTK3DISTROFEATURES}"
+GTKIC_VERSION = "4"
 
-SRC_URI[archive.sha256sum] = "3fb5b8b1044d3d129262d3c54cf220eb7f76bc21bd5ac6d96ec115cd3518300e"
-SRC_URI += "file://0001-Harcode-shebang-to-avoid-pointing-to-build-system-s-.patch"
+SRC_URI[archive.sha256sum] = "0b8c8def18dab05cc49bd464b90ca7f945ae52ff5e09242da702a15d94d3e8dd"
 
 PACKAGECONFIG ?= "webkitgtk"
-PACKAGECONFIG[webkitgtk] = "-Dwebkitgtk=true,-Dwebkitgtk=false,webkitgtk3"
+PACKAGECONFIG[webkitgtk] = "-Dwebkitgtk=true,-Dwebkitgtk=false,webkitgtk"
 
-PACKAGES =+ "${PN}-gdialog"
-FILES:${PN}-gdialog = "${bindir}/gdialog"
 FILES:${PN}-doc = "${datadir}/man ${datadir}/help"
-RDEPENDS:${PN}-gdialog += "perl"
diff --git a/meta-openembedded/meta-gnome/recipes-support/keybinder/keybinder_3.0.bb b/meta-openembedded/meta-gnome/recipes-support/keybinder/keybinder_3.0.bb
index 971ad90..278592d 100644
--- a/meta-openembedded/meta-gnome/recipes-support/keybinder/keybinder_3.0.bb
+++ b/meta-openembedded/meta-gnome/recipes-support/keybinder/keybinder_3.0.bb
@@ -9,7 +9,6 @@
 LIC_FILES_CHKSUM = "file://COPYING;md5=1f18f9c6d8b4cfcc7d7804a243a4c0b4"
 
 S = "${WORKDIR}/git"
-B = "${S}"
 
 SRCREV = "736ccef40d39603b8111c8a3a0bca0319bbafdc0"
 PV = "3.0+git${SRCPV}"
@@ -18,11 +17,13 @@
 
 RDEPENDS:${PN} = "gtk+"
 
-inherit features_check autotools gtk-doc gobject-introspection
+inherit features_check autotools-brokensep gtk-doc gobject-introspection
 
 REQUIRED_DISTRO_FEATURES = "x11"
 do_configure:prepend() {
 	touch ${S}/ChangeLog
 }
 
-SRC_DISTRIBUTE_LICENSES += "X11"
+# gtk-doc generation doesn't work, so disable it:
+# ../keybinder-docs.sgml:26: element include: XInclude error : could not load ../xml/tree_index.sgml, and no fallback was found
+GTKDOC_ENABLED = "False"
diff --git a/meta-openembedded/meta-multimedia/recipes-connectivity/rygel/rygel_0.42.4.bb b/meta-openembedded/meta-multimedia/recipes-connectivity/rygel/rygel_0.42.4.bb
index 9662296..4fbdce0 100644
--- a/meta-openembedded/meta-multimedia/recipes-connectivity/rygel/rygel_0.42.4.bb
+++ b/meta-openembedded/meta-multimedia/recipes-connectivity/rygel/rygel_0.42.4.bb
@@ -18,7 +18,7 @@
 inherit gnomebase features_check vala gobject-introspection gettext systemd
 
 # gobject-introspection is mandatory for libmediaart-2.0 and cannot be configured
-REQUIRED_DISTRO_FEATURES = "gobject-introspection-data"
+REQUIRED_DISTRO_FEATURES = "gobject-introspection-data x11"
 
 SRC_URI[archive.sha256sum] = "6310dfaa2d332b66119b9b020fad6a4bd27d9bc61faf780ca5ca0b62813303f7"
 
@@ -37,7 +37,7 @@
 PACKAGECONFIG[gst-launch] = ""
 PACKAGECONFIG[lms] = ""
 PACKAGECONFIG[tracker3] = ""
-PACKAGECONFIG[gtk+3] = ",-Dgtk=false,gtk+3"
+PACKAGECONFIG[gtk+3] = ",-Dgtk=disabled,gtk+3"
 
 RYGEL_PLUGINS = ""
 RYGEL_PLUGINS:append ="${@bb.utils.contains('PACKAGECONFIG', 'external', ',external', '', d)}"
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/gstreamer-1.0/gstd_git.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/gstreamer-1.0/gstd_git.bb
index cabbf2c..8779249 100644
--- a/meta-openembedded/meta-multimedia/recipes-multimedia/gstreamer-1.0/gstd_git.bb
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/gstreamer-1.0/gstd_git.bb
@@ -20,9 +20,9 @@
 inherit meson pkgconfig gettext gtk-doc python3native python3-dir python3targetconfig
 
 do_install:append() {
-        rmdir ${D}${root_prefix}${localstatedir}/run/${BPN} ${D}${root_prefix}${localstatedir}/run \
-              ${D}${root_prefix}${localstatedir}/log/${BPN} ${D}${root_prefix}${localstatedir}/log \
-              ${D}${root_prefix}${localstatedir}
+        rmdir ${D}${exec_prefix}${localstatedir}/run/${BPN} ${D}${exec_prefix}${localstatedir}/run \
+              ${D}${exec_prefix}${localstatedir}/log/${BPN} ${D}${exec_prefix}${localstatedir}/log \
+              ${D}${exec_prefix}${localstatedir}
         rm -f ${D}${bindir}/gst-client ${D}${bindir}/gstd-client
         if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
                 install -d ${D}${sysconfdir}/tmpfiles.d
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera/0001-mojom-Drop-using-imp-module.patch b/meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera/0001-mojom-Drop-using-imp-module.patch
new file mode 100644
index 0000000..b07a790
--- /dev/null
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera/0001-mojom-Drop-using-imp-module.patch
@@ -0,0 +1,176 @@
+From 23a9bbb9ab380344c5daf5bc0109fab249e41afd Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 30 Dec 2023 10:55:44 -0800
+Subject: [PATCH] mojom: Drop using imp module.
+
+This module is gone in python 3.12 onwards, in most places it is unused
+so remove from those places, in some places where its still is needed
+replace it with importlib.util
+
+Fixes [1]
+
+[1] https://bugs.libcamera.org/show_bug.cgi?id=206
+
+Upstream-Status: Submitted [https://lists.libcamera.org/pipermail/libcamera-devel/2023-December/039986.html]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ utils/ipc/mojo/public/tools/mojom/mojom/fileutil.py        | 1 -
+ .../ipc/mojo/public/tools/mojom/mojom/fileutil_unittest.py | 1 -
+ .../tools/mojom/mojom/generate/generator_unittest.py       | 7 ++-----
+ .../tools/mojom/mojom/generate/translate_unittest.py       | 1 -
+ .../mojo/public/tools/mojom/mojom/parse/ast_unittest.py    | 1 -
+ .../mojom/mojom/parse/conditional_features_unittest.py     | 7 ++-----
+ utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer.py     | 1 -
+ .../mojo/public/tools/mojom/mojom/parse/lexer_unittest.py  | 6 ++----
+ .../mojo/public/tools/mojom/mojom/parse/parser_unittest.py | 1 -
+ 9 files changed, 6 insertions(+), 20 deletions(-)
+
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/fileutil.py b/utils/ipc/mojo/public/tools/mojom/mojom/fileutil.py
+index bf626f54..e1c823da 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/fileutil.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/fileutil.py
+@@ -3,7 +3,6 @@
+ # found in the LICENSE file.
+ 
+ import errno
+-import imp
+ import os.path
+ import sys
+ 
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/fileutil_unittest.py b/utils/ipc/mojo/public/tools/mojom/mojom/fileutil_unittest.py
+index ff5753a2..e754151f 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/fileutil_unittest.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/fileutil_unittest.py
+@@ -2,7 +2,6 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
+ import os.path
+ import shutil
+ import sys
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/generate/generator_unittest.py b/utils/ipc/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
+index 32c884a8..6cae6092 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
+@@ -2,7 +2,7 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
++import importlib.util
+ import os.path
+ import sys
+ import unittest
+@@ -18,10 +18,7 @@ def _GetDirAbove(dirname):
+     if tail == dirname:
+       return path
+ 
+-
+-try:
+-  imp.find_module("mojom")
+-except ImportError:
++if importlib.util.find_spec("mojom") is None:
+   sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
+ from mojom.generate import generator
+ 
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/generate/translate_unittest.py b/utils/ipc/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
+index 19905c8a..09724d88 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
+@@ -2,7 +2,6 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
+ import os.path
+ import sys
+ import unittest
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/parse/ast_unittest.py b/utils/ipc/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
+index 62798631..4ab51033 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
+@@ -2,7 +2,6 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
+ import os.path
+ import sys
+ import unittest
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py b/utils/ipc/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
+index aa609be7..f3c2c95f 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
+@@ -2,7 +2,7 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
++import importlib.util
+ import os
+ import sys
+ import unittest
+@@ -18,10 +18,7 @@ def _GetDirAbove(dirname):
+     if tail == dirname:
+       return path
+ 
+-
+-try:
+-  imp.find_module('mojom')
+-except ImportError:
++if importlib.util.find_spec("mojom") is None:
+   sys.path.append(os.path.join(_GetDirAbove('pylib'), 'pylib'))
+ import mojom.parse.ast as ast
+ import mojom.parse.conditional_features as conditional_features
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer.py b/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer.py
+index 3e084bbf..1e8b49f2 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer.py
+@@ -2,7 +2,6 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
+ import os.path
+ import sys
+ 
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py b/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
+index eadc6587..77976507 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
+@@ -2,7 +2,7 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
++import importlib.util
+ import os.path
+ import sys
+ import unittest
+@@ -22,9 +22,7 @@ def _GetDirAbove(dirname):
+ sys.path.insert(1, os.path.join(_GetDirAbove("mojo"), "third_party"))
+ from ply import lex
+ 
+-try:
+-  imp.find_module("mojom")
+-except ImportError:
++if importlib.util.find_spec("mojom") is None:
+   sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
+ import mojom.parse.lexer
+ 
+diff --git a/utils/ipc/mojo/public/tools/mojom/mojom/parse/parser_unittest.py b/utils/ipc/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
+index 6d6b7153..7e8acf43 100644
+--- a/utils/ipc/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
++++ b/utils/ipc/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
+@@ -2,7 +2,6 @@
+ # Use of this source code is governed by a BSD-style license that can be
+ # found in the LICENSE file.
+ 
+-import imp
+ import os.path
+ import sys
+ import unittest
+-- 
+2.43.0
+
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera_0.1.0.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera_0.1.0.bb
index 2a3c647..c8ccff6 100644
--- a/meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera_0.1.0.bb
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera_0.1.0.bb
@@ -10,6 +10,7 @@
 
 SRC_URI = " \
         git://git.libcamera.org/libcamera/libcamera.git;protocol=https;branch=master \
+        file://0001-mojom-Drop-using-imp-module.patch \
 "
 
 SRCREV = "960d0c1e19feaf310321c906e14bd5410c6be629"
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb
index b18ad6a..672c8ab 100644
--- a/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/packagegroups/packagegroup-meta-multimedia.bb
@@ -62,7 +62,7 @@
     gupnp-dlna \
     ${@bb.utils.contains("DISTRO_FEATURES", "x11", "gupnp-tools", "", d)} \
     libupnp \
-    ${@bb.utils.contains("DISTRO_FEATURES", "gobject-introspection-data", "rygel", "", d)} \
+    ${@bb.utils.contains("DISTRO_FEATURES", "x11", bb.utils.contains("DISTRO_FEATURES", "gobject-introspection-data", "rygel", "", d), "", d)} \
 "
 RDEPENDS:packagegroup-meta-multimedia-dvb = "\
     oscam \
diff --git a/meta-openembedded/meta-multimedia/recipes-multimedia/wireplumber/wireplumber_0.4.15.bb b/meta-openembedded/meta-multimedia/recipes-multimedia/wireplumber/wireplumber_0.4.17.bb
similarity index 98%
rename from meta-openembedded/meta-multimedia/recipes-multimedia/wireplumber/wireplumber_0.4.15.bb
rename to meta-openembedded/meta-multimedia/recipes-multimedia/wireplumber/wireplumber_0.4.17.bb
index 5a180d1..3959cd7 100644
--- a/meta-openembedded/meta-multimedia/recipes-multimedia/wireplumber/wireplumber_0.4.15.bb
+++ b/meta-openembedded/meta-multimedia/recipes-multimedia/wireplumber/wireplumber_0.4.17.bb
@@ -10,7 +10,7 @@
     ${@bb.utils.contains("DISTRO_FEATURES", "gobject-introspection-data", "python3-native python3-lxml-native doxygen-native", "", d)} \
 "
 
-SRCREV = "d67b48e595cb4612fd7fd47f97df6b8883ef7f60"
+SRCREV = "d3eb77b292655cef333a8f4cab4e861415bc37c2"
 SRC_URI = " \
     git://gitlab.freedesktop.org/pipewire/wireplumber.git;branch=master;protocol=https \
     file://90-OE-disable-session-dbus-dependent-features.lua \
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl/0001-conf-Unix.mk-remove-fixed-command-definitions.patch b/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl/0001-conf-Unix.mk-remove-fixed-command-definitions.patch
deleted file mode 100644
index 00be224..0000000
--- a/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl/0001-conf-Unix.mk-remove-fixed-command-definitions.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 4ba61c59d3488c263d106d486b656854a57ad79f Mon Sep 17 00:00:00 2001
-From: Jens Rehsack <sno@netbsd.org>
-Date: Thu, 13 Aug 2020 15:26:30 +0200
-Subject: [PATCH 1/2] conf/Unix.mk: remove fixed command definitions
-
-For cross compiling in Yocto or with appropriate SDKs, commands like
-`$CC` are reasonably predefined.
-
-Upstream-Status: Inappropriate
-
-Signed-off-by: Jens Rehsack <sno@netbsd.org>
----
- conf/Unix.mk | 10 +++-------
- 1 file changed, 3 insertions(+), 7 deletions(-)
-
-diff --git a/conf/Unix.mk b/conf/Unix.mk
-index 02f2b2b..05979fc 100644
---- a/conf/Unix.mk
-+++ b/conf/Unix.mk
-@@ -37,23 +37,19 @@ RM = rm -f
- MKDIR = mkdir -p
- 
- # C compiler and flags.
--CC = cc
--CFLAGS = -W -Wall -Os -fPIC
- CCOUT = -c -o 
- 
- # Static library building tool.
--AR = ar
- ARFLAGS = -rcs
- AROUT =
- 
- # DLL building tool.
--LDDLL = cc
-+LDDLL = $(CCLD)
- LDDLLFLAGS = -shared
- LDDLLOUT = -o 
- 
- # Static linker.
--LD = cc
--LDFLAGS = 
-+LD = $(CCLD)
- LDOUT = -o 
- 
- # C# compiler; we assume usage of Mono.
-@@ -63,7 +59,7 @@ RUNT0COMP = mono T0Comp.exe
- # Set the values to 'no' to disable building of the corresponding element
- # by default. Building can still be invoked with an explicit target call
- # (e.g. 'make dll' to force build the DLL).
--#STATICLIB = no
-+STATICLIB = no
- #DLL = no
- #TOOLS = no
- #TESTS = no
--- 
-2.17.1
-
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl/0001-make-Pass-LDFLAGS-when-building-shared-objects.patch b/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl/0001-make-Pass-LDFLAGS-when-building-shared-objects.patch
deleted file mode 100644
index 3b341e0..0000000
--- a/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl/0001-make-Pass-LDFLAGS-when-building-shared-objects.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 9515448761739d6186e7d07da5b47e368753528c Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Tue, 1 Sep 2020 11:34:33 -0700
-Subject: [PATCH] make: Pass LDFLAGS when building shared objects
-
-OE passes flags like hash-style via LDFLAGS which alters the linker
-defaults, its important to have LDFLAGS in link step even if compiler
-driver is used to do linking
-
-Upstream-Status: Pending
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- mk/Rules.mk | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/mk/Rules.mk b/mk/Rules.mk
-index b480bd6..db65125 100644
---- a/mk/Rules.mk
-+++ b/mk/Rules.mk
-@@ -344,7 +344,7 @@ $(BEARSSLLIB): $(OBJDIR) $(OBJ)
- 	$(AR) $(ARFLAGS) $(AROUT)$(BEARSSLLIB) $(OBJ)
- 
- $(BEARSSLDLL): $(OBJDIR) $(OBJ)
--	$(LDDLL) $(LDDLLFLAGS) $(LDDLLOUT)$(BEARSSLDLL) $(OBJ)
-+	$(LDDLL) $(LDDLLFLAGS) $(LDFLAGS) $(LDDLLOUT)$(BEARSSLDLL) $(OBJ)
- 
- $(BRSSL): $(BEARSSLLIB) $(OBJBRSSL)
- 	$(LD) $(LDFLAGS) $(LDOUT)$(BRSSL) $(OBJBRSSL) $(BEARSSLLIB)
--- 
-2.28.0
-
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl_0.6.bb b/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl_0.6.bb
index 777ba22..1e70a3d 100644
--- a/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl_0.6.bb
+++ b/meta-openembedded/meta-networking/recipes-connectivity/bearssl/bearssl_0.6.bb
@@ -24,24 +24,29 @@
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=1fc37e1037ae673975fbcb96a98f7191"
 
 PV .= "+git${SRCPV}"
-SRCREV = "79b1a9996c094ff593ae50bc4edc1f349f39dd6d"
+SRCREV = "79c060eea3eea1257797f15ea1608a9a9923aa6f"
 SRC_URI = "git://www.bearssl.org/git/BearSSL;protocol=https;branch=master \
-	   file://0001-conf-Unix.mk-remove-fixed-command-definitions.patch \
-	   file://0002-test-test_x509.c-fix-potential-overflow-issue.patch \
-           file://0001-make-Pass-LDFLAGS-when-building-shared-objects.patch \
-	   "
+           file://0002-test-test_x509.c-fix-potential-overflow-issue.patch \
+           "
 
+SONAME = "libbearssl.so.6"
 # without compile errors like 
 # <..>/ld: build/obj/ghash_pclmul.o: warning: relocation against `br_ghash_pclmul' in read-only section `.text'
 CFLAGS += "-fPIC"
 
+EXTRA_OEMAKE += 'CC="${CC}" CFLAGS="${CFLAGS}" LDDLL="${CCLD} ${LDFLAGS}" LD="${CCLD}" LDFLAGS="${LDFLAGS}" \
+                 BEARSSLDLL=build/${SONAME} \
+                 LDDLLFLAGS="-shared -Wl,-soname,${SONAME}" \
+                 ${@ "STATICLIB=no" if d.getVar('DISABLE_STATIC') != "" else "" } \
+'
+
 S = "${WORKDIR}/git"
-B = "${S}"
 
 do_install() {
-    mkdir -p ${D}/${bindir} ${D}/${libdir}
-    install -m 0644 ${B}/build/brssl ${D}/${bindir}
-    install -m 0644 ${B}/build/libbearssl.so ${D}/${libdir}/libbearssl.so.6.0.0
-    ln -s libbearssl.so.6.0.0 ${D}/${libdir}/libbearssl.so.6
-    ln -s libbearssl.so.6.0.0 ${D}/${libdir}/libbearssl.so
+	install -d ${D}/${bindir} ${D}/${libdir} ${D}/${includedir}
+	install -m 0755 ${B}/build/brssl ${D}/${bindir}
+	oe_libinstall -C ${B}/build libbearssl ${D}/${libdir}
+	for inc in ${S}/inc/*.h; do
+		install -m 0644 "${inc}" ${D}/${includedir}
+	done
 }
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/mbedtls/mbedtls_3.5.0.bb b/meta-openembedded/meta-networking/recipes-connectivity/mbedtls/mbedtls_3.5.1.bb
similarity index 90%
rename from meta-openembedded/meta-networking/recipes-connectivity/mbedtls/mbedtls_3.5.0.bb
rename to meta-openembedded/meta-networking/recipes-connectivity/mbedtls/mbedtls_3.5.1.bb
index 5f28422..6fc8248 100644
--- a/meta-openembedded/meta-networking/recipes-connectivity/mbedtls/mbedtls_3.5.0.bb
+++ b/meta-openembedded/meta-networking/recipes-connectivity/mbedtls/mbedtls_3.5.1.bb
@@ -17,16 +17,17 @@
 
 HOMEPAGE = "https://tls.mbed.org/"
 
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+LICENSE = "Apache-2.0 | GPL-2.0-or-later"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=379d5819937a6c2f1ef1630d341e026d"
 
 SECTION = "libs"
 
 S = "${WORKDIR}/git"
-SRCREV = "1ec69067fa1351427f904362c1221b31538c8b57"
-SRC_URI = "git://github.com/ARMmbed/mbedtls.git;protocol=https;branch=master \
+SRCREV = "edb8fec9882084344a314368ac7fd957a187519c"
+SRC_URI = "git://github.com/Mbed-TLS/mbedtls.git;protocol=https;branch=master \
 	file://0001-AES-NI-use-target-attributes-for-x86-32-bit-intrinsi.patch \
 	file://run-ptest"
+UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>\d+(\.\d+)+)"
 
 inherit cmake update-alternatives ptest
 
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.44.0.bb b/meta-openembedded/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.44.0.bb
index d213ef6..07a85b6 100644
--- a/meta-openembedded/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.44.0.bb
+++ b/meta-openembedded/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.44.0.bb
@@ -1,4 +1,15 @@
-SUMMARY = "NetworkManager"
+SUMMARY = "NetworkManager is a program for providing detection and \
+configuration for systems to automatically connect to networks."
+
+DESCRIPTION = "NetworkManager is a program for providing detection and \
+configuration for systems to automatically connect to networks. \
+NetworkManager's functionality can be useful for both wireless and wired \
+networks. For wireless networks, NetworkManager prefers known wireless \
+networks and has the ability to switch to the most reliable network. \
+NetworkManager-aware applications can switch from online and offline mode. \
+NetworkManager also prefers wired connections over wireless ones, has support \
+for modem connections and certain types of VPN."
+
 HOMEPAGE = "https://wiki.gnome.org/Projects/NetworkManager"
 SECTION = "net/misc"
 
@@ -16,7 +27,6 @@
     udev \
     util-linux \
     libndp \
-    libnewt \
     curl \
     dbus \
 "
@@ -88,7 +98,7 @@
 PACKAGECONFIG[bluez5] = "-Dbluez5_dun=true,-Dbluez5_dun=false,bluez5"
 # consolekit is not picked by shlibs, so add it to RDEPENDS too
 PACKAGECONFIG[consolekit] = "-Dsession_tracking_consolekit=true,-Dsession_tracking_consolekit=false,consolekit,consolekit"
-PACKAGECONFIG[modemmanager] = "-Dmodem_manager=true,-Dmodem_manager=false,modemmanager mobile-broadband-provider-info"
+PACKAGECONFIG[modemmanager] = "-Dmodem_manager=true,-Dmodem_manager=false,modemmanager mobile-broadband-provider-info,modemmanager mobile-broadband-provider-info"
 PACKAGECONFIG[ppp] = "-Dppp=true -Dpppd=${sbindir}/pppd,-Dppp=false,ppp"
 PACKAGECONFIG[dnsmasq] = "-Ddnsmasq=${bindir}/dnsmasq"
 PACKAGECONFIG[nss] = "-Dcrypto=nss,,nss"
@@ -100,6 +110,7 @@
 PACKAGECONFIG[ifupdown] = "-Difupdown=true,-Difupdown=false"
 PACKAGECONFIG[cloud-setup] = "-Dnm_cloud_setup=true,-Dnm_cloud_setup=false"
 PACKAGECONFIG[nmcli] = "-Dnmcli=true,-Dnmcli=false"
+PACKAGECONFIG[nmtui] = "-Dnmtui=true,-Dnmtui=false,libnewt"
 PACKAGECONFIG[readline] = "-Dreadline=libreadline,,readline"
 PACKAGECONFIG[libedit] = "-Dreadline=libedit,,libedit"
 PACKAGECONFIG[ovs] = "-Dovs=true,-Dovs=false,jansson"
@@ -109,6 +120,8 @@
 PACKAGECONFIG[dhcpcd] = "-Ddhcpcd=${base_sbindir}/dhcpcd,-Ddhcpcd=no,,dhcpcd"
 PACKAGECONFIG[dhclient] = "-Ddhclient=yes,-Ddhclient=no,,dhcp"
 PACKAGECONFIG[concheck] = "-Dconcheck=true,-Dconcheck=false"
+PACKAGECONFIG[adsl] = ",,"
+PACKAGECONFIG[wwan] = ",,"
 # The following PACKAGECONFIG is used to determine whether NM is managing /etc/resolv.conf itself or not
 PACKAGECONFIG[man-resolv-conf] = ",,"
 
diff --git a/meta-openembedded/meta-networking/recipes-connectivity/samba/samba_4.18.8.bb b/meta-openembedded/meta-networking/recipes-connectivity/samba/samba_4.18.9.bb
similarity index 98%
rename from meta-openembedded/meta-networking/recipes-connectivity/samba/samba_4.18.8.bb
rename to meta-openembedded/meta-networking/recipes-connectivity/samba/samba_4.18.9.bb
index f807426..73ceb7b 100644
--- a/meta-openembedded/meta-networking/recipes-connectivity/samba/samba_4.18.8.bb
+++ b/meta-openembedded/meta-networking/recipes-connectivity/samba/samba_4.18.9.bb
@@ -31,7 +31,7 @@
            file://samba-4.3.9-remove-getpwent_r.patch \
            "
 
-SRC_URI[sha256sum] = "4fb87bceaeb01d832a59046c197a044b7e8e8000581548b5d577a6cda03344d1"
+SRC_URI[sha256sum] = "f455c1d6351ed3a36fc2cb6e8ab1bfd0effe54a56686ffd495d64ab52d50f245"
 
 UPSTREAM_CHECK_REGEX = "samba\-(?P<pver>4\.18(\.\d+)+).tar.gz"
 
diff --git a/meta-openembedded/meta-networking/recipes-protocols/mdns/mdns_2200.40.37.0.1.bb b/meta-openembedded/meta-networking/recipes-protocols/mdns/mdns_2200.60.25.0.4.bb
similarity index 97%
rename from meta-openembedded/meta-networking/recipes-protocols/mdns/mdns_2200.40.37.0.1.bb
rename to meta-openembedded/meta-networking/recipes-protocols/mdns/mdns_2200.60.25.0.4.bb
index af2b337..a009ae0 100644
--- a/meta-openembedded/meta-networking/recipes-protocols/mdns/mdns_2200.40.37.0.1.bb
+++ b/meta-openembedded/meta-networking/recipes-protocols/mdns/mdns_2200.60.25.0.4.bb
@@ -1,6 +1,6 @@
 SUMMARY = "Publishes & browses available services on a link according to the Zeroconf / Bonjour protocol"
 DESCRIPTION = "Bonjour, also known as zero-configuration networking, enables automatic discovery of computers, devices, and services on IP networks."
-HOMEPAGE = "http://developer.apple.com/networking/bonjour/"
+HOMEPAGE = "https://developer.apple.com/bonjour/"
 LICENSE = "Apache-2.0 & BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=31c50371921e0fb731003bbc665f29bf"
 
@@ -25,7 +25,7 @@
            file://0015-Add-missing-limits.h.patch \
            file://0001-Handle-interface-without-ifa_addr.patch \
            "
-SRCREV = "a9f4049ab772ca57b5afc9804ae5004beb711d6e"
+SRCREV = "8acabead9ae56551011172d6835822a89c5298d6"
 
 # We install a stub Makefile in the top directory so that the various checks
 # in base.bbclass pass their tests for a Makefile, this ensures (that amongst
diff --git a/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.13.bb b/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.14.bb
similarity index 93%
rename from meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.13.bb
rename to meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.14.bb
index 663685a..02a5520 100644
--- a/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.13.bb
+++ b/meta-openembedded/meta-networking/recipes-support/ifenslave/ifenslave_2.14.bb
@@ -8,7 +8,7 @@
 inherit manpages
 MAN_PKG = "${PN}"
 
-SRCREV = "1bdfb472f2f8212056ed418d48387e8b36e61b34"
+SRCREV = "62e60904afbe58fda0c7104fdad1c4f618266ba6"
 SRC_URI = "git://salsa.debian.org/debian/ifenslave.git;protocol=https;branch=main"
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-Add-resolv_compat.h-for-musl-builds.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-Add-resolv_compat.h-for-musl-builds.patch
index 4a97c26..96270f8 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-Add-resolv_compat.h-for-musl-builds.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-Add-resolv_compat.h-for-musl-builds.patch
@@ -1,4 +1,4 @@
-From c1ee0b0a0a05379d0e6475dfceaaf41876192640 Mon Sep 17 00:00:00 2001
+From 148aadcc1b61da6f6b9ee4bcd35c38b7fbaeb8a8 Mon Sep 17 00:00:00 2001
 From: Trevor Gamblin <trevor.gamblin@windriver.com>
 Date: Wed, 14 Apr 2021 10:24:52 -0400
 Subject: [PATCH] Add resolv_compat.h for musl builds
@@ -17,7 +17,7 @@
  create mode 100644 open-vm-tools/lib/nicInfo/resolv_compat.h
 
 diff --git a/open-vm-tools/lib/nicInfo/nicInfoPosix.c b/open-vm-tools/lib/nicInfo/nicInfoPosix.c
-index c56b73cfe..8ae3b2f74 100644
+index 6f20547b2..f5064a9c0 100644
 --- a/open-vm-tools/lib/nicInfo/nicInfoPosix.c
 +++ b/open-vm-tools/lib/nicInfo/nicInfoPosix.c
 @@ -70,6 +70,10 @@
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-configure.ac-don-t-use-dnet-config.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-configure.ac-don-t-use-dnet-config.patch
index 3aa21e3..69c8253 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-configure.ac-don-t-use-dnet-config.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-configure.ac-don-t-use-dnet-config.patch
@@ -1,4 +1,4 @@
-From c953564b9f029b31381a2c630b47133ffe6a33e7 Mon Sep 17 00:00:00 2001
+From 547d05ca417c6b75ad06bf3119e1df8869742a70 Mon Sep 17 00:00:00 2001
 From: Martin Kelly <mkelly@xevo.com>
 Date: Fri, 7 Apr 2017 15:20:30 -0700
 Subject: [PATCH] configure.ac: don't use dnet-config
@@ -15,7 +15,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac
-index 3c058135a..124781f99 100644
+index 26bfdb682..9e2a1d6e3 100644
 --- a/open-vm-tools/configure.ac
 +++ b/open-vm-tools/configure.ac
 @@ -1227,7 +1227,7 @@ if test "$with_dnet" = "yes"; then
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0002-Use-configure-test-for-struct-timespec.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0002-Use-configure-test-for-struct-timespec.patch
index c6af3d5..1029252 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0002-Use-configure-test-for-struct-timespec.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0002-Use-configure-test-for-struct-timespec.patch
@@ -1,4 +1,4 @@
-From 6384b37cdef4ea868c3cee27bb627e4cfbab7b50 Mon Sep 17 00:00:00 2001
+From 74ab6b05fcba32031255624a31676e2aa0db133f Mon Sep 17 00:00:00 2001
 From: Natanael Copa <ncopa@alpinelinux.org>
 Date: Wed, 18 Nov 2015 09:03:00 +0000
 Subject: [PATCH] Use configure test for struct timespec
@@ -6,16 +6,16 @@
 Use the configure script to test for struct time spec instead of trying
 to keep track of what platforms has it.
 
-Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
----
 Upstream-Status: Pending
 
+Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
+---
  open-vm-tools/configure.ac           | 1 +
  open-vm-tools/lib/include/hgfsUtil.h | 8 +-------
  2 files changed, 2 insertions(+), 7 deletions(-)
 
 diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac
-index 124781f99..05f37f275 100644
+index 9e2a1d6e3..2f34f6eda 100644
 --- a/open-vm-tools/configure.ac
 +++ b/open-vm-tools/configure.ac
 @@ -1441,6 +1441,7 @@ AC_TYPE_OFF_T
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0003-Fix-definition-of-ALLPERMS-and-ACCESSPERMS.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0003-Fix-definition-of-ALLPERMS-and-ACCESSPERMS.patch
index 4b6e089..b4bd646 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0003-Fix-definition-of-ALLPERMS-and-ACCESSPERMS.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0003-Fix-definition-of-ALLPERMS-and-ACCESSPERMS.patch
@@ -1,4 +1,4 @@
-From 6be6cda5aea42b951212ec5f8a72778b1ef9c2da Mon Sep 17 00:00:00 2001
+From ef466581b53a1e64f53d4839bdacfab1d65cc6b9 Mon Sep 17 00:00:00 2001
 From: Natanael Copa <ncopa@alpinelinux.org>
 Date: Wed, 18 Nov 2015 09:10:14 +0000
 Subject: [PATCH] Fix definition of ALLPERMS and ACCESSPERMS
@@ -8,16 +8,16 @@
 
 This is needed for musl libc.
 
-Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
----
 Upstream-Status: Pending
 
+Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
+---
  open-vm-tools/lib/hgfsServer/hgfsServerLinux.c      | 8 +++++---
  open-vm-tools/services/plugins/dndcp/dnd/dndLinux.c | 3 +--
  2 files changed, 6 insertions(+), 5 deletions(-)
 
 diff --git a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
-index 63c4e65f0..87d419a7b 100644
+index 4a0bc9378..6ed49e2b7 100644
 --- a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
 +++ b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
 @@ -105,11 +105,13 @@ typedef struct DirectoryEntry {
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0004-Use-configure-to-test-for-feature-instead-of-platfor.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0004-Use-configure-to-test-for-feature-instead-of-platfor.patch
index 9fe0126..f23235e 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0004-Use-configure-to-test-for-feature-instead-of-platfor.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0004-Use-configure-to-test-for-feature-instead-of-platfor.patch
@@ -1,4 +1,4 @@
-From 9d22fba096cd77101fc45420c918ec748d2cc31b Mon Sep 17 00:00:00 2001
+From 4462efefdd61bff1e39e946b917b01433898be88 Mon Sep 17 00:00:00 2001
 From: Natanael Copa <ncopa@alpinelinux.org>
 Date: Wed, 18 Nov 2015 10:05:07 +0000
 Subject: [PATCH] Use configure to test for feature instead of platform
@@ -18,20 +18,20 @@
 
 This is needed for musl libc.
 
+Upstream-Status: Pending
+
 Refit patch of open-vm-tools/lib/nicInfo/nicInfoPosix.c
 
 Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
 Signed-off-by: Randy MacLeod <randy.macleod@windriver.com>
 ---
-Upstream-Status: Pending
-
  open-vm-tools/configure.ac               |  4 ++++
  open-vm-tools/lib/misc/idLinux.c         | 30 +++++++++++-------------
  open-vm-tools/lib/nicInfo/nicInfoPosix.c |  6 ++++-
  3 files changed, 23 insertions(+), 17 deletions(-)
 
 diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac
-index 05f37f275..9a0c63cf6 100644
+index 2f34f6eda..daa0939c3 100644
 --- a/open-vm-tools/configure.ac
 +++ b/open-vm-tools/configure.ac
 @@ -1169,6 +1169,7 @@ AC_CHECK_FUNCS(
@@ -57,7 +57,7 @@
  AC_CHECK_HEADERS([sys/io.h])
  AC_CHECK_HEADERS([sys/param.h]) # Required to make the sys/user.h check work correctly on FreeBSD
 diff --git a/open-vm-tools/lib/misc/idLinux.c b/open-vm-tools/lib/misc/idLinux.c
-index 1bb86f483..41c670cfc 100644
+index 3d7d1e303..0e12ac5bd 100644
 --- a/open-vm-tools/lib/misc/idLinux.c
 +++ b/open-vm-tools/lib/misc/idLinux.c
 @@ -27,12 +27,9 @@
@@ -74,7 +74,7 @@
  #ifdef __APPLE__
  #include <sys/socket.h>
  #include <TargetConditionals.h>
-@@ -1025,31 +1022,32 @@ Id_EndSuperUser(uid_t uid)  // IN:
+@@ -1025,24 +1022,23 @@ Id_EndSuperUser(uid_t uid)  // IN:
  static Bool
  IdIsSetUGid(void)
  {
@@ -108,10 +108,11 @@
 +#elif HAVE___SECURE_GETENV
     static const char envName[] = "VMW_SETUGID_TEST";
  
-    if (setenv(envName, "1", TRUE) == -1) {
-       return TRUE; /* Conservative */
+    /*
+@@ -1062,7 +1058,9 @@ IdIsSetUGid(void)
+       return secure_getenv(envName) == NULL;
     }
-    return __secure_getenv(envName) == NULL;
+    return TRUE;
 -#endif
 +#else
 +   /* Android does not have a secure_getenv, so be conservative. */
@@ -120,7 +121,7 @@
  }
  #endif
 diff --git a/open-vm-tools/lib/nicInfo/nicInfoPosix.c b/open-vm-tools/lib/nicInfo/nicInfoPosix.c
-index de57a4a90..c56b73cfe 100644
+index 0135e6a09..6f20547b2 100644
 --- a/open-vm-tools/lib/nicInfo/nicInfoPosix.c
 +++ b/open-vm-tools/lib/nicInfo/nicInfoPosix.c
 @@ -35,9 +35,13 @@
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0005-Use-configure-test-for-sys-stat.h-include.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0005-Use-configure-test-for-sys-stat.h-include.patch
index ec9aa7d..fda4c37 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0005-Use-configure-test-for-sys-stat.h-include.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0005-Use-configure-test-for-sys-stat.h-include.patch
@@ -1,19 +1,19 @@
-From 2bc09bc7d933bc3d91c687e1cc2befdaa38d2c86 Mon Sep 17 00:00:00 2001
+From 79675399124b61f4e3da1f64f4b265f83dd26cdc Mon Sep 17 00:00:00 2001
 From: Natanael Copa <ncopa@alpinelinux.org>
 Date: Wed, 18 Nov 2015 10:41:01 +0000
 Subject: [PATCH] Use configure test for sys/stat.h include
 
 This is needed for musl libc.
 
-Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
----
 Upstream-Status: Pending
 
+Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
+---
  open-vm-tools/services/plugins/vix/vixTools.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/open-vm-tools/services/plugins/vix/vixTools.c b/open-vm-tools/services/plugins/vix/vixTools.c
-index 34f3125d2..cebf4dd8d 100644
+index 75d24a29e..d11c42178 100644
 --- a/open-vm-tools/services/plugins/vix/vixTools.c
 +++ b/open-vm-tools/services/plugins/vix/vixTools.c
 @@ -66,7 +66,7 @@
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0006-Fix-subdir-objects-configure-error.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0006-Fix-subdir-objects-configure-error.patch
index e83fb36..4c6f6ce 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0006-Fix-subdir-objects-configure-error.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0006-Fix-subdir-objects-configure-error.patch
@@ -1,19 +1,19 @@
-From dbe0943011c24d48de3df5a95f4e4606be0ef250 Mon Sep 17 00:00:00 2001
+From 37ad9845b5b8ab7170a2aaba31a505b2a36ba0f8 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 13 Jun 2018 23:48:04 -0700
 Subject: [PATCH] Fix subdir objects configure error
 
 Fix build on musl while here
 
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
 Upstream-Status: Pending
 
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
  open-vm-tools/configure.ac | 3 +--
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac
-index 9a0c63cf6..5845490f6 100644
+index daa0939c3..497e9459a 100644
 --- a/open-vm-tools/configure.ac
 +++ b/open-vm-tools/configure.ac
 @@ -326,7 +326,6 @@ AC_ARG_ENABLE(
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0007-include-poll.h-instead-of-sys-poll.h.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0007-include-poll.h-instead-of-sys-poll.h.patch
index 7eac04a..fc0ce96 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0007-include-poll.h-instead-of-sys-poll.h.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0007-include-poll.h-instead-of-sys-poll.h.patch
@@ -1,19 +1,19 @@
-From 8c7f5895ed1f98bfc4101f8cfb93af3d13fd6bce Mon Sep 17 00:00:00 2001
+From d138b808a8b47a02a370b411149ef8ce7883ca6f Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 13 Jun 2018 23:02:50 -0700
 Subject: [PATCH] include poll.h instead of sys/poll.h
 
 including sys/poll.h is deprecated
 
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
 Upstream-Status: Pending
 
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
  open-vm-tools/lib/asyncsocket/asyncsocket.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/open-vm-tools/lib/asyncsocket/asyncsocket.c b/open-vm-tools/lib/asyncsocket/asyncsocket.c
-index 2bf97b549..b285c59c6 100644
+index 26aee553a..4f413db73 100644
 --- a/open-vm-tools/lib/asyncsocket/asyncsocket.c
 +++ b/open-vm-tools/lib/asyncsocket/asyncsocket.c
 @@ -70,8 +70,8 @@
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0008-Rename-poll.h-to-vm_poll.h.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0008-Rename-poll.h-to-vm_poll.h.patch
index d9000b4..2654767 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0008-Rename-poll.h-to-vm_poll.h.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0008-Rename-poll.h-to-vm_poll.h.patch
@@ -1,4 +1,4 @@
-From 0c695d910b3e136e116cdbe0bfc6231dfac255a1 Mon Sep 17 00:00:00 2001
+From e86d7b309bdf5b7c6c38faeded157e220d4ccc78 Mon Sep 17 00:00:00 2001
 From: Randy MacLeod <Randy.MacLeod@windriver.com>
 Date: Wed, 24 Mar 2021 16:21:35 -0400
 Subject: [PATCH] Rename poll.h to vm_poll.h
@@ -13,12 +13,12 @@
 
 Update for open-vm-tools-11.2.5.
 
+Upstream-Status: Pending
+
 Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 Signed-off-by: Randy MacLeod <Randy.MacLeod@windriver.com>
 ---
-Upstream-Status: Pending
-
  open-vm-tools/lib/asyncsocket/asyncsocket.c     | 2 +-
  open-vm-tools/lib/hgfsServer/hgfsServer.c       | 2 +-
  open-vm-tools/lib/include/asyncsocket.h         | 2 +-
@@ -29,7 +29,7 @@
  rename open-vm-tools/lib/include/{poll.h => vm_poll.h} (99%)
 
 diff --git a/open-vm-tools/lib/asyncsocket/asyncsocket.c b/open-vm-tools/lib/asyncsocket/asyncsocket.c
-index b285c59c6..5c528820d 100644
+index 4f413db73..684008d34 100644
 --- a/open-vm-tools/lib/asyncsocket/asyncsocket.c
 +++ b/open-vm-tools/lib/asyncsocket/asyncsocket.c
 @@ -87,7 +87,7 @@
@@ -42,7 +42,7 @@
  #include "err.h"
  #include "hostinfo.h"
 diff --git a/open-vm-tools/lib/hgfsServer/hgfsServer.c b/open-vm-tools/lib/hgfsServer/hgfsServer.c
-index 98f5b3f06..b436f0c7e 100644
+index c7b4cdd0f..d6e0cdc0e 100644
 --- a/open-vm-tools/lib/hgfsServer/hgfsServer.c
 +++ b/open-vm-tools/lib/hgfsServer/hgfsServer.c
 @@ -51,7 +51,7 @@
@@ -55,10 +55,10 @@
  #include "vm_basic_asm.h"
  #include "unicodeOperations.h"
 diff --git a/open-vm-tools/lib/include/asyncsocket.h b/open-vm-tools/lib/include/asyncsocket.h
-index dad848093..b61a2561f 100644
+index 09947002e..3800f5971 100644
 --- a/open-vm-tools/lib/include/asyncsocket.h
 +++ b/open-vm-tools/lib/include/asyncsocket.h
-@@ -171,7 +171,7 @@ typedef struct AsyncSocket AsyncSocket;
+@@ -177,7 +177,7 @@ typedef struct AsyncSocket AsyncSocket;
   * Or the client can specify its favorite poll class and locking behavior.
   * Use of IVmdbPoll is only supported for regular sockets and for Attach.
   */
@@ -97,7 +97,7 @@
  #endif
  #ifdef __ANDROID__
 diff --git a/open-vm-tools/lib/rpcIn/rpcin.c b/open-vm-tools/lib/rpcIn/rpcin.c
-index 8b1fe759d..f22fcd402 100644
+index f1709fe03..c1a5dfdba 100644
 --- a/open-vm-tools/lib/rpcIn/rpcin.c
 +++ b/open-vm-tools/lib/rpcIn/rpcin.c
 @@ -57,7 +57,7 @@
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0009-use-posix-strerror_r-unless-on-gnu-libc-system.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0009-use-posix-strerror_r-unless-on-gnu-libc-system.patch
index 9800194..a6638ad 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0009-use-posix-strerror_r-unless-on-gnu-libc-system.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0009-use-posix-strerror_r-unless-on-gnu-libc-system.patch
@@ -1,12 +1,12 @@
-From 921621a098f242953117747f5852d7e3136ae6c4 Mon Sep 17 00:00:00 2001
+From 666a043be7d6fe07a36599260f7214cbd29a79e7 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 13 Jun 2018 23:16:53 -0700
 Subject: [PATCH] use posix strerror_r unless on gnu libc system
 
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
 Upstream-Status: Pending
 
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
  open-vm-tools/lib/err/errPosix.c | 9 ++++++---
  1 file changed, 6 insertions(+), 3 deletions(-)
 
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0010-Use-uintmax_t-for-handling-rlim_t.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0010-Use-uintmax_t-for-handling-rlim_t.patch
index d3c9149..6d0f8a3 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0010-Use-uintmax_t-for-handling-rlim_t.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0010-Use-uintmax_t-for-handling-rlim_t.patch
@@ -1,4 +1,4 @@
-From b44d1d4e4ba77f1d9cf7de73a3bd210d02b5ff36 Mon Sep 17 00:00:00 2001
+From b294005f3748c6caee002fd7588964f7bf9b1d09 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 24 Mar 2021 17:26:53 -0400
 Subject: [PATCH] Use uintmax_t for handling rlim_t
@@ -7,22 +7,22 @@
 formats, therefore use uintmax_t to typecast rlim_t types
 and use %j to print it
 
+Upstream-Status: Pending
+
 Refit patch for open-vm-tools-11.2.5.
 
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 Signed-off-by: Randy MacLeod <Randy.MacLeod@windriver.com>
 Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com>
 ---
-Upstream-Status: Pending
-
  open-vm-tools/lib/hgfsServer/hgfsServerLinux.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
-index 87d419a7b..f5cc80b76 100644
+index 6ed49e2b7..0cc7c4094 100644
 --- a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
 +++ b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
-@@ -5301,8 +5301,8 @@ HgfsWriteCheckIORange(off_t offset,         // IN:
+@@ -5294,8 +5294,8 @@ HgfsWriteCheckIORange(off_t offset,         // IN:
        goto exit;
     }
  
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0011-Use-off64_t-instead-of-__off64_t.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0011-Use-off64_t-instead-of-__off64_t.patch
index 98eeceb..c6ab4d4 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0011-Use-off64_t-instead-of-__off64_t.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0011-Use-off64_t-instead-of-__off64_t.patch
@@ -1,4 +1,4 @@
-From 39a59ab7efe98c880c783b2ccf43e5a137d2b222 Mon Sep 17 00:00:00 2001
+From a8ef33b0623ba3494594a040ff5c77771168fdd6 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Mon, 27 Aug 2018 23:22:21 -0700
 Subject: [PATCH] Use off64_t instead of __off64_t
@@ -7,6 +7,7 @@
 unknown type name '__off64_t'
 
 Upstream-Status: Pending
+
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  open-vm-tools/lib/file/fileIOPosix.c | 4 ++--
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0012-hgfsServerLinux-Consider-64bit-time_t-possibility.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0012-hgfsServerLinux-Consider-64bit-time_t-possibility.patch
index c7e62da..388857f 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0012-hgfsServerLinux-Consider-64bit-time_t-possibility.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0012-hgfsServerLinux-Consider-64bit-time_t-possibility.patch
@@ -1,4 +1,4 @@
-From 859c21b9a21c53d936301b05044d0c649d6cf32b Mon Sep 17 00:00:00 2001
+From 2904454f3408a3abe3f2b0681504a66ea5ce713c Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Wed, 24 Mar 2021 17:36:26 -0400
 Subject: [PATCH] hgfsServerLinux: Consider 64bit time_t possibility
@@ -15,15 +15,15 @@
  1 file changed, 14 deletions(-)
 
 diff --git a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
-index f5cc80b76..5a79d6451 100644
+index 0cc7c4094..445a53881 100644
 --- a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
 +++ b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c
-@@ -2566,20 +2566,6 @@ HgfsStatToFileAttr(struct stat *stats,       // IN: stat information
+@@ -2559,20 +2559,6 @@ HgfsStatToFileAttr(struct stat *stats,       // IN: stat information
     LOG(4, "%s: done, permissions %o%o%o%o, size %"FMT64"u\n", __FUNCTION__,
         attr->specialPerms, attr->ownerPerms, attr->groupPerms,
         attr->otherPerms, attr->size);
 -#ifdef __FreeBSD__
--#   if !defined(VM_X86_64) && !defined(VM_ARM_64) && __FreeBSD_version >= 500043
+-#   if !defined(VM_X86_64) && !defined(VM_ARM_64)
 -#      define FMTTIMET ""
 -#   else
 -#      define FMTTIMET "l"
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0013-open-vm-tools-Correct-include-path-for-poll.h.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0013-open-vm-tools-Correct-include-path-for-poll.h.patch
index 8368746..f2f6893 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0013-open-vm-tools-Correct-include-path-for-poll.h.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0013-open-vm-tools-Correct-include-path-for-poll.h.patch
@@ -1,4 +1,4 @@
-From 7f7e00ce582d72013cb54278548d3320e032b0dc Mon Sep 17 00:00:00 2001
+From eae0a65a9d6c9df20d05b4208aee23656915480b Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Mon, 7 Feb 2022 13:32:32 -0800
 Subject: [PATCH] open-vm-tools: Correct include path for poll.h
@@ -13,13 +13,14 @@
 | 1 error generated.
 
 Upstream-Status: Pending
+
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  open-vm-tools/services/plugins/gdp/gdpPlugin.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/open-vm-tools/services/plugins/gdp/gdpPlugin.c b/open-vm-tools/services/plugins/gdp/gdpPlugin.c
-index 2bba2937e..025339595 100644
+index 96e6d717b..0b8a583b8 100644
 --- a/open-vm-tools/services/plugins/gdp/gdpPlugin.c
 +++ b/open-vm-tools/services/plugins/gdp/gdpPlugin.c
 @@ -32,7 +32,7 @@
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-timeSync-Portable-way-to-print-64bit-time_t.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0014-timeSync-Portable-way-to-print-64bit-time_t.patch
similarity index 96%
rename from meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-timeSync-Portable-way-to-print-64bit-time_t.patch
rename to meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0014-timeSync-Portable-way-to-print-64bit-time_t.patch
index 4a4fae1..39eea76 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0001-timeSync-Portable-way-to-print-64bit-time_t.patch
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/0014-timeSync-Portable-way-to-print-64bit-time_t.patch
@@ -1,4 +1,4 @@
-From dcb5d3e5d47b1e01fdcde575badc51825d4f4681 Mon Sep 17 00:00:00 2001
+From 09cc01b2fa15e319afafa13d7365b399a60f443c Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Tue, 3 Jan 2023 13:36:01 -0800
 Subject: [PATCH] timeSync: Portable way to print 64bit time_t
@@ -12,6 +12,7 @@
 |                    ^~~~~~~~~~
 
 Upstream-Status: Submitted [https://github.com/vmware/open-vm-tools/pull/631]
+
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 ---
  open-vm-tools/services/plugins/timeSync/pllLinux.c  | 8 ++++----
@@ -50,5 +51,5 @@
     return TRUE;
  }
 -- 
-2.39.0
+2.25.1
 
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/CVE-2023-20867.patch b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/CVE-2023-20867.patch
deleted file mode 100644
index 170dddf..0000000
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools/CVE-2023-20867.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-From 3028cdd4c0b2461b904cbe5a5868c8e591aa0941 Mon Sep 17 00:00:00 2001
-From: John Wolfe <jwolfe@vmware.com>
-Date: Mon, 8 May 2023 19:04:57 -0700
-Subject: [PATCH] Remove some dead code.
-
-Address CVE-2023-20867.
-Remove some authentication types which were deprecated long
-ago and are no longer in use. These are dead code.
-
-CVE: CVE-2023-20867
-
-Upstream-Status: Backport
-[https://github.com/vmware/open-vm-tools/blob/CVE-2023-20867.patch/2023-20867-Remove-some-dead-code.patch]
-
-Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
----
- open-vm-tools/services/plugins/vix/vixTools.c | 102 --------------------------
- 1 file changed, 102 deletions(-)
-
-diff --git a/open-vm-tools/services/plugins/vix/vixTools.c b/open-vm-tools/services/plugins/vix/vixTools.c
-index 9f376a7..85c5ba7 100644
---- a/open-vm-tools/services/plugins/vix/vixTools.c
-+++ b/open-vm-tools/services/plugins/vix/vixTools.c
-@@ -254,8 +254,6 @@ char *gImpersonatedUsername = NULL;
- #define  VIX_TOOLS_CONFIG_API_AUTHENTICATION          "Authentication"
- #define  VIX_TOOLS_CONFIG_AUTHTYPE_AGENTS             "InfrastructureAgents"
- 
--#define VIX_TOOLS_CONFIG_INFRA_AGENT_DISABLED_DEFAULT  TRUE
--
- /*
-  * The switch that controls all APIs
-  */
-@@ -730,9 +728,6 @@ VixError GuestAuthSAMLAuthenticateAndImpersonate(
- 
- void GuestAuthUnimpersonate();
- 
--static Bool VixToolsCheckIfAuthenticationTypeEnabled(GKeyFile *confDictRef,
--                                                     const char *typeName);
--
- #if SUPPORT_VGAUTH
- 
- VGAuthError TheVGAuthContext(VGAuthContext **ctx);
-@@ -8013,29 +8008,6 @@ VixToolsImpersonateUser(VixCommandRequestHeader *requestMsg,   // IN
-                                           userToken);
-       break;
-    }
--   case VIX_USER_CREDENTIAL_ROOT:
--   {
--      if ((requestMsg->requestFlags & VIX_REQUESTMSG_HAS_HASHED_SHARED_SECRET) &&
--          !VixToolsCheckIfAuthenticationTypeEnabled(gConfDictRef,
--                                            VIX_TOOLS_CONFIG_AUTHTYPE_AGENTS)) {
--          /*
--           * Don't accept hashed shared secret if disabled.
--           */
--          g_message("%s: Requested authentication type has been disabled.\n",
--                    __FUNCTION__);
--          err = VIX_E_GUEST_AUTHTYPE_DISABLED;
--          goto done;
--      }
--   }
--   // fall through
--
--   case VIX_USER_CREDENTIAL_CONSOLE_USER:
--      err = VixToolsImpersonateUserImplEx(NULL,
--                                          credentialType,
--                                          NULL,
--                                          loadUserProfile,
--                                          userToken);
--      break;
-    case VIX_USER_CREDENTIAL_NAME_PASSWORD:
-    case VIX_USER_CREDENTIAL_NAME_PASSWORD_OBFUSCATED:
-    case VIX_USER_CREDENTIAL_NAMED_INTERACTIVE_USER:
-@@ -8205,36 +8177,6 @@ VixToolsImpersonateUserImplEx(char const *credentialTypeStr,         // IN
-       }
- 
-       /*
--       * If the VMX asks to be root, then we allow them.
--       * The VMX will make sure that only it will pass this value in,
--       * and only when the VM and host are configured to allow this.
--       */
--      if ((VIX_USER_CREDENTIAL_ROOT == credentialType)
--            && (thisProcessRunsAsRoot)) {
--         *userToken = PROCESS_CREATOR_USER_TOKEN;
--
--         gImpersonatedUsername = Util_SafeStrdup("_ROOT_");
--         err = VIX_OK;
--         goto quit;
--      }
--
--      /*
--       * If the VMX asks to be root, then we allow them.
--       * The VMX will make sure that only it will pass this value in,
--       * and only when the VM and host are configured to allow this.
--       *
--       * XXX This has been deprecated XXX
--       */
--      if ((VIX_USER_CREDENTIAL_CONSOLE_USER == credentialType)
--            && ((allowConsoleUserOps) || !(thisProcessRunsAsRoot))) {
--         *userToken = PROCESS_CREATOR_USER_TOKEN;
--
--         gImpersonatedUsername = Util_SafeStrdup("_CONSOLE_USER_NAME_");
--         err = VIX_OK;
--         goto quit;
--      }
--
--      /*
-        * If the VMX asks us to run commands in the context of the current
-        * user, make sure that the user who requested the command is the
-        * same as the current user.
-@@ -10917,50 +10859,6 @@ VixToolsCheckIfVixCommandEnabled(int opcode,                          // IN
- /*
-  *-----------------------------------------------------------------------------
-  *
-- * VixToolsCheckIfAuthenticationTypeEnabled --
-- *
-- *    Checks to see if a given authentication type has been
-- *    disabled via the tools configuration.
-- *
-- * Return value:
-- *    TRUE if enabled, FALSE otherwise.
-- *
-- * Side effects:
-- *    None
-- *
-- *-----------------------------------------------------------------------------
-- */
--
--static Bool
--VixToolsCheckIfAuthenticationTypeEnabled(GKeyFile *confDictRef,     // IN
--                                         const char *typeName)      // IN
--{
--   char authnDisabledName[64]; // Authentication.<AuthenticationType>.disabled
--   gboolean disabled;
--
--   Str_Snprintf(authnDisabledName, sizeof(authnDisabledName),
--                VIX_TOOLS_CONFIG_API_AUTHENTICATION ".%s.disabled",
--                typeName);
--
--   ASSERT(confDictRef != NULL);
--
--   /*
--    * XXX Skip doing the strcmp() to verify the auth type since we only
--    * have the one typeName (VIX_TOOLS_CONFIG_AUTHTYPE_AGENTS), and default
--    * it to VIX_TOOLS_CONFIG_INFRA_AGENT_DISABLED_DEFAULT.
--    */
--   disabled = VMTools_ConfigGetBoolean(confDictRef,
--                                       VIX_TOOLS_CONFIG_API_GROUPNAME,
--                                       authnDisabledName,
--                                       VIX_TOOLS_CONFIG_INFRA_AGENT_DISABLED_DEFAULT);
--
--   return !disabled;
--}
--
--
--/*
-- *-----------------------------------------------------------------------------
-- *
-  * VixTools_ProcessVixCommand --
-  *
-  *
--- 
-2.6.2
-
diff --git a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools_12.1.5.bb b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools_12.3.5.bb
similarity index 94%
rename from meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools_12.1.5.bb
rename to meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools_12.3.5.bb
index 4873e9d..6696e55 100644
--- a/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools_12.1.5.bb
+++ b/meta-openembedded/meta-networking/recipes-support/open-vm-tools/open-vm-tools_12.3.5.bb
@@ -25,7 +25,7 @@
 LICENSE:modules/linux = "GPL-2.0-only"
 LICENSE:modules/solaris = "CDDL-1.0"
 
-SRC_URI = "git://github.com/vmware/open-vm-tools.git;protocol=https;branch=stable-12.1.x \
+SRC_URI = "git://github.com/vmware/open-vm-tools.git;protocol=https;branch=stable-12.3.x \
            file://tools.conf \
            file://vmtoolsd.service \
            file://vmtoolsd.init \
@@ -42,8 +42,7 @@
            file://0011-Use-off64_t-instead-of-__off64_t.patch;patchdir=.. \
            file://0012-hgfsServerLinux-Consider-64bit-time_t-possibility.patch;patchdir=.. \
            file://0013-open-vm-tools-Correct-include-path-for-poll.h.patch;patchdir=.. \
-           file://0001-timeSync-Portable-way-to-print-64bit-time_t.patch;patchdir=.. \
-           file://CVE-2023-20867.patch;patchdir=.. \
+           file://0014-timeSync-Portable-way-to-print-64bit-time_t.patch;patchdir=.. \
            "
 
 UPSTREAM_CHECK_GITTAGREGEX = "stable-(?P<pver>\d+(\.\d+)+)"
@@ -51,7 +50,7 @@
 SRC_URI:append:libc-musl = " file://0001-Add-resolv_compat.h-for-musl-builds.patch;patchdir=.. \
 "
 
-SRCREV = "30339ef6ded308f0147fe80f89b9bca3ace1aef9"
+SRCREV = "1b362b9eb449fb5de3809aaea4a636ece30ee5b7"
 
 S = "${WORKDIR}/git/open-vm-tools"
 
@@ -77,7 +76,7 @@
 # fuse gets implicitly detected; there is no --without-fuse option.
 PACKAGECONFIG[fuse] = ",,fuse"
 
-CFLAGS:append:toolchain-clang = " -Wno-address-of-packed-member"
+CFLAGS:append:toolchain-clang = " -Wno-address-of-packed-member -Wno-error=unused-function"
 FILES:${PN} += "\
     ${libdir}/open-vm-tools/plugins/vmsvc/lib*.so \
     ${libdir}/open-vm-tools/plugins/common/lib*.so \
diff --git a/meta-openembedded/meta-networking/recipes-support/pgpool2/pgpool2_4.4.1.bb b/meta-openembedded/meta-networking/recipes-support/pgpool2/pgpool2_4.4.1.bb
index efb563b..5e6e00c 100644
--- a/meta-openembedded/meta-networking/recipes-support/pgpool2/pgpool2_4.4.1.bb
+++ b/meta-openembedded/meta-networking/recipes-support/pgpool2/pgpool2_4.4.1.bb
@@ -20,7 +20,7 @@
 
 S = "${WORKDIR}/pgpool-II-${PV}"
 
-inherit autotools systemd
+inherit autotools-brokensep systemd
 
 SYSTEMD_SERVICE:${PN} = "pgpool.service"
 
@@ -34,7 +34,7 @@
 EXTRA_OECONF += "--disable-static \
 	         --disable-rpath \
 	        "
-B = "${S}"
+
 CFLAGS:append = " -fcommon "
 
 FILES:${PN} += "${datadir}/pgpool-II/ "
diff --git a/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.9.12.bb b/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.9.13.bb
similarity index 98%
rename from meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.9.12.bb
rename to meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.9.13.bb
index 87d12bc..4523187 100644
--- a/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.9.12.bb
+++ b/meta-openembedded/meta-networking/recipes-support/strongswan/strongswan_5.9.13.bb
@@ -11,7 +11,7 @@
 SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
           "
 
-SRC_URI[sha256sum] = "5e6018b07cbe9f72c044c129955a13be3e2f799ceb53f53a4459da6a922b95e5"
+SRC_URI[sha256sum] = "56e30effb578fd9426d8457e3b76c8c3728cd8a5589594b55649b2719308ba55"
 
 UPSTREAM_CHECK_REGEX = "strongswan-(?P<pver>\d+(\.\d+)+)\.tar"
 
diff --git a/meta-openembedded/meta-networking/recipes-support/uftp/uftp_5.0.2.bb b/meta-openembedded/meta-networking/recipes-support/uftp/uftp_5.0.3.bb
similarity index 84%
rename from meta-openembedded/meta-networking/recipes-support/uftp/uftp_5.0.2.bb
rename to meta-openembedded/meta-networking/recipes-support/uftp/uftp_5.0.3.bb
index ca2a8ce..6f0858c 100644
--- a/meta-openembedded/meta-networking/recipes-support/uftp/uftp_5.0.2.bb
+++ b/meta-openembedded/meta-networking/recipes-support/uftp/uftp_5.0.3.bb
@@ -7,7 +7,7 @@
 UPSTREAM_CHECK_URI = "https://sourceforge.net/projects/uftp-multicast/files/source-tar/"
 
 SRC_URI = "${SOURCEFORGE_MIRROR}/uftp-multicast/source-tar/uftp-${PV}.tar.gz"
-SRC_URI[sha256sum] = "57c12a6ae59942535fb5e620381aedeb17d50009ee71f236427ce237a46c0b14"
+SRC_URI[sha256sum] = "cb8668c19b1f10bc63a16ffa893e205dc3ec86361037d477d8003260ebc40080"
 
 DEPENDS = "openssl"
 
diff --git a/meta-openembedded/meta-oe/conf/layer.conf b/meta-openembedded/meta-oe/conf/layer.conf
index b0e48de..4c63f1b 100644
--- a/meta-openembedded/meta-oe/conf/layer.conf
+++ b/meta-openembedded/meta-oe/conf/layer.conf
@@ -112,4 +112,4 @@
 
 DEFAULT_TEST_SUITES:pn-meta-oe-ptest-image = " ${PTESTTESTSUITE}"
 
-NON_MULTILIB_RECIPES:append = " crash pahole"
+NON_MULTILIB_RECIPES:append = " crash pahole libbpf"
diff --git a/meta-openembedded/meta-oe/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-meta-oe.bbappend b/meta-openembedded/meta-oe/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-meta-oe.bbappend
index c3d4cbc..db18131 100644
--- a/meta-openembedded/meta-oe/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-meta-oe.bbappend
+++ b/meta-openembedded/meta-oe/dynamic-layers/meta-python/recipes-core/packagegroups/packagegroup-meta-oe.bbappend
@@ -14,7 +14,6 @@
 
 RDEPENDS:packagegroup-meta-oe-extended += "\
     lcdproc \
-    mozjs-102 \
 "
 RDEPENDS:packagegroup-meta-oe-support += "\
     nvmetcli \
diff --git a/meta-openembedded/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0002-android-tools-modifications-to-make-it-build-in-yoct.patch b/meta-openembedded/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0002-android-tools-modifications-to-make-it-build-in-yoct.patch
index e749366..b719ace 100644
--- a/meta-openembedded/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0002-android-tools-modifications-to-make-it-build-in-yoct.patch
+++ b/meta-openembedded/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0002-android-tools-modifications-to-make-it-build-in-yoct.patch
@@ -88,11 +88,12 @@
 index e3411d76..86e69874 100644
 --- a/debian/system/core/libbacktrace.mk
 +++ b/debian/system/core/libbacktrace.mk
-@@ -1,3 +1,4 @@
+@@ -1,4 +1,4 @@
+-include /usr/share/dpkg/architecture.mk
 +include rules_yocto.mk
- include /usr/share/dpkg/architecture.mk
  
  NAME = libbacktrace
+ 
 @@ -83,10 +84,9 @@ CPPFLAGS += \
  LDFLAGS += \
    -L/usr/lib/p7zip \
@@ -218,6 +219,12 @@
 index c37b1d2d..332492c1 100644
 --- a/debian/system/core/libutils.mk
 +++ b/debian/system/core/libutils.mk
+@@ -1,4 +1,4 @@
+-include /usr/share/dpkg/architecture.mk
++include rules_yocto.mk
+ 
+ NAME = libutils
+ 
 @@ -41,7 +41,7 @@ CPPFLAGS += \
  
  LDFLAGS += \
diff --git a/meta-openembedded/meta-oe/recipes-bsp/bolt/bolt_0.9.6.bb b/meta-openembedded/meta-oe/recipes-bsp/bolt/bolt_0.9.6.bb
index 860cb83..4688ae8 100644
--- a/meta-openembedded/meta-oe/recipes-bsp/bolt/bolt_0.9.6.bb
+++ b/meta-openembedded/meta-oe/recipes-bsp/bolt/bolt_0.9.6.bb
@@ -18,4 +18,5 @@
 
 FILES:${PN} += "${datadir}/dbus-1/* \
                 ${datadir}/polkit-1/* \
+                ${libdir}/systemd/* \
                "
diff --git a/meta-openembedded/meta-oe/recipes-bsp/i2cdev/i2cdev/fix-lsi2c-makefile.patch b/meta-openembedded/meta-oe/recipes-bsp/i2cdev/i2cdev/fix-lsi2c-makefile.patch
new file mode 100644
index 0000000..820d4bb
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-bsp/i2cdev/i2cdev/fix-lsi2c-makefile.patch
@@ -0,0 +1,28 @@
+From 57c09727220e00ab961325a2c85f5611bd1770d6 Mon Sep 17 00:00:00 2001
+Message-Id: <57c09727220e00ab961325a2c85f5611bd1770d6.1701984646.git.joerg.sommer@navimatix.de>
+From: =?UTF-8?q?J=C3=B6rg=20Sommer?= <joerg.sommer@navimatix.de>
+Date: Thu, 7 Dec 2023 22:29:40 +0100
+Subject: [PATCH] lsi2c/Makefile: Use builddir to refer to libi2cdev.a
+
+Signed-off-by: Jörg Sommer <joerg.sommer@navimatix.de>
+Upstream-Status: Submitted [https://github.com/costad2/i2cdev/pull/2/commits/43f15e97d869797dbfeaacafa13216aaaf353426]
+---
+ lsi2c/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lsi2c/Makefile.am b/lsi2c/Makefile.am
+index 6defc1f..0d81d01 100644
+--- a/lsi2c/Makefile.am
++++ b/lsi2c/Makefile.am
+@@ -14,7 +14,7 @@ bin_PROGRAMS=lsi2c
+ lsi2c_SOURCES = lsi2c.c
+ 
+ # Linker options for lsi2c
+-lsi2c_LDADD = $(top_srcdir)/libi2cdev/libi2cdev.a
++lsi2c_LDADD = $(top_builddir)/libi2cdev/libi2cdev.a
+ 
+ # Compiler options for lsi2c
+ lsi2c_CFLAGS = -I$(top_srcdir)/include -std=c99 -fPIC
+-- 
+2.34.1
+
diff --git a/meta-openembedded/meta-oe/recipes-bsp/i2cdev/i2cdev_git.bb b/meta-openembedded/meta-oe/recipes-bsp/i2cdev/i2cdev_git.bb
new file mode 100644
index 0000000..b1f8a7f
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-bsp/i2cdev/i2cdev_git.bb
@@ -0,0 +1,26 @@
+SUMMARY = "i2c dev tools for Linux"
+DESCRIPTION = "\
+    This package contains an I2C dev library and the i2c bus scanning \
+    utility lsi2c. \
+"
+AUTHOR = "Danielle Costantino"
+HOMEPAGE = "https://github.com/costad2/i2cdev"
+LICENSE = "GPL-2.0-or-later"
+LIC_FILES_CHKSUM = "\
+    file://COPYING;md5=768997ba510a952bef1775c50bc22b00 \
+    file://include/libi2cdev.h;beginline=12;endline=25;md5=72486a5e192d6ac5c7e55a4a95e380a6 \
+    file://libi2cdev/smbus.c;beginline=9;endline=22;md5=d9a0de5a611b960fa75912ded6c60096 \
+    file://lsi2c/lsi2c.c;beginline=11;endline=24;md5=72486a5e192d6ac5c7e55a4a95e380a6 \
+"
+
+PR = "git${SRCPV}"
+
+SRC_URI = "\
+    git://github.com/costad2/i2cdev.git;protocol=https;branch=master \
+    file://fix-lsi2c-makefile.patch \
+"
+SRCREV = "ed9ad777d842880e7ac6ca5e0de4bd2d3b4d02dc"
+
+S = "${WORKDIR}/git"
+
+inherit autotools
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/gensio/gensio_2.8.0.bb b/meta-openembedded/meta-oe/recipes-connectivity/gensio/gensio_2.8.2.bb
similarity index 94%
rename from meta-openembedded/meta-oe/recipes-connectivity/gensio/gensio_2.8.0.bb
rename to meta-openembedded/meta-oe/recipes-connectivity/gensio/gensio_2.8.2.bb
index 65fcf0a..fb9c5c7 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/gensio/gensio_2.8.0.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/gensio/gensio_2.8.2.bb
@@ -5,7 +5,7 @@
                     file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
                     "
 
-SRCREV = "2f959c4596d87461a84f6132ca596754ca0beeda"
+SRCREV = "f24f1d954cfb602c45c5b563b9fbe3418630fb59"
 
 SRC_URI = "git://github.com/cminyard/gensio;protocol=https;branch=master"
 
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/libmbim/libmbim_1.31.1.bb b/meta-openembedded/meta-oe/recipes-connectivity/libmbim/libmbim_1.31.2.bb
similarity index 93%
rename from meta-openembedded/meta-oe/recipes-connectivity/libmbim/libmbim_1.31.1.bb
rename to meta-openembedded/meta-oe/recipes-connectivity/libmbim/libmbim_1.31.2.bb
index 7001d3e..b7bb399 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/libmbim/libmbim_1.31.1.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/libmbim/libmbim_1.31.2.bb
@@ -11,7 +11,7 @@
 
 inherit meson pkgconfig bash-completion gobject-introspection
 
-SRCREV = "db0f5a09d4d29145620b81df0fdd8f4786a8fb59"
+SRCREV = "9c0309fcd3142411c921c14f7dd675cac086bab6"
 SRC_URI = "git://gitlab.freedesktop.org/mobile-broadband/libmbim.git;protocol=https;branch=main"
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/libqmi/libqmi_1.34.0.bb b/meta-openembedded/meta-oe/recipes-connectivity/libqmi/libqmi_1.35.1.bb
similarity index 91%
rename from meta-openembedded/meta-oe/recipes-connectivity/libqmi/libqmi_1.34.0.bb
rename to meta-openembedded/meta-oe/recipes-connectivity/libqmi/libqmi_1.35.1.bb
index 2cb843a..87d3546 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/libqmi/libqmi_1.34.0.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/libqmi/libqmi_1.35.1.bb
@@ -12,8 +12,8 @@
 
 inherit meson pkgconfig bash-completion gobject-introspection
 
-SRCREV = "3f07d6e5b4677558543b3b4484ea88ad92257e92"
-SRC_URI = "git://gitlab.freedesktop.org/mobile-broadband/libqmi.git;protocol=https;branch=qmi-1-34"
+SRCREV = "7bb160c70ecd4d8f47ae5c228a85c6a6cf4e4bdd"
+SRC_URI = "git://gitlab.freedesktop.org/mobile-broadband/libqmi.git;protocol=https;branch=main"
 
 S = "${WORKDIR}/git"
 
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/mosh/mosh_1.4.0.bb b/meta-openembedded/meta-oe/recipes-connectivity/mosh/mosh_1.4.0.bb
index 0ee050d..693ec12 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/mosh/mosh_1.4.0.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/mosh/mosh_1.4.0.bb
@@ -46,3 +46,5 @@
 #| {standard input}:2103: Error: instruction not supported in Thumb16 mode -- `adcs r7,r7,r7'
 #| {standard input}:2104: Error: selected processor does not support Thumb mode `it cs'
 ARM_INSTRUCTION_SET = "arm"
+
+CXXFLAGS:append = " -std=c++17"
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/paho-mqtt-cpp/paho-mqtt-cpp_1.3.1.bb b/meta-openembedded/meta-oe/recipes-connectivity/paho-mqtt-cpp/paho-mqtt-cpp_1.3.2.bb
similarity index 90%
rename from meta-openembedded/meta-oe/recipes-connectivity/paho-mqtt-cpp/paho-mqtt-cpp_1.3.1.bb
rename to meta-openembedded/meta-oe/recipes-connectivity/paho-mqtt-cpp/paho-mqtt-cpp_1.3.2.bb
index 1e1e923..1b2e51c 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/paho-mqtt-cpp/paho-mqtt-cpp_1.3.1.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/paho-mqtt-cpp/paho-mqtt-cpp_1.3.2.bb
@@ -10,10 +10,10 @@
     file://epl-v20;md5=d9fc0efef5228704e7f5b37f27192723 \
 "
 
-SRC_URI = "git://github.com/eclipse/paho.mqtt.cpp;protocol=https;branch=master \
+SRC_URI = "git://github.com/eclipse/paho.mqtt.cpp;protocol=https;branch=v1.3.x \
            file://0001-cmake-Use-CMAKE_INSTALL_LIBDIR-and-CMAKE_INSTALL_BIN.patch \
-"
-SRCREV = "4691652479bb4b398c7b81bde639482b164ae6d6"
+           "
+SRCREV = "5e0d1bf37b4826d680ec066ec42afd133851a681"
 
 DEPENDS = "openssl paho-mqtt-c"
 
diff --git a/meta-openembedded/meta-oe/recipes-core/dbus-cxx/dbus-cxx_2.4.0.bb b/meta-openembedded/meta-oe/recipes-core/dbus-cxx/dbus-cxx_2.5.0.bb
similarity index 91%
rename from meta-openembedded/meta-oe/recipes-core/dbus-cxx/dbus-cxx_2.4.0.bb
rename to meta-openembedded/meta-oe/recipes-core/dbus-cxx/dbus-cxx_2.5.0.bb
index 6294827..fa81472 100644
--- a/meta-openembedded/meta-oe/recipes-core/dbus-cxx/dbus-cxx_2.4.0.bb
+++ b/meta-openembedded/meta-oe/recipes-core/dbus-cxx/dbus-cxx_2.5.0.bb
@@ -6,7 +6,7 @@
 LIC_FILES_CHKSUM = "file://COPYING;md5=24594f493407a4cd401ce9794e0b9308"
 
 SRC_URI = "git://github.com/dbus-cxx/dbus-cxx.git;branch=master;protocol=https"
-SRCREV = "ebac3df5beeb4337f65968ae5b265927abb792af"
+SRCREV = "2c3b3a767a5898ea8e51159e8122ddbb3aaeeb94"
 
 DEPENDS = "\
 	dbus \
diff --git a/meta-openembedded/meta-oe/recipes-core/opencl/opencl-headers_2023.04.17.bb b/meta-openembedded/meta-oe/recipes-core/opencl/opencl-headers_2023.12.14.bb
similarity index 90%
rename from meta-openembedded/meta-oe/recipes-core/opencl/opencl-headers_2023.04.17.bb
rename to meta-openembedded/meta-oe/recipes-core/opencl/opencl-headers_2023.12.14.bb
index 6ffaf68..8b1c795 100644
--- a/meta-openembedded/meta-oe/recipes-core/opencl/opencl-headers_2023.04.17.bb
+++ b/meta-openembedded/meta-oe/recipes-core/opencl/opencl-headers_2023.12.14.bb
@@ -5,7 +5,7 @@
 SECTION = "base"
 
 S = "${WORKDIR}/git"
-SRCREV = "4fdcfb0ae675f2f63a9add9552e0af62c2b4ed30"
+SRCREV = "2368105c0531069fe927989505de7d125ec58c55"
 SRC_URI = "git://github.com/KhronosGroup/OpenCL-Headers.git;branch=main;protocol=https"
 
 do_configure[noexec] = "1"
diff --git a/meta-openembedded/meta-oe/recipes-core/opencl/opencl-icd-loader_2023.04.17.bb b/meta-openembedded/meta-oe/recipes-core/opencl/opencl-icd-loader_2023.12.14.bb
similarity index 96%
rename from meta-openembedded/meta-oe/recipes-core/opencl/opencl-icd-loader_2023.04.17.bb
rename to meta-openembedded/meta-oe/recipes-core/opencl/opencl-icd-loader_2023.12.14.bb
index 925053b..6bf01a2 100644
--- a/meta-openembedded/meta-oe/recipes-core/opencl/opencl-icd-loader_2023.04.17.bb
+++ b/meta-openembedded/meta-oe/recipes-core/opencl/opencl-icd-loader_2023.12.14.bb
@@ -13,7 +13,7 @@
 
 S = "${WORKDIR}/git"
 
-SRCREV = "b1bce7c3c580a8345205cf65fc1a5f55ba9cdb01"
+SRCREV = "229410f86a8c8c9e0f86f195409e5481a2bae067"
 SRC_URI = "git://github.com/KhronosGroup/OpenCL-ICD-Loader.git;branch=main;protocol=https"
 
 EXTRA_OECMAKE:append = " \
diff --git a/meta-openembedded/meta-oe/recipes-crypto/monocypher/monocypher_4.0.2.bb b/meta-openembedded/meta-oe/recipes-crypto/monocypher/monocypher_4.0.2.bb
index 8996381..e6380d9 100644
--- a/meta-openembedded/meta-oe/recipes-crypto/monocypher/monocypher_4.0.2.bb
+++ b/meta-openembedded/meta-oe/recipes-crypto/monocypher/monocypher_4.0.2.bb
@@ -11,8 +11,8 @@
 
 S = "${WORKDIR}/git"
 
-CFLAGS+="-pedantic -Wall -Wextra -O3"
-EXTRA_OEMAKE = "'PREFIX=${prefix}' 'DESTDIR=${D}' 'CFLAGS=${CFLAGS}'"
+CFLAGS += "-pedantic -Wall -Wextra -O3"
+EXTRA_OEMAKE = "'PREFIX=${prefix}' 'DESTDIR=${D}' 'CFLAGS=${CFLAGS}' 'LIBDIR=${libdir}'"
 
 do_compile() {
     oe_runmake library
diff --git a/meta-openembedded/meta-oe/recipes-crypto/pkcs11-helper/pkcs11-helper_1.29.0.bb b/meta-openembedded/meta-oe/recipes-crypto/pkcs11-helper/pkcs11-helper_1.30.0.bb
similarity index 95%
rename from meta-openembedded/meta-oe/recipes-crypto/pkcs11-helper/pkcs11-helper_1.29.0.bb
rename to meta-openembedded/meta-oe/recipes-crypto/pkcs11-helper/pkcs11-helper_1.30.0.bb
index d17ac1e..df6ca75 100644
--- a/meta-openembedded/meta-oe/recipes-crypto/pkcs11-helper/pkcs11-helper_1.29.0.bb
+++ b/meta-openembedded/meta-oe/recipes-crypto/pkcs11-helper/pkcs11-helper_1.30.0.bb
@@ -19,7 +19,7 @@
 
 S = "${WORKDIR}/git"
 # master
-SRCREV = "f23911037d9790a3f3a3447a78d31a6362358e21"
+SRCREV = "8bed16034f629a0361fa8ff89deed2b43dc45d8b"
 PV .= "+1.30.0+git${SRCPV}"
 
 UPSTREAM_CHECK_GITTAGREGEX = "pkcs11-helper-(?P<pver>\d+(\.\d+)+)"
diff --git a/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb-native_10.11.5.bb b/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb-native_10.11.6.bb
similarity index 100%
rename from meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb-native_10.11.5.bb
rename to meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb-native_10.11.6.bb
diff --git a/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb.inc b/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb.inc
index d64d5b0..7e6ef42 100644
--- a/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb.inc
+++ b/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb.inc
@@ -23,10 +23,9 @@
            file://0001-sql-CMakeLists.txt-fix-gen_lex_hash-not-found.patch \
            file://lfs64.patch \
            file://0001-Add-missing-includes-cstdint-and-cstdio.patch \
-           file://libfmt_make_fmt.patch \
           "
 SRC_URI:append:libc-musl = " file://ppc-remove-glibc-dep.patch"
-SRC_URI[sha256sum] = "4c9484048d4d0c71dd076ab33fc2a9ce8510bdf762886de0d63fe52496f3dbbb"
+SRC_URI[sha256sum] = "1c0163463e98d71f4780741611a40981eee2bc44d392601ca49bbf948d04dd67"
 
 UPSTREAM_CHECK_URI = "https://github.com/MariaDB/server/releases"
 
diff --git a/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb/libfmt_make_fmt.patch b/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb/libfmt_make_fmt.patch
deleted file mode 100644
index 4d5f4a6..0000000
--- a/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb/libfmt_make_fmt.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-Make make_arg work with libfmt 10.1+
-
-This ensures that compiler can find the correct template to use
-Fixes
-
-mariadb-10.11.5/sql/item_strfunc.cc:1429:22: error: no matching functi
-on for call to 'make_arg'
-|  1429 |       vargs[carg-1]= fmt::detail::make_arg<ctx>(args[carg]->val_int());
-|       |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~
-| /mnt/b/yoe/master/build/tmp/work/cortexa72-cortexa53-crypto-yoe-linux/mariadb/10.11.5/recipe-sysroot/usr/include/fmt/core.h:1588:20: note: candidate functio
-n [with Context = fmt::basic_format_context<fmt::appender, char>, T = long long] not viable: expects an lvalue for 1st argument
-|  1588 | FMT_CONSTEXPR auto make_arg(T& val) -> basic_format_arg<Context> {
-|       |                    ^        ~~~~~~
-| /mnt/b/yoe/master/build/tmp/work/cortexa72-cortexa53-crypto-yoe-linux/mariadb/10.11.5/recipe-sysroot/usr/include/fmt/core.h:1559:31: note: candidate templat
-e ignored: invalid explicitly-specified argument for template parameter 'PACKED'
-|  1559 | FMT_CONSTEXPR FMT_INLINE auto make_arg(T& [ 46%] Building C object mysys/CMakeFiles/mysys.dir/my_likely.c.o
-| val) -> value<Context> {
-|       |                               ^
-| /mnt/b/yoe/master/build/tmp/work/cortexa72-cortexa53-crypto-yoe-linux/mariadb/10.11.5/recipe-sysroot/usr/include/fmt/core.h:1596:27: note: candidate templat
-e ignored: invalid explicitly-specified argument for template parameter 'PACKED'
-|  1596 | FMT_CONSTEXPR inline auto make_arg(T& val) -> basic_format_arg<Context> {
-|       |                           ^
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-
---- a/cmake/libfmt.cmake
-+++ b/cmake/libfmt.cmake
-@@ -33,8 +33,9 @@ MACRO (CHECK_LIBFMT)
-      #include <fmt/format-inl.h>
-      #include <iostream>
-      int main() {
-+       int val = 42;
-        fmt::format_args::format_arg arg=
--         fmt::detail::make_arg<fmt::format_context>(42);
-+         fmt::detail::make_arg<fmt::format_context>(val);
-          std::cout << fmt::vformat(\"The answer is {}.\",
-                                    fmt::format_args(&arg, 1));
-      }" HAVE_SYSTEM_LIBFMT)
---- a/sql/item_strfunc.cc
-+++ b/sql/item_strfunc.cc
-@@ -1426,14 +1426,22 @@ String *Item_func_sformat::val_str(Strin
-     switch (args[carg]->result_type())
-     {
-     case INT_RESULT:
--      vargs[carg-1]= fmt::detail::make_arg<ctx>(args[carg]->val_int());
-+      int intval;
-+      intval = args[carg]->val_int();
-+      vargs[carg-1]= fmt::detail::make_arg<ctx>(intval);
-       break;
-     case DECIMAL_RESULT: // TODO
-     case REAL_RESULT:
-+      float fval;
-+      int val;
-       if (args[carg]->field_type() == MYSQL_TYPE_FLOAT)
--        vargs[carg-1]= fmt::detail::make_arg<ctx>((float)args[carg]->val_real());
--      else
--        vargs[carg-1]= fmt::detail::make_arg<ctx>(args[carg]->val_real());
-+      {
-+        fval = (float)args[carg]->val_real();
-+        vargs[carg-1]= fmt::detail::make_arg<ctx>(fval);
-+      } else {
-+        val = args[carg]->val_real();
-+        vargs[carg-1]= fmt::detail::make_arg<ctx>(val);
-+      }
-       break;
-     case STRING_RESULT:
-       if (!(parg= args[carg]->val_str(&val_arg[carg-1])))
diff --git a/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb_10.11.5.bb b/meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb_10.11.6.bb
similarity index 100%
rename from meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb_10.11.5.bb
rename to meta-openembedded/meta-oe/recipes-dbs/mysql/mariadb_10.11.6.bb
diff --git a/meta-openembedded/meta-oe/recipes-dbs/postgresql/files/0001-configure.ac-bypass-autoconf-2.69-version-check.patch b/meta-openembedded/meta-oe/recipes-dbs/postgresql/files/0001-configure.ac-bypass-autoconf-2.69-version-check.patch
index fb70b22..ab57805 100644
--- a/meta-openembedded/meta-oe/recipes-dbs/postgresql/files/0001-configure.ac-bypass-autoconf-2.69-version-check.patch
+++ b/meta-openembedded/meta-oe/recipes-dbs/postgresql/files/0001-configure.ac-bypass-autoconf-2.69-version-check.patch
@@ -1,4 +1,4 @@
-From 5f9dedc91a0a9710033fa155ea759f765ce5b58b Mon Sep 17 00:00:00 2001
+From d44c83ed0f30462a31930d6d925762b3f8412ce2 Mon Sep 17 00:00:00 2001
 From: Yi Fan Yu <yifan.yu@windriver.com>
 Date: Fri, 5 Feb 2021 17:15:42 -0500
 Subject: [PATCH] configure.ac: bypass autoconf 2.69 version check
@@ -13,12 +13,12 @@
  1 file changed, 4 deletions(-)
 
 diff --git a/configure.ac b/configure.ac
-index 524fdf1..3bea642 100644
+index e988503..d1b2cfd 100644
 --- a/configure.ac
 +++ b/configure.ac
 @@ -19,10 +19,6 @@ m4_pattern_forbid(^PGAC_)dnl to catch undefined macros
  
- AC_INIT([PostgreSQL], [15.4], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/])
+ AC_INIT([PostgreSQL], [15.5], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/])
  
 -m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.69], [], [m4_fatal([Autoconf version 2.69 is required.
 -Untested combinations of 'autoconf' and PostgreSQL versions are not
@@ -28,5 +28,5 @@
  AC_CONFIG_SRCDIR([src/backend/access/common/heaptuple.c])
  AC_CONFIG_AUX_DIR(config)
 -- 
-2.34.1
+2.25.1
 
diff --git a/meta-openembedded/meta-oe/recipes-dbs/postgresql/postgresql_15.4.bb b/meta-openembedded/meta-oe/recipes-dbs/postgresql/postgresql_15.5.bb
similarity index 86%
rename from meta-openembedded/meta-oe/recipes-dbs/postgresql/postgresql_15.4.bb
rename to meta-openembedded/meta-oe/recipes-dbs/postgresql/postgresql_15.5.bb
index 3aa2662..cb90ff9 100644
--- a/meta-openembedded/meta-oe/recipes-dbs/postgresql/postgresql_15.4.bb
+++ b/meta-openembedded/meta-oe/recipes-dbs/postgresql/postgresql_15.5.bb
@@ -11,6 +11,6 @@
    file://0001-postgresql-fix-ptest-failure-of-sysviews.patch \
 "
 
-SRC_URI[sha256sum] = "baec5a4bdc4437336653b6cb5d9ed89be5bd5c0c58b94e0becee0a999e63c8f9"
+SRC_URI[sha256sum] = "8f53aa95d78eb8e82536ea46b68187793b42bba3b4f65aa342f540b23c9b10a6"
 
 CVE_STATUS[CVE-2017-8806] = "not-applicable-config: Ddoesn't apply to out configuration of postgresql so we can safely ignore it."
diff --git a/meta-openembedded/meta-oe/recipes-devtools/abseil-cpp/abseil-cpp_git.bb b/meta-openembedded/meta-oe/recipes-devtools/abseil-cpp/abseil-cpp_git.bb
index 65ecab7..ee62d4b 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/abseil-cpp/abseil-cpp_git.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/abseil-cpp/abseil-cpp_git.bb
@@ -27,7 +27,6 @@
 
 EXTRA_OECMAKE = "-DBUILD_SHARED_LIBS=ON \
                  -DBUILD_TESTING=OFF    \
-                 -DCMAKE_CXX_STANDARD=14 \
                  -DABSL_ENABLE_INSTALL=ON \
                 "
 
diff --git a/meta-openembedded/meta-oe/recipes-devtools/cjson/cjson_1.7.16.bb b/meta-openembedded/meta-oe/recipes-devtools/cjson/cjson_1.7.17.bb
similarity index 96%
rename from meta-openembedded/meta-oe/recipes-devtools/cjson/cjson_1.7.16.bb
rename to meta-openembedded/meta-oe/recipes-devtools/cjson/cjson_1.7.17.bb
index f8e0bbf..6c8934b 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/cjson/cjson_1.7.16.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/cjson/cjson_1.7.17.bb
@@ -7,7 +7,7 @@
 SRC_URI = "git://github.com/DaveGamble/cJSON.git;branch=master;protocol=https \
            file://run-ptest \
          "
-SRCREV = "cb8693b058ba302f4829ec6d03f609ac6f848546"
+SRCREV = "87d8f0961a01bf09bef98ff89bae9fdec42181ee"
 
 S = "${WORKDIR}/git"
 
diff --git a/meta-openembedded/meta-oe/recipes-devtools/ctags/ctags_6.0.20231126.0.bb b/meta-openembedded/meta-oe/recipes-devtools/ctags/ctags_6.0.20231224.0.bb
similarity index 95%
rename from meta-openembedded/meta-oe/recipes-devtools/ctags/ctags_6.0.20231126.0.bb
rename to meta-openembedded/meta-oe/recipes-devtools/ctags/ctags_6.0.20231224.0.bb
index 44a7f68..9c4e819 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/ctags/ctags_6.0.20231126.0.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/ctags/ctags_6.0.20231224.0.bb
@@ -14,7 +14,7 @@
 
 inherit autotools-brokensep pkgconfig manpages
 
-SRCREV = "c480d71e19ad842a1217e9e84e6e4afca124b95e"
+SRCREV = "bea6f5bc96d9a5d11da36d23ee50d952d8bf3a8d"
 SRC_URI = "git://github.com/universal-ctags/ctags;branch=master;protocol=https"
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/jq/jq_1.7.bb b/meta-openembedded/meta-oe/recipes-devtools/jq/jq_1.7.1.bb
similarity index 95%
rename from meta-openembedded/meta-oe/recipes-devtools/jq/jq_1.7.bb
rename to meta-openembedded/meta-oe/recipes-devtools/jq/jq_1.7.1.bb
index 5c2e3aa..6b12335 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/jq/jq_1.7.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/jq/jq_1.7.1.bb
@@ -12,7 +12,7 @@
 SRC_URI = "${GITHUB_BASE_URI}/download/${BPN}-${PV}/${BPN}-${PV}.tar.gz \
     file://run-ptest \
     "
-SRC_URI[sha256sum] = "402a0d6975d946e6f4e484d1a84320414a0ff8eb6cf49d2c11d144d4d344db62"
+SRC_URI[sha256sum] = "478c9ca129fd2e3443fe27314b455e211e0d8c60bc8ff7df703873deeee580c2"
 
 inherit autotools github-releases ptest
 
diff --git a/meta-openembedded/meta-oe/recipes-devtools/lemon/files/lemon.1 b/meta-openembedded/meta-oe/recipes-devtools/lemon/files/lemon.1
deleted file mode 100644
index 914ee07..0000000
--- a/meta-openembedded/meta-oe/recipes-devtools/lemon/files/lemon.1
+++ /dev/null
@@ -1,63 +0,0 @@
-.Dd 2002-10-04
-.Dt LEMON 1
-.Os "Debian GNU/Linux"
-.\" Manual page created by Guus Sliepen <guus@debian.org>
-.Sh NAME
-.Nm lemon
-.Nd The Lemon Parser Generator
-.Sh SYNOPSIS
-.Nm
-.Op Fl bcgmqsx
-.Ar input
-.Sh DESCRIPTION
-.Nm
-is an LALR(1) parser generator for C or C++.
-It does the same job as bison and yacc.
-But 
-.Nm
-is not another bison or yacc clone.
-It uses a different grammar syntax which is designed to reduce the number of coding errors.
-.Nm
-also uses a more sophisticated parsing engine that is faster than yacc and bison
-and which is both reentrant and thread-safe.
-Furthermore, 
-.Nm
-implements features that can be used to eliminate resource leaks,
-making is suitable for use in long-running programs such as graphical user interfaces or embedded controllers.
-.Pp
-.Nm
-will read the grammer from
-.Ar input
-and write out a parser for that grammar in the C language.
-.Sh OPTIONS
-.Bl -tag -width indent
-.It Fl b
-Print only the basis in report.
-.It Fl c
-Don't compress the action table.
-.It Fl g
-Print grammar without actions.
-.It Fl m
-Output a makeheaders compatible file.
-.It Fl q
-(Quiet) Don't print the report file.
-.It Fl s
-Print parser stats to standard output.
-.It Fl x
-Print the version number.
-.El
-.Sh FILES
-.Bl -tag -width indent
-.It Pa /usr/share/lemon/lempar.c
-Driver template for the
-.Nm
-parser generator.
-.El
-.Sh AUTHOR
-.Nm
-has been written by
-.An D. Richard Hipp Aq drh@hwaci.com .
-.Pp
-This manual page was written by
-.An Guus Sliepen Aq guus@debian.org
-for the Debian GNU/Linux system.
diff --git a/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon.inc b/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon.inc
deleted file mode 100644
index 57b9fb7..0000000
--- a/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-DESCRIPTION = "The Lemon Parser Generator"
-HOMEPAGE = "http://www.hwaci.com/sw/lemon/"
-LICENSE = "PD"
-SECTION = "devel"
-
-SRC_URI = "http://www.sqlite.org/sqlite-${PV}.tar.gz \
-           file://lemon.1"
-
-S = "${WORKDIR}/sqlite-${PV}/tool"
-
-do_compile() {
-    ${CC} ${CFLAGS} lemon.c -c -o lemon.o
-    ${CCLD} ${LDFLAGS} lemon.o -o lemon
-}
-
-do_install() {
-    install -d ${D}${bindir}
-    install -m 0755 lemon ${D}${bindir}
-    install -m 0644 lempar.c ${D}${bindir}
-    install -d ${D}${mandir}/man1
-    install -m 0644 ${WORKDIR}/lemon.1 ${D}${mandir}/man1/
-}
-
-BBCLASSEXTEND = "native"
-
diff --git a/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon_3.44.2.bb b/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon_3.44.2.bb
new file mode 100644
index 0000000..2904a45
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon_3.44.2.bb
@@ -0,0 +1,24 @@
+DESCRIPTION = "The Lemon Parser Generator"
+HOMEPAGE = "https://sqlite.org/src/file/doc/lemon.html"
+LICENSE = "PD"
+SECTION = "devel"
+
+LIC_FILES_CHKSUM = "file://tool/lemon.c;endline=8;md5=c7551a78fa3fdecd96d1ad6761d205ee"
+
+SRC_URI = "git://github.com/sqlite/sqlite;protocol=https;branch=branch-3.44"
+
+SRCREV = "c8f9803dc32bfee78a9ca2b1abbe39499729219b"
+
+S = "${WORKDIR}/git"
+
+do_compile() {
+    ${CC} ${CFLAGS} ${LDFLAGS} tool/lemon.c -o lemon
+}
+
+do_install() {
+    install -d ${D}${bindir}
+    install -m 0755 lemon ${D}${bindir}
+    install -m 0644 tool/lempar.c ${D}${bindir}
+}
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon_3.7.3.bb b/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon_3.7.3.bb
deleted file mode 100644
index 354db17..0000000
--- a/meta-openembedded/meta-oe/recipes-devtools/lemon/lemon_3.7.3.bb
+++ /dev/null
@@ -1,7 +0,0 @@
-require lemon.inc
-
-LIC_FILES_CHKSUM = "file://lemon.c;endline=8;md5=c7551a78fa3fdecd96d1ad6761d205ee"
-
-SRC_URI[md5sum] = "5437978aae90350cf984993091e0d695"
-SRC_URI[sha256sum] = "dbf352e8fbb74829f5e7a88f9f6ceeb80a709537f668c36e4b6cdfb271309ef6"
-
diff --git a/meta-openembedded/meta-oe/recipes-devtools/libsombok3/libsombok3_2.4.0.bb b/meta-openembedded/meta-oe/recipes-devtools/libsombok3/libsombok3_2.4.0.bb
index 2a1234c..9b18269 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/libsombok3/libsombok3_2.4.0.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/libsombok3/libsombok3_2.4.0.bb
@@ -11,13 +11,12 @@
            file://0001-configure.ac-fix-cross-compiling-issue.patch \
           "
 
-inherit autotools pkgconfig
+inherit autotools-brokensep pkgconfig
 
 # sombok-2.4.0
 SRCREV = "0098d85a037ef5c99a648a3669a077781a45e8cc"
 
 S = "${WORKDIR}/git"
-B = "${S}"
 
 # Disable libthai support
 EXTRA_OECONF = "--disable-libthai"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs/0001-build-fix-build-with-Python-3.12.patch b/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs/0001-build-fix-build-with-Python-3.12.patch
new file mode 100644
index 0000000..39026d0
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs/0001-build-fix-build-with-Python-3.12.patch
@@ -0,0 +1,55 @@
+From 656f6c91f1da7f1e1ffb01e2de7d9026a84958b5 Mon Sep 17 00:00:00 2001
+From: Luigi Pinca <luigipinca@gmail.com>
+Date: Wed, 8 Nov 2023 21:20:53 +0100
+Subject: [PATCH] build: fix build with Python 3.12
+
+Replace `distutils.version.StrictVersion` with
+`packaging.version.Version`.
+
+Refs: https://github.com/nodejs/node/pull/50209#issuecomment-1795852539
+PR-URL: https://github.com/nodejs/node/pull/50582
+Reviewed-By: Richard Lau <rlau@redhat.com>
+Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
+
+Upstream-Status: Backport [https://github.com/nodejs/node/commit/95534ad82f4e33f53fd50efe633d43f8da70cba6]
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ configure.py | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+diff --git a/configure.py b/configure.py
+index 62f041ce..18fe7c14 100755
+--- a/configure.py
++++ b/configure.py
+@@ -14,8 +14,6 @@ import bz2
+ import io
+ from pathlib import Path
+ 
+-from distutils.version import StrictVersion
+-
+ # If not run from node/, cd to node/.
+ os.chdir(Path(__file__).parent)
+ 
+@@ -30,6 +28,7 @@ tools_path = Path('tools')
+ 
+ sys.path.insert(0, str(tools_path / 'gyp' / 'pylib'))
+ from gyp.common import GetFlavor
++from packaging.version import Version
+ 
+ # imports in tools/configure.d
+ sys.path.insert(0, str(tools_path / 'configure.d'))
+@@ -1565,10 +1564,10 @@ def configure_openssl(o):
+     # supported asm compiler for AVX2. See https://github.com/openssl/openssl/
+     # blob/OpenSSL_1_1_0-stable/crypto/modes/asm/aesni-gcm-x86_64.pl#L52-L69
+     openssl110_asm_supported = \
+-      ('gas_version' in variables and StrictVersion(variables['gas_version']) >= StrictVersion('2.23')) or \
+-      ('xcode_version' in variables and StrictVersion(variables['xcode_version']) >= StrictVersion('5.0')) or \
+-      ('llvm_version' in variables and StrictVersion(variables['llvm_version']) >= StrictVersion('3.3')) or \
+-      ('nasm_version' in variables and StrictVersion(variables['nasm_version']) >= StrictVersion('2.10'))
++      ('gas_version' in variables and Version(variables['gas_version']) >= Version('2.23')) or \
++      ('xcode_version' in variables and Version(variables['xcode_version']) >= Version('5.0')) or \
++      ('llvm_version' in variables and Version(variables['llvm_version']) >= Version('3.3')) or \
++      ('nasm_version' in variables and Version(variables['nasm_version']) >= Version('2.10'))
+ 
+     if is_x86 and not openssl110_asm_supported:
+       error('''Did not find a new enough assembler, install one or build with
diff --git a/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs/0001-gyp-resolve-python-3.12-issues.patch b/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs/0001-gyp-resolve-python-3.12-issues.patch
new file mode 100644
index 0000000..9d878df
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs/0001-gyp-resolve-python-3.12-issues.patch
@@ -0,0 +1,63 @@
+From bf8c96ba6936050ed4a0de5bc8aeeaf2b3c50dc1 Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex@linutronix.de>
+Date: Thu, 7 Dec 2023 12:54:30 +0100
+Subject: [PATCH] gyp: resolve python 3.12 issues
+
+Upstream has updated gyp wholesale in the main branch, so
+this patch can be dropped in due time.
+
+Upstream-Status: Inappropriate [issue will be fixed upstream with the next nodejs LTS update]
+
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py | 4 ++--
+ tools/gyp/pylib/gyp/input.py                          | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py
+index d9699a0a..173e9465 100644
+--- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py
++++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py
+@@ -16,7 +16,7 @@ import subprocess
+ import sys
+ import threading
+ import traceback
+-from distutils.version import StrictVersion
++from packaging.version import Version
+ from gyp.common import GypError
+ from gyp.common import OrderedSet
+ 
+@@ -1183,7 +1183,7 @@ def EvalSingleCondition(cond_expr, true_dict, false_dict, phase, variables, buil
+         else:
+             ast_code = compile(cond_expr_expanded, "<string>", "eval")
+             cached_conditions_asts[cond_expr_expanded] = ast_code
+-        env = {"__builtins__": {}, "v": StrictVersion}
++        env = {"__builtins__": {}, "v": Version}
+         if eval(ast_code, env, variables):
+             return true_dict
+         return false_dict
+diff --git a/tools/gyp/pylib/gyp/input.py b/tools/gyp/pylib/gyp/input.py
+index 354958bf..ab6112e5 100644
+--- a/tools/gyp/pylib/gyp/input.py
++++ b/tools/gyp/pylib/gyp/input.py
+@@ -16,7 +16,7 @@ import subprocess
+ import sys
+ import threading
+ import traceback
+-from distutils.version import StrictVersion
++from packaging.version import Version
+ from gyp.common import GypError
+ from gyp.common import OrderedSet
+ 
+@@ -1190,7 +1190,7 @@ def EvalSingleCondition(cond_expr, true_dict, false_dict, phase, variables, buil
+         else:
+             ast_code = compile(cond_expr_expanded, "<string>", "eval")
+             cached_conditions_asts[cond_expr_expanded] = ast_code
+-        env = {"__builtins__": {}, "v": StrictVersion}
++        env = {"__builtins__": {}, "v": Version}
+         if eval(ast_code, env, variables):
+             return true_dict
+         return false_dict
+-- 
+2.39.2
+
diff --git a/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs_20.8.1.bb b/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs_20.8.1.bb
index 65f4eb3..0ca0c14 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs_20.8.1.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs_20.8.1.bb
@@ -5,7 +5,7 @@
 
 CVE_PRODUCT = "nodejs node.js"
 
-DEPENDS = "openssl file-replacement-native"
+DEPENDS = "openssl file-replacement-native python3-packaging-native"
 DEPENDS:append:class-target = " qemu-native"
 DEPENDS:append:class-native = " c-ares-native"
 
@@ -27,6 +27,8 @@
            file://0001-Revert-io_uring-changes-from-libuv-1.46.0.patch \
            file://0002-Revert-io_uring-changes-from-libuv-1.45.0.patch \
            file://run-ptest \
+           file://0001-build-fix-build-with-Python-3.12.patch \
+           file://0001-gyp-resolve-python-3.12-issues.patch \
            "
 
 SRC_URI:append:class-target = " \
diff --git a/meta-openembedded/meta-oe/recipes-devtools/perl/exiftool_12.70.bb b/meta-openembedded/meta-oe/recipes-devtools/perl/exiftool_12.71.bb
similarity index 92%
rename from meta-openembedded/meta-oe/recipes-devtools/perl/exiftool_12.70.bb
rename to meta-openembedded/meta-oe/recipes-devtools/perl/exiftool_12.71.bb
index 58b5e51..7d8d6b6 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/perl/exiftool_12.70.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/perl/exiftool_12.71.bb
@@ -7,7 +7,7 @@
 
 inherit cpan
 
-SRCREV = "bec8a1bff8a97ea8f2895e7e5c5e396e0e48d419"
+SRCREV = "7cefbaaa9057231b6e9b5765934f06e75994420d"
 SRC_URI = "git://github.com/exiftool/exiftool;protocol=https;branch=master"
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/php/php_8.2.9.bb b/meta-openembedded/meta-oe/recipes-devtools/php/php_8.2.9.bb
index 27d3be1..cb9d006 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/php/php_8.2.9.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/php/php_8.2.9.bb
@@ -6,7 +6,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=5ebd5be8e2a89f634486445bd164bef0"
 
 BBCLASSEXTEND = "native"
-DEPENDS = "zlib bzip2 libxml2 virtual/libiconv php-native lemon-native"
+DEPENDS = "zlib bzip2 libxml2 virtual/libiconv php-native"
 DEPENDS:append:libc-musl = " libucontext"
 DEPENDS:class-native = "zlib-native libxml2-native"
 
diff --git a/meta-openembedded/meta-oe/recipes-devtools/sip/sip_6.7.12.bb b/meta-openembedded/meta-oe/recipes-devtools/sip/sip_6.8.1.bb
similarity index 66%
rename from meta-openembedded/meta-oe/recipes-devtools/sip/sip_6.7.12.bb
rename to meta-openembedded/meta-oe/recipes-devtools/sip/sip_6.8.1.bb
index 00823cf..e045431 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/sip/sip_6.7.12.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/sip/sip_6.8.1.bb
@@ -11,6 +11,14 @@
 inherit pypi setuptools3 python3native
 
 PYPI_PACKAGE = "sip"
-SRC_URI[sha256sum] = "08e66f742592eb818ac8fda4173e2ed64c9f2d40b70bee11db1c499127d98450"
+SRC_URI[sha256sum] = "3002df415e168ac3ffe393942dbc7131cb82ade50000e1526f46a88ade26f598"
+
+RDEPENDS:${PN} = " \
+    python3-core \
+    python3-packaging \
+    python3-logging \
+    python3-tomllib \
+    python3-setuptools \
+"
 
 BBCLASSEXTEND = "native"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/tcltk/tk_8.6.10.bb b/meta-openembedded/meta-oe/recipes-devtools/tcltk/tk_8.6.10.bb
index f3cab4e..237c4e7 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/tcltk/tk_8.6.10.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/tcltk/tk_8.6.10.bb
@@ -28,6 +28,8 @@
 
 S = "${WORKDIR}/${BPN}${PV}/unix"
 
+DEBUG_PREFIX_MAP += "-fdebug-prefix-map=${S}/../=${TARGET_DBGSRC_DIR}/.."
+
 PSEUDO_IGNORE_PATHS .= ",${WORKDIR}/${BPN}${PV}"
 
 # Short version format: "8.6"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/valijson/valijson_1.0.1.bb b/meta-openembedded/meta-oe/recipes-devtools/valijson/valijson_1.0.2.bb
similarity index 93%
rename from meta-openembedded/meta-oe/recipes-devtools/valijson/valijson_1.0.1.bb
rename to meta-openembedded/meta-oe/recipes-devtools/valijson/valijson_1.0.2.bb
index b8e7f50..f531218 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/valijson/valijson_1.0.1.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/valijson/valijson_1.0.2.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=5c4583a434195e4f3b418e17c8ca2daf"
 
 SRC_URI = "git://github.com/tristanpenman/valijson.git;branch=master;protocol=https"
-SRCREV = "f7399c1a244982632671906d17f3ea77f3ccfc67"
+SRCREV = "0b4771e273a065d437814baf426bcfcafec0f434"
 
 S = "${WORKDIR}/git"
 
diff --git a/meta-openembedded/meta-oe/recipes-extended/flatpak/flatpak_1.15.6.bb b/meta-openembedded/meta-oe/recipes-extended/flatpak/flatpak_1.15.6.bb
index 0ee53af..caa353b 100644
--- a/meta-openembedded/meta-oe/recipes-extended/flatpak/flatpak_1.15.6.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/flatpak/flatpak_1.15.6.bb
@@ -43,8 +43,6 @@
     xdg-dbus-proxy \
 "
 
-EXTRA_OEMESON += "-Dsystem_dbus_proxy=${bindir}/xdg-dbus-proxy -Dsystem_bubblewrap=${bindir}/bwrap"
-
 GIR_MESON_OPTION = "gir"
 GIR_MESON_ENABLE_FLAG = 'enabled'
 GIR_MESON_DISABLE_FLAG = 'disabled'
diff --git a/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_2.3.0.bb b/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_2.3.0.bb
index f636990..3eefda7 100644
--- a/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_2.3.0.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_2.3.0.bb
@@ -22,6 +22,10 @@
     CVE-2017-5836 \
 "
 
+do_configure:prepend() {
+    rm ${S}/m4/ax_python_devel.m4
+}
+
 do_install:append () {
     if [ -e ${D}${libdir}/python*/site-packages/plist/_plist.so ]; then
         chrpath -d ${D}${libdir}/python*/site-packages/plist/_plist.so
diff --git a/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_git.bb b/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_git.bb
index f8e7f98..0142bcb 100644
--- a/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_git.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/libimobiledevice/libplist_git.bb
@@ -23,6 +23,10 @@
     CVE-2017-5836 \
 "
 
+do_configure:prepend() {
+    rm ${S}/m4/ax_python_devel.m4
+}
+
 do_install:append () {
     if [ -e ${D}${libdir}/python*/site-packages/plist/_plist.so ]; then
         chrpath -d ${D}${libdir}/python*/site-packages/plist/_plist.so
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0001-config.guess-Support-build-on-aarch64.patch b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0001-config.guess-Support-build-on-aarch64.patch
new file mode 100644
index 0000000..3086a70
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/files/0001-config.guess-Support-build-on-aarch64.patch
@@ -0,0 +1,31 @@
+From 92fdbfdd6b55ff0b65edd9a283ac85ad349e325b Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang@windriver.com>
+Date: Tue, 12 Dec 2023 07:27:52 +0000
+Subject: [PATCH] config.guess: Fix do_configure error builder aarch64
+
+Fixed configure error when build on aarch64 host:
+error: cannot guess build type; you must specify one
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
+---
+ config.guess      |   2 +-
+ 1 files changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/thirdparty/uuid-1.6.2/config.guess b/thirdparty/uuid-1.6.2/config.guess
+index ca2a03c..a858bfd 100755
+--- a/thirdparty/uuid-1.6.2/config.guess
++++ b/thirdparty/uuid-1.6.2/config.guess
+@@ -835,7 +835,7 @@ EOF
+     i*86:Minix:*:*)
+ 	echo ${UNAME_MACHINE}-pc-minix
+ 	exit ;;
+-    arm*:Linux:*:*)
++    arm*:Linux:*:*|aarch64:Linux:*:*)
+ 	eval $set_cc_for_build
+ 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ 	    | grep -q __ARM_EABI__
+-- 
+2.34.1
+
diff --git a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb
index 67a2d9f..5059b63 100644
--- a/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/minifi-cpp/minifi-cpp_0.7.0.bb
@@ -40,6 +40,7 @@
             file://minifi.service \
             file://systemd-volatile.conf \
             file://sysvinit-volatile.conf \
+            file://0001-config.guess-Support-build-on-aarch64.patch \
             "
 
 SRC_URI[curl.md5sum] = "d0bcc586873cfef08b4b9594e5395a33"
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-Cargo.toml-do-not-abort-on-panic.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-Cargo.toml-do-not-abort-on-panic.patch
deleted file mode 100644
index 0dd9361..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-Cargo.toml-do-not-abort-on-panic.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From bb46a8a729cc4d66ad36db40c17e36a5111f19c3 Mon Sep 17 00:00:00 2001
-From: Alexander Kanavin <alex@linutronix.de>
-Date: Fri, 1 Oct 2021 13:00:24 +0200
-Subject: [PATCH] Cargo.toml: do not abort on panic
-
-OE's rust is configured to unwind, and this setting clashes with it/
-
-Upstream-Status: Inappropriate [oe-core specific]
-Signed-off-by: Alexander Kanavin <alex@linutronix.de>
-
----
- Cargo.toml | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/Cargo.toml b/Cargo.toml
-index f576534bf3..5ecc17c319 100644
---- a/Cargo.toml
-+++ b/Cargo.toml
-@@ -56,13 +56,11 @@ opt-level = 1
- rpath = false
- lto = false
- debug-assertions = true
--panic = "abort"
- 
- [profile.release]
- opt-level = 2
- rpath = false
- debug-assertions = false
--panic = "abort"
- 
- # Optimize build dependencies, because bindgen and proc macros / style
- # compilation take more to run than to build otherwise.
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-add-arm-to-list-of-mozinline.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-add-arm-to-list-of-mozinline.patch
deleted file mode 100644
index 02f5e5c..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-add-arm-to-list-of-mozinline.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-Backport patch from firefox bugzilla to fix compile error for qemuarm with
-some armv7ve tunes such as 'armv7vethf' and 'armv7vet-vfpv3d16':
-
-| /path/to/build/tmp/work/armv7vet2hf-vfp-poky-linux-gnueabi/mozjs-102/102.5.0-r0/build/js/src/jit/AtomicOperationsGenerated.h:240:17:
-  error: 'asm' operand has impossible constraints
-|  240 |                 asm volatile (
-|      |                 ^~~
-
-Upstream-Status: Submitted [https://bugzilla.mozilla.org/show_bug.cgi?id=1761665]
-
-Signed-off-by: Kai Kang <kai.kang@windriver.com>
-
-diff --git a/js/src/jit/GenerateAtomicOperations.py b/js/src/jit/GenerateAtomicOperations.py
-index d8a38a0..65f91ab 100644
---- a/js/src/jit/GenerateAtomicOperations.py
-+++ b/js/src/jit/GenerateAtomicOperations.py
-@@ -856,7 +856,7 @@ def generate_atomics_header(c_out):
- 
-         # Work around a GCC issue on 32-bit x86 by adding MOZ_NEVER_INLINE.
-         # See bug 1756347.
--        if is_gcc and cpu_arch == "x86":
-+        if is_gcc and cpu_arch in ("x86", "arm"):
-             contents = contents.replace("INLINE_ATTR", "MOZ_NEVER_INLINE inline")
-         else:
-             contents = contents.replace("INLINE_ATTR", "inline")
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-build-do-not-use-autoconf-s-config.sub-to-canonicali.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-build-do-not-use-autoconf-s-config.sub-to-canonicali.patch
deleted file mode 100644
index fe905fe..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-build-do-not-use-autoconf-s-config.sub-to-canonicali.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From c860dcbe63b0e393c95bfb0131238f91aaac11d3 Mon Sep 17 00:00:00 2001
-From: Alexander Kanavin <alex@linutronix.de>
-Date: Thu, 7 Oct 2021 12:44:18 +0200
-Subject: [PATCH] build: do not use autoconf's config.sub to 'canonicalize'
- names
-
-The outcome is that processed names no longer match our custom rust
-target definitions, and the build fails.
-
-Upstream-Status: Inappropriate [oe-core specific]
-Signed-off-by: Alexander Kanavin <alex@linutronix.de>
-
----
- build/moz.configure/init.configure | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
-index 81f500a0b7..0b7a2ff60f 100644
---- a/build/moz.configure/init.configure
-+++ b/build/moz.configure/init.configure
-@@ -585,7 +585,7 @@ def help_host_target(help, host, target):
- 
- def config_sub(shell, triplet):
-     config_sub = os.path.join(os.path.dirname(__file__), "..", "autoconf", "config.sub")
--    return check_cmd_output(shell, config_sub, triplet).strip()
-+    return triplet
- 
- 
- @depends("--host", shell)
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-rewrite-cargo-host-linker-in-python3.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-rewrite-cargo-host-linker-in-python3.patch
deleted file mode 100644
index 73bcffe..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-rewrite-cargo-host-linker-in-python3.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From 8e318c4e7e732327dabf51027860de45b6fb731e Mon Sep 17 00:00:00 2001
-From: Changqing Li <changqing.li@windriver.com>
-Date: Thu, 18 Nov 2021 07:16:39 +0000
-Subject: [PATCH] Rewrite cargo-host-linker in python3
-
-Mozjs compile failed with this failure:
-/bin/sh: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by /build/tmp-glibc/work/corei7-64-wrs-linux/mozjs/91.1.0-r0/recipe-sysroot-native/usr/lib/libtinfo.so.5)
-
-Root Cause:
-cargo-host-linker has /bin/sh as it's interpreter, but cargo run the cmd
-with LD_LIBRARY_PATH set to recipe-sysroot-native. The host /bin/sh links
-libtinfo.so.5 under recipe-sysroot-native, which needs higher libc. But
-host libc is older libc. So the incompatible problem occurred.
-
-Solution:
-rewrite cargo-host-linker in python3
-
-Upstream-Status: Inappropriate [oe specific]
-
-Signed-off-by: Changqing Li <changqing.li@windriver.com>
-
----
- build/cargo-host-linker | 24 +++++++++++++++++++++---
- 1 file changed, 21 insertions(+), 3 deletions(-)
-
-diff --git a/build/cargo-host-linker b/build/cargo-host-linker
-index cbd0472bf7..87d43ce9ec 100755
---- a/build/cargo-host-linker
-+++ b/build/cargo-host-linker
-@@ -1,3 +1,21 @@
--#!/bin/sh
--# See comment in cargo-linker.
--eval ${MOZ_CARGO_WRAP_HOST_LD} ${MOZ_CARGO_WRAP_HOST_LDFLAGS} '"$@"'
-+#!/usr/bin/env python3
-+
-+import os,sys
-+
-+if os.environ['MOZ_CARGO_WRAP_HOST_LD'].strip():
-+    binary=os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[0]
-+else:
-+    sys.exit(0)
-+
-+if os.environ['MOZ_CARGO_WRAP_HOST_LDFLAGS'].strip():
-+    if os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[1:]:
-+        args=[os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[0]] + os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[1:] + [os.environ['MOZ_CARGO_WRAP_HOST_LDFLAGS']] + sys.argv[1:]
-+    else:
-+        args=[os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[0]] + [os.environ['MOZ_CARGO_WRAP_HOST_LDFLAGS']] + sys.argv[1:]
-+else:
-+    if os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[1:]:
-+        args=[os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[0]] + os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[1:] + sys.argv[1:]
-+    else:
-+        args=[os.environ['MOZ_CARGO_WRAP_HOST_LD'].split()[0]] + sys.argv[1:]
-+
-+os.execvp(binary, args)
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-util.configure-fix-one-occasionally-reproduced-confi.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-util.configure-fix-one-occasionally-reproduced-confi.patch
deleted file mode 100644
index d732fda..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0001-util.configure-fix-one-occasionally-reproduced-confi.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 2a6f66f39b4e623428b6d282bd4cb72dde67c1a6 Mon Sep 17 00:00:00 2001
-From: Changqing Li <changqing.li@windriver.com>
-Date: Thu, 11 Nov 2021 16:05:54 +0800
-Subject: [PATCH] util.configure: fix one occasionally reproduced configure
- failure
-
-error:
-| checking whether the C++ compiler supports -Wno-range-loop-analysis...
-| DEBUG: Creating /tmp/conftest.jr1qrcw3.cpp with content:
-| DEBUG: | int
-| DEBUG: | main(void)
-| DEBUG: | {
-| DEBUG: |
-| DEBUG: | ;
-| DEBUG: | return 0;
-| DEBUG: | }
-| DEBUG: Executing: aarch64-wrs-linux-g++ -mcpu=cortex-a53 -march=armv8-a+crc -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/mozjs/91.1.0-r0/recipe-sysroot /tmp/conftest.jr1qrcw3.cpp -Werror -Wrange-loop-analysis -c
-| DEBUG: The command returned non-zero exit status 1.
-| DEBUG: Its error output was:
-...
-| File "/mozjs/91.1.0-r0/firefox-91.1.0/build/moz.configure/util.configure", line 239, in try_invoke_compiler
-| os.remove(path)
-| FileNotFoundError: [Errno 2] No such file or directory: '/tmp/conftest.jr1qrcw3.cpp'
-
-It should be another process that deleted this file by using
-"rm -rf conftest*" inappropriately
-
-Upstream-Status: Submitted [https://bugzilla.mozilla.org/show_bug.cgi?id=1740667]
-
-Signed-off-by: Changqing Li <changqing.li@windriver.com>
-
----
- build/moz.configure/util.configure | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/build/moz.configure/util.configure b/build/moz.configure/util.configure
-index 80c3a34522..0ac0c6b611 100644
---- a/build/moz.configure/util.configure
-+++ b/build/moz.configure/util.configure
-@@ -216,7 +216,7 @@ def try_invoke_compiler(compiler, language, source, flags=None, onerror=None):
-         "C++": ".cpp",
-     }[language]
- 
--    fd, path = mkstemp(prefix="conftest.", suffix=suffix, text=True)
-+    fd, path = mkstemp(prefix="try_invoke_compiler_conftest.", suffix=suffix, text=True)
-     try:
-         source = source.encode("ascii", "replace")
- 
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0002-moz.configure-do-not-look-for-llvm-objdump.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0002-moz.configure-do-not-look-for-llvm-objdump.patch
deleted file mode 100644
index b3d3c1f..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0002-moz.configure-do-not-look-for-llvm-objdump.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 0133ddb86eb6e0741e02b0032c41468db6438530 Mon Sep 17 00:00:00 2001
-From: Alexander Kanavin <alex@linutronix.de>
-Date: Fri, 1 Oct 2021 13:01:10 +0200
-Subject: [PATCH] moz.configure: do not look for llvm-objdump
-
-This avoid dragging in a dependency that isn't even needed
-for js builds.
-
-Upstream-Status: Inappropriate [oe-core specific]
-Signed-off-by: Alexander Kanavin <alex@linutronix.de>
----
- moz.configure | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/moz.configure b/moz.configure
-index fc66b520d0..15de9a2ee0 100755
---- a/moz.configure
-+++ b/moz.configure
-@@ -785,15 +785,15 @@
-     return llvm_tool
- 
- 
--llvm_objdump = check_prog(
--    "LLVM_OBJDUMP",
--    llvm_tool("llvm-objdump"),
--    what="llvm-objdump",
--    when="--enable-compile-environment",
--    paths=clang_search_path,
--)
--
--add_old_configure_assignment("LLVM_OBJDUMP", llvm_objdump)
-+#llvm_objdump = check_prog(
-+#    "LLVM_OBJDUMP",
-+#    llvm_tool("llvm-objdump"),
-+#    what="llvm-objdump",
-+#    when="--enable-compile-environment",
-+#    paths=clang_search_path,
-+#)
-+#
-+#add_old_configure_assignment("LLVM_OBJDUMP", llvm_objdump)
- 
- 
- @depends(llvm_tool("llvm-readelf"), toolchain_prefix)
-
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0003-rust.configure-do-not-try-to-find-a-suitable-upstrea.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0003-rust.configure-do-not-try-to-find-a-suitable-upstrea.patch
deleted file mode 100644
index 202f126..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0003-rust.configure-do-not-try-to-find-a-suitable-upstrea.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From 33ff25e2b126dd4135006139641d8b7f6e4da200 Mon Sep 17 00:00:00 2001
-From: Alexander Kanavin <alex@linutronix.de>
-Date: Fri, 1 Oct 2021 13:02:17 +0200
-Subject: [PATCH] rust.configure: do not try to find a suitable upstream target
-
-OE is using custom targets and so this is bound to fail.
-
-Upstream-Status: Inappropriate [oe-core specific]
-Signed-off-by: Alexander Kanavin <alex@linutronix.de>
-
----
- build/moz.configure/rust.configure | 34 ++----------------------------
- 1 file changed, 2 insertions(+), 32 deletions(-)
-
-diff --git a/build/moz.configure/rust.configure b/build/moz.configure/rust.configure
-index e64dc5d5ec..edf21baca6 100644
---- a/build/moz.configure/rust.configure
-+++ b/build/moz.configure/rust.configure
-@@ -471,33 +471,7 @@ def assert_rust_compile(host_or_target, rustc_target, rustc):
- def rust_host_triple(
-     rustc, host, compiler_info, rustc_host, rust_supported_targets, arm_target
- ):
--    rustc_target = detect_rustc_target(
--        host, compiler_info, arm_target, rust_supported_targets
--    )
--    if rustc_target != rustc_host:
--        if host.alias == rustc_target:
--            configure_host = host.alias
--        else:
--            configure_host = "{}/{}".format(host.alias, rustc_target)
--        die(
--            dedent(
--                """\
--        The rust compiler host ({rustc}) is not suitable for the configure host ({configure}).
--
--        You can solve this by:
--        * Set your configure host to match the rust compiler host by editing your
--        mozconfig and adding "ac_add_options --host={rustc}".
--        * Or, install the rust toolchain for {configure}, if supported, by running
--        "rustup default stable-{rustc_target}"
--        """.format(
--                    rustc=rustc_host,
--                    configure=configure_host,
--                    rustc_target=rustc_target,
--                )
--            )
--        )
--    assert_rust_compile(host, rustc_target, rustc)
--    return rustc_target
-+    return rustc_host
- 
- 
- @depends(
-@@ -507,11 +481,7 @@ def rust_host_triple(
- def rust_target_triple(
-     rustc, target, compiler_info, rust_supported_targets, arm_target
- ):
--    rustc_target = detect_rustc_target(
--        target, compiler_info, arm_target, rust_supported_targets
--    )
--    assert_rust_compile(target, rustc_target, rustc)
--    return rustc_target
-+    return target.alias
- 
- 
- set_config("RUST_TARGET", rust_target_triple)
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0004-use-asm-sgidefs.h.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0004-use-asm-sgidefs.h.patch
deleted file mode 100644
index ff28654..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/0004-use-asm-sgidefs.h.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0ec73937b01869a701ed9b60a6a84469e035ded4 Mon Sep 17 00:00:00 2001
-From: Andre McCurdy <amccurdy@gmail.com>
-Date: Sat, 30 Apr 2016 15:29:06 -0700
-Subject: [PATCH] use <asm/sgidefs.h>
-
-Build fix for MIPS with musl libc
-
-The MIPS specific header <sgidefs.h> is provided by glibc and uclibc
-but not by musl. Regardless of the libc, the kernel headers provide
-<asm/sgidefs.h> which provides the same definitions, so use that
-instead.
-
-Upstream-Status: Pending
-
-[Vincent:
-Taken from: https://sourceware.org/bugzilla/show_bug.cgi?id=21070]
-
-Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
-
----
- mfbt/RandomNum.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/mfbt/RandomNum.cpp b/mfbt/RandomNum.cpp
-index 23381db0cd..7f127c0715 100644
---- a/mfbt/RandomNum.cpp
-+++ b/mfbt/RandomNum.cpp
-@@ -52,7 +52,7 @@ extern "C" BOOLEAN NTAPI RtlGenRandom(PVOID RandomBuffer,
- #  elif defined(__s390__)
- #    define GETRANDOM_NR 349
- #  elif defined(__mips__)
--#    include <sgidefs.h>
-+#    include <asm/sgidefs.h>
- #    if _MIPS_SIM == _MIPS_SIM_ABI32
- #      define GETRANDOM_NR 4353
- #    elif _MIPS_SIM == _MIPS_SIM_ABI64
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/fix-musl-build.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/fix-musl-build.patch
deleted file mode 100644
index 6905282..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/fix-musl-build.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 1110483c6c06adf2d03ed9154a8957defc175c80 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 20 Oct 2021 16:21:14 -0700
-Subject: [PATCH] mozjs: Fix musl miscompiles with HAVE_THREAD_TLS_KEYWORD
-
-Upstream: No
-Reason: mozjs60 miscompiles on musl if built with HAVE_THREAD_TLS_KEYWORD:
-https://github.com/void-linux/void-packages/issues/2598
-
----
-Upstream-Status: Pending
-
- js/src/old-configure.in | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/js/src/old-configure.in b/js/src/old-configure.in
-index 8dfd75c63d..c82e580428 100644
---- a/js/src/old-configure.in
-+++ b/js/src/old-configure.in
-@@ -839,6 +839,9 @@ if test "$ac_cv_thread_keyword" = yes; then
-     *-android*|*-linuxandroid*)
-       :
-       ;;
-+    *-musl*)
-+      :
-+      ;;
-     *)
-       AC_DEFINE(HAVE_THREAD_TLS_KEYWORD)
-       ;;
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/musl-disable-stackwalk.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/musl-disable-stackwalk.patch
deleted file mode 100644
index a3ba469..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/musl-disable-stackwalk.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-Musl does not have stack unwinder like glibc therefore
-we can not assume that its always available on musl, we
-do need to check for target environment as well which
-could be musl or glibc.
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
---- a/mozglue/misc/StackWalk.cpp
-+++ b/mozglue/misc/StackWalk.cpp
-@@ -44,7 +44,7 @@ using namespace mozilla;
- #  define MOZ_STACKWALK_SUPPORTS_MACOSX 0
- #endif
- 
--#if (defined(linux) &&                                            \
-+#if (defined(linux) && defined(__GLIBC__) &&                      \
-      ((defined(__GNUC__) && (defined(__i386) || defined(PPC))) || \
-       defined(HAVE__UNWIND_BACKTRACE)))
- #  define MOZ_STACKWALK_SUPPORTS_LINUX 1
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/riscv32.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/riscv32.patch
deleted file mode 100644
index a6a0a9e..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102/riscv32.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 81385fe53ffde5e1636e9ace0736d914da8dbc0f Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Sun, 24 Oct 2021 22:32:50 -0700
-Subject: [PATCH] Add RISCV32 support
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-
----
- build/moz.configure/init.configure                             | 3 +++
- python/mozbuild/mozbuild/configure/constants.py                | 2 ++
- .../mozbuild/test/configure/test_toolchain_configure.py        | 1 +
- 3 files changed, 6 insertions(+)
-
-diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
-index 0b7a2ff60f..54f8325b44 100644
---- a/build/moz.configure/init.configure
-+++ b/build/moz.configure/init.configure
-@@ -524,6 +524,9 @@ def split_triplet(triplet, allow_msvc=False, allow_wasi=False):
-     elif cpu.startswith("aarch64"):
-         canonical_cpu = "aarch64"
-         endianness = "little"
-+    elif cpu in ("riscv32", "riscv32gc"):
-+        canonical_cpu = "riscv32"
-+        endianness = "little"
-     elif cpu in ("riscv64", "riscv64gc"):
-         canonical_cpu = "riscv64"
-         endianness = "little"
-diff --git a/python/mozbuild/mozbuild/configure/constants.py b/python/mozbuild/mozbuild/configure/constants.py
-index c71460cb20..15bef93e19 100644
---- a/python/mozbuild/mozbuild/configure/constants.py
-+++ b/python/mozbuild/mozbuild/configure/constants.py
-@@ -53,6 +53,7 @@ CPU_bitness = {
-     "mips64": 64,
-     "ppc": 32,
-     "ppc64": 64,
-+    'riscv32': 32,
-     "riscv64": 64,
-     "s390": 32,
-     "s390x": 64,
-@@ -95,6 +96,7 @@ CPU_preprocessor_checks = OrderedDict(
-         ("m68k", "__m68k__"),
-         ("mips64", "__mips64"),
-         ("mips32", "__mips__"),
-+        ("riscv32", "__riscv && __riscv_xlen == 32"),
-         ("riscv64", "__riscv && __riscv_xlen == 64"),
-         ("loongarch64", "__loongarch64"),
-         ("sh4", "__sh__"),
-diff --git a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
-index 059cde0139..4f9986eb31 100644
---- a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
-+++ b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py
-@@ -1192,6 +1192,7 @@ class LinuxCrossCompileToolchainTest(BaseToolchainTest):
-         "m68k-unknown-linux-gnu": big_endian + {"__m68k__": 1},
-         "mips64-unknown-linux-gnuabi64": big_endian + {"__mips64": 1, "__mips__": 1},
-         "mips-unknown-linux-gnu": big_endian + {"__mips__": 1},
-+        "riscv32-unknown-linux-gnu": little_endian + {"__riscv": 1, "__riscv_xlen": 32},
-         "riscv64-unknown-linux-gnu": little_endian + {"__riscv": 1, "__riscv_xlen": 64},
-         "sh4-unknown-linux-gnu": little_endian + {"__sh__": 1},
-     }
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102_102.15.1.bb b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102_102.15.1.bb
deleted file mode 100644
index 3a7b51c..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-102_102.15.1.bb
+++ /dev/null
@@ -1,82 +0,0 @@
-SUMMARY = "SpiderMonkey is Mozilla's JavaScript engine written in C/C++"
-HOMEPAGE = "https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey"
-LICENSE = "MPL-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=dc9b6ecd19a14a54a628edaaf23733bf"
-
-SRC_URI = "https://archive.mozilla.org/pub/firefox/releases/${PV}esr/source/firefox-${PV}esr.source.tar.xz \
-           file://0001-Cargo.toml-do-not-abort-on-panic.patch \
-           file://0002-moz.configure-do-not-look-for-llvm-objdump.patch \
-           file://0003-rust.configure-do-not-try-to-find-a-suitable-upstrea.patch \
-           file://0004-use-asm-sgidefs.h.patch \
-           file://fix-musl-build.patch \
-           file://0001-build-do-not-use-autoconf-s-config.sub-to-canonicali.patch \
-           file://riscv32.patch \
-           file://0001-util.configure-fix-one-occasionally-reproduced-confi.patch \
-           file://0001-rewrite-cargo-host-linker-in-python3.patch  \
-           file://musl-disable-stackwalk.patch \
-           file://0001-add-arm-to-list-of-mozinline.patch \
-           "
-SRC_URI[sha256sum] = "09194fb765953bc6979a35aa8834118c453b9d6060bf1ec4e134551bad740113"
-
-S = "${WORKDIR}/firefox-${PV}"
-
-inherit pkgconfig perlnative python3native rust
-
-DEPENDS += "zlib cargo-native python3 icu"
-DEPENDS:remove:mipsarch = "icu"
-DEPENDS:remove:powerpc:toolchain-clang = "icu"
-
-B = "${WORKDIR}/build"
-
-export PYTHONPATH = "${S}/build:${S}/third_party/python/PyYAML/lib3:${S}/testing/mozbase/mozfile:${S}/python/mozboot:${S}/third_party/python/distro:${S}/testing/mozbase/mozinfo:${S}/config:${S}/testing/mozbase/manifestparser:${S}/third_party/python/pytoml:${S}/testing/mozbase/mozprocess:${S}/third_party/python/six:${S}/python/mozbuild:${S}/python/mozbuild/mozbuild:${S}/python/mach:${S}/third_party/python/jsmin:${S}/python/mozversioncontrol"
-
-export HOST_CC = "${BUILD_CC}"
-export HOST_CXX = "${BUILD_CXX}"
-export HOST_CFLAGS = "${BUILD_CFLAGS}"
-export HOST_CPPFLAGS = "${BUILD_CPPFLAGS}"
-export HOST_CXXFLAGS = "${BUILD_CXXFLAGS}"
-
-export AS = "${CC}"
-
-export RUSTFLAGS
-
-JIT ?= ""
-JIT:mipsarch = "--disable-jit"
-ICU ?= "--with-system-icu"
-ICU:mipsarch = ""
-ICU:powerpc:toolchain-clang = ""
-
-do_configure() {
-    cd ${B}
-    python3 ${S}/configure.py \
-        --enable-project=js \
-        --target=${RUST_HOST_SYS} \
-        --host=${BUILD_SYS} \
-        --prefix=${prefix} \
-        --libdir=${libdir} \
-        --disable-jemalloc \
-        --disable-strip \
-        ${JIT} \
-        ${ICU}
-}
-
-do_install() {
-    oe_runmake 'DESTDIR=${D}' install
-}
-
-inherit multilib_script multilib_header
-
-MAJ_VER = "${@oe.utils.trim_version("${PV}", 1)}"
-MULTILIB_SCRIPTS += "${PN}-dev:${bindir}/js${MAJ_VER}-config"
-
-do_install:append() {
-    oe_multilib_header mozjs-${MAJ_VER}/js-config.h
-    sed -e 's@${STAGING_DIR_HOST}@@g' \
-        -i ${D}${bindir}/js${MAJ_VER}-config
-    rm -f ${D}${libdir}/libjs_static.ajs
-    # remove the build path
-    sed -i -e 's@${WORKDIR}@@g' `find ${B} -name Unified_c*.c*`
-}
-
-PACKAGES =+ "lib${BPN}"
-FILES:lib${BPN} += "${libdir}/lib*"
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-115/py3.12.patch b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-115/py3.12.patch
new file mode 100644
index 0000000..732c8ff
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-115/py3.12.patch
@@ -0,0 +1,2496 @@
+From 7293cfae4fd68004901825ad1cabb83424d8729a Mon Sep 17 00:00:00 2001
+From: serge-sans-paille <sguelton@mozilla.com>
+Date: Mon, 16 Oct 2023 13:35:24 +0000
+Subject: [PATCH] Bug 1857492 - Upgrade vendored version of six and urllib3
+ r=saschanaz
+
+six -> 1.16
+urllib3 -> 1.26.17
+
+Differential Revision: https://phabricator.services.mozilla.com/D190288
+Upstream-Status: Backport [https://github.com/mozilla/gecko-dev/commit/7293cfae4fd68004901825ad1cabb83424d8729a]
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ third_party/python/poetry.lock                |  22 +--
+ third_party/python/requirements.in            |   4 +-
+ third_party/python/requirements.txt           |  12 +-
+ .../python/six/six-1.13.0.dist-info/RECORD    |   6 -
+ .../LICENSE                                   |   2 +-
+ .../METADATA                                  |   9 +-
+ .../python/six/six-1.16.0.dist-info/RECORD    |   6 +
+ .../six-1.16.0.dist-info}/WHEEL               |   2 +-
+ .../top_level.txt                             |   0
+ third_party/python/six/six.py                 |  91 ++++++---
+ .../urllib3/urllib3-1.26.0.dist-info/RECORD   |  44 -----
+ .../LICENSE.txt                               |   0
+ .../METADATA                                  | 177 ++++++++++++++++--
+ .../urllib3/urllib3-1.26.17.dist-info/RECORD  |  44 +++++
+ .../urllib3-1.26.17.dist-info}/WHEEL          |   2 +-
+ .../top_level.txt                             |   0
+ .../python/urllib3/urllib3/__init__.py        |  17 ++
+ .../python/urllib3/urllib3/_version.py        |   2 +-
+ .../python/urllib3/urllib3/connection.py      |  62 ++++--
+ .../python/urllib3/urllib3/connectionpool.py  |  97 ++++++++--
+ .../contrib/_securetransport/bindings.py      |   2 +-
+ .../contrib/_securetransport/low_level.py     |   1 +
+ .../urllib3/urllib3/contrib/appengine.py      |   4 +-
+ .../urllib3/urllib3/contrib/ntlmpool.py       |  13 +-
+ .../urllib3/urllib3/contrib/pyopenssl.py      |  19 +-
+ .../urllib3/contrib/securetransport.py        |   5 +-
+ .../python/urllib3/urllib3/contrib/socks.py   |   2 +-
+ .../python/urllib3/urllib3/exceptions.py      |  12 +-
+ .../urllib3/urllib3/packages/__init__.py      |   5 -
+ .../packages/backports/weakref_finalize.py    | 155 +++++++++++++++
+ .../python/urllib3/urllib3/packages/six.py    | 125 +++++++++----
+ .../packages/ssl_match_hostname/__init__.py   |  22 ---
+ .../python/urllib3/urllib3/poolmanager.py     |   3 +-
+ third_party/python/urllib3/urllib3/request.py |  21 +++
+ .../python/urllib3/urllib3/response.py        |  72 ++++++-
+ .../python/urllib3/urllib3/util/connection.py |   5 +-
+ .../python/urllib3/urllib3/util/proxy.py      |   1 +
+ .../python/urllib3/urllib3/util/request.py    |   5 +-
+ .../python/urllib3/urllib3/util/retry.py      |  37 +++-
+ .../python/urllib3/urllib3/util/ssl_.py       |  53 ++++--
+ .../ssl_match_hostname.py}                    |  15 +-
+ .../urllib3/urllib3/util/ssltransport.py      |   6 +-
+ .../python/urllib3/urllib3/util/timeout.py    |   9 +-
+ .../python/urllib3/urllib3/util/url.py        |  17 +-
+ .../python/urllib3/urllib3/util/wait.py       |   1 -
+ 45 files changed, 934 insertions(+), 275 deletions(-)
+ delete mode 100644 third_party/python/six/six-1.13.0.dist-info/RECORD
+ rename third_party/python/six/{six-1.13.0.dist-info => six-1.16.0.dist-info}/LICENSE (96%)
+ rename third_party/python/six/{six-1.13.0.dist-info => six-1.16.0.dist-info}/METADATA (85%)
+ create mode 100644 third_party/python/six/six-1.16.0.dist-info/RECORD
+ rename third_party/python/{urllib3/urllib3-1.26.0.dist-info => six/six-1.16.0.dist-info}/WHEEL (70%)
+ rename third_party/python/six/{six-1.13.0.dist-info => six-1.16.0.dist-info}/top_level.txt (100%)
+ delete mode 100644 third_party/python/urllib3/urllib3-1.26.0.dist-info/RECORD
+ rename third_party/python/urllib3/{urllib3-1.26.0.dist-info => urllib3-1.26.17.dist-info}/LICENSE.txt (100%)
+ rename third_party/python/urllib3/{urllib3-1.26.0.dist-info => urllib3-1.26.17.dist-info}/METADATA (86%)
+ create mode 100644 third_party/python/urllib3/urllib3-1.26.17.dist-info/RECORD
+ rename third_party/python/{six/six-1.13.0.dist-info => urllib3/urllib3-1.26.17.dist-info}/WHEEL (70%)
+ rename third_party/python/urllib3/{urllib3-1.26.0.dist-info => urllib3-1.26.17.dist-info}/top_level.txt (100%)
+ create mode 100644 third_party/python/urllib3/urllib3/packages/backports/weakref_finalize.py
+ delete mode 100644 third_party/python/urllib3/urllib3/packages/ssl_match_hostname/__init__.py
+ rename third_party/python/urllib3/urllib3/{packages/ssl_match_hostname/_implementation.py => util/ssl_match_hostname.py} (92%)
+
+diff --git a/third_party/python/poetry.lock b/third_party/python/poetry.lock
+index 3d50174e58bcb..b4a8455d20fb4 100644
+--- a/third_party/python/poetry.lock
++++ b/third_party/python/poetry.lock
+@@ -1333,14 +1333,14 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (
+ 
+ [[package]]
+ name = "six"
+-version = "1.13.0"
++version = "1.16.0"
+ description = "Python 2 and 3 compatibility utilities"
+ category = "main"
+ optional = false
+-python-versions = ">=2.6, !=3.0.*, !=3.1.*"
++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+ files = [
+-    {file = "six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd"},
+-    {file = "six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"},
++    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
++    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+ ]
+ 
+ [[package]]
+@@ -1491,19 +1491,19 @@ files = [
+ 
+ [[package]]
+ name = "urllib3"
+-version = "1.26.0"
++version = "1.26.17"
+ description = "HTTP library with thread-safe connection pooling, file post, and more."
+ category = "main"
+ optional = false
+-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+ files = [
+-    {file = "urllib3-1.26.0-py2.py3-none-any.whl", hash = "sha256:bad31cb622ceee0ab46c4c884cf61957def0ff2e644de0a7a093678844c9ccac"},
+-    {file = "urllib3-1.26.0.tar.gz", hash = "sha256:4849f132941d68144df0a3785ccc4fe423430ba5db0108d045c8cadbc90f517a"},
++    {file = "urllib3-1.26.17-py2.py3-none-any.whl", hash = "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b"},
++    {file = "urllib3-1.26.17.tar.gz", hash = "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21"},
+ ]
+ 
+ [package.extras]
+-brotli = ["brotlipy (>=0.6.0)"]
+-secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"]
++brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
++secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
+ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+ 
+ [[package]]
+diff --git a/third_party/python/six/six-1.13.0.dist-info/RECORD b/third_party/python/six/six-1.13.0.dist-info/RECORD
+deleted file mode 100644
+index a0e6c1fd4bd99..0000000000000
+--- a/third_party/python/six/six-1.13.0.dist-info/RECORD
++++ /dev/null
+@@ -1,6 +0,0 @@
+-six.py,sha256=bsEzSFTZTx49wQttLORmSZTrpjGc8UbXt-HBa_LZX7Q,33045
+-six-1.13.0.dist-info/LICENSE,sha256=t1KbjAcXGniow2wyg5BVKOSBKUXZd9El65JujMvyRbY,1066
+-six-1.13.0.dist-info/METADATA,sha256=hxS4rSPRfO8ewbcLS30anoFi6LFgUQ3mk_xknZ8RV4w,1940
+-six-1.13.0.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110
+-six-1.13.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4
+-six-1.13.0.dist-info/RECORD,,
+diff --git a/third_party/python/six/six-1.13.0.dist-info/LICENSE b/third_party/python/six/six-1.16.0.dist-info/LICENSE
+similarity index 96%
+rename from third_party/python/six/six-1.13.0.dist-info/LICENSE
+rename to third_party/python/six/six-1.16.0.dist-info/LICENSE
+index 4b05a545261c0..de6633112c1f9 100644
+--- a/third_party/python/six/six-1.13.0.dist-info/LICENSE
++++ b/third_party/python/six/six-1.16.0.dist-info/LICENSE
+@@ -1,4 +1,4 @@
+-Copyright (c) 2010-2019 Benjamin Peterson
++Copyright (c) 2010-2020 Benjamin Peterson
+ 
+ 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
+diff --git a/third_party/python/six/six-1.13.0.dist-info/METADATA b/third_party/python/six/six-1.16.0.dist-info/METADATA
+similarity index 85%
+rename from third_party/python/six/six-1.13.0.dist-info/METADATA
+rename to third_party/python/six/six-1.16.0.dist-info/METADATA
+index b0c8f51e1f366..6d7525c2ebcfe 100644
+--- a/third_party/python/six/six-1.13.0.dist-info/METADATA
++++ b/third_party/python/six/six-1.16.0.dist-info/METADATA
+@@ -1,6 +1,6 @@
+ Metadata-Version: 2.1
+ Name: six
+-Version: 1.13.0
++Version: 1.16.0
+ Summary: Python 2 and 3 compatibility utilities
+ Home-page: https://github.com/benjaminp/six
+ Author: Benjamin Peterson
+@@ -14,7 +14,7 @@ Classifier: Intended Audience :: Developers
+ Classifier: License :: OSI Approved :: MIT License
+ Classifier: Topic :: Software Development :: Libraries
+ Classifier: Topic :: Utilities
+-Requires-Python: >=2.6, !=3.0.*, !=3.1.*
++Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
+ 
+ .. image:: https://img.shields.io/pypi/v/six.svg
+    :target: https://pypi.org/project/six/
+@@ -37,7 +37,7 @@ for smoothing over the differences between the Python versions with the goal of
+ writing Python code that is compatible on both Python versions.  See the
+ documentation for more information on what is provided.
+ 
+-Six supports every Python version since 2.6.  It is contained in only one Python
++Six supports Python 2.7 and 3.3+.  It is contained in only one Python
+ file, so it can be easily copied into your project. (The copyright and license
+ notice must be retained.)
+ 
+@@ -46,7 +46,4 @@ Online documentation is at https://six.readthedocs.io/.
+ Bugs can be reported to https://github.com/benjaminp/six.  The code can also
+ be found there.
+ 
+-For questions about six or porting in general, email the python-porting mailing
+-list: https://mail.python.org/mailman/listinfo/python-porting
+-
+ 
+diff --git a/third_party/python/six/six-1.16.0.dist-info/RECORD b/third_party/python/six/six-1.16.0.dist-info/RECORD
+new file mode 100644
+index 0000000000000..8de4af79fae0b
+--- /dev/null
++++ b/third_party/python/six/six-1.16.0.dist-info/RECORD
+@@ -0,0 +1,6 @@
++six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
++six-1.16.0.dist-info/LICENSE,sha256=i7hQxWWqOJ_cFvOkaWWtI9gq3_YPI5P8J2K2MYXo5sk,1066
++six-1.16.0.dist-info/METADATA,sha256=VQcGIFCAEmfZcl77E5riPCN4v2TIsc_qtacnjxKHJoI,1795
++six-1.16.0.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
++six-1.16.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4
++six-1.16.0.dist-info/RECORD,,
+diff --git a/third_party/python/urllib3/urllib3-1.26.0.dist-info/WHEEL b/third_party/python/six/six-1.16.0.dist-info/WHEEL
+similarity index 70%
+rename from third_party/python/urllib3/urllib3-1.26.0.dist-info/WHEEL
+rename to third_party/python/six/six-1.16.0.dist-info/WHEEL
+index 6d38aa0601b31..01b8fc7d4a10c 100644
+--- a/third_party/python/urllib3/urllib3-1.26.0.dist-info/WHEEL
++++ b/third_party/python/six/six-1.16.0.dist-info/WHEEL
+@@ -1,5 +1,5 @@
+ Wheel-Version: 1.0
+-Generator: bdist_wheel (0.35.1)
++Generator: bdist_wheel (0.36.2)
+ Root-Is-Purelib: true
+ Tag: py2-none-any
+ Tag: py3-none-any
+diff --git a/third_party/python/six/six-1.13.0.dist-info/top_level.txt b/third_party/python/six/six-1.16.0.dist-info/top_level.txt
+similarity index 100%
+rename from third_party/python/six/six-1.13.0.dist-info/top_level.txt
+rename to third_party/python/six/six-1.16.0.dist-info/top_level.txt
+diff --git a/third_party/python/six/six.py b/third_party/python/six/six.py
+index 357e624abc6c9..4e15675d8b5ca 100644
+--- a/third_party/python/six/six.py
++++ b/third_party/python/six/six.py
+@@ -1,4 +1,4 @@
+-# Copyright (c) 2010-2019 Benjamin Peterson
++# Copyright (c) 2010-2020 Benjamin Peterson
+ #
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
+ # of this software and associated documentation files (the "Software"), to deal
+@@ -29,7 +29,7 @@
+ import types
+ 
+ __author__ = "Benjamin Peterson <benjamin@python.org>"
+-__version__ = "1.13.0"
++__version__ = "1.16.0"
+ 
+ 
+ # Useful for very coarse version differentiation.
+@@ -71,6 +71,11 @@ def __len__(self):
+             MAXSIZE = int((1 << 63) - 1)
+         del X
+ 
++if PY34:
++    from importlib.util import spec_from_loader
++else:
++    spec_from_loader = None
++
+ 
+ def _add_doc(func, doc):
+     """Add documentation to a function."""
+@@ -186,6 +191,11 @@ def find_module(self, fullname, path=None):
+             return self
+         return None
+ 
++    def find_spec(self, fullname, path, target=None):
++        if fullname in self.known_modules:
++            return spec_from_loader(fullname, self)
++        return None
++
+     def __get_module(self, fullname):
+         try:
+             return self.known_modules[fullname]
+@@ -223,6 +233,12 @@ def get_code(self, fullname):
+         return None
+     get_source = get_code  # same as get_code
+ 
++    def create_module(self, spec):
++        return self.load_module(spec.name)
++
++    def exec_module(self, module):
++        pass
++
+ _importer = _SixMetaPathImporter(__name__)
+ 
+ 
+@@ -259,7 +275,7 @@ class _MovedItems(_LazyModule):
+     MovedModule("copyreg", "copy_reg"),
+     MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+     MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
+-    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
++    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"),
+     MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+     MovedModule("http_cookies", "Cookie", "http.cookies"),
+     MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+@@ -644,9 +660,11 @@ def u(s):
+     if sys.version_info[1] <= 1:
+         _assertRaisesRegex = "assertRaisesRegexp"
+         _assertRegex = "assertRegexpMatches"
++        _assertNotRegex = "assertNotRegexpMatches"
+     else:
+         _assertRaisesRegex = "assertRaisesRegex"
+         _assertRegex = "assertRegex"
++        _assertNotRegex = "assertNotRegex"
+ else:
+     def b(s):
+         return s
+@@ -668,6 +686,7 @@ def indexbytes(buf, i):
+     _assertCountEqual = "assertItemsEqual"
+     _assertRaisesRegex = "assertRaisesRegexp"
+     _assertRegex = "assertRegexpMatches"
++    _assertNotRegex = "assertNotRegexpMatches"
+ _add_doc(b, """Byte literal""")
+ _add_doc(u, """Text literal""")
+ 
+@@ -684,6 +703,10 @@ def assertRegex(self, *args, **kwargs):
+     return getattr(self, _assertRegex)(*args, **kwargs)
+ 
+ 
++def assertNotRegex(self, *args, **kwargs):
++    return getattr(self, _assertNotRegex)(*args, **kwargs)
++
++
+ if PY3:
+     exec_ = getattr(moves.builtins, "exec")
+ 
+@@ -719,16 +742,7 @@ def exec_(_code_, _globs_=None, _locs_=None):
+ """)
+ 
+ 
+-if sys.version_info[:2] == (3, 2):
+-    exec_("""def raise_from(value, from_value):
+-    try:
+-        if from_value is None:
+-            raise value
+-        raise value from from_value
+-    finally:
+-        value = None
+-""")
+-elif sys.version_info[:2] > (3, 2):
++if sys.version_info[:2] > (3,):
+     exec_("""def raise_from(value, from_value):
+     try:
+         raise value from from_value
+@@ -808,13 +822,33 @@ def print_(*args, **kwargs):
+ _add_doc(reraise, """Reraise an exception.""")
+ 
+ if sys.version_info[0:2] < (3, 4):
++    # This does exactly the same what the :func:`py3:functools.update_wrapper`
++    # function does on Python versions after 3.2. It sets the ``__wrapped__``
++    # attribute on ``wrapper`` object and it doesn't raise an error if any of
++    # the attributes mentioned in ``assigned`` and ``updated`` are missing on
++    # ``wrapped`` object.
++    def _update_wrapper(wrapper, wrapped,
++                        assigned=functools.WRAPPER_ASSIGNMENTS,
++                        updated=functools.WRAPPER_UPDATES):
++        for attr in assigned:
++            try:
++                value = getattr(wrapped, attr)
++            except AttributeError:
++                continue
++            else:
++                setattr(wrapper, attr, value)
++        for attr in updated:
++            getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
++        wrapper.__wrapped__ = wrapped
++        return wrapper
++    _update_wrapper.__doc__ = functools.update_wrapper.__doc__
++
+     def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+               updated=functools.WRAPPER_UPDATES):
+-        def wrapper(f):
+-            f = functools.wraps(wrapped, assigned, updated)(f)
+-            f.__wrapped__ = wrapped
+-            return f
+-        return wrapper
++        return functools.partial(_update_wrapper, wrapped=wrapped,
++                                 assigned=assigned, updated=updated)
++    wraps.__doc__ = functools.wraps.__doc__
++
+ else:
+     wraps = functools.wraps
+ 
+@@ -872,12 +906,11 @@ def ensure_binary(s, encoding='utf-8', errors='strict'):
+       - `str` -> encoded to `bytes`
+       - `bytes` -> `bytes`
+     """
++    if isinstance(s, binary_type):
++        return s
+     if isinstance(s, text_type):
+         return s.encode(encoding, errors)
+-    elif isinstance(s, binary_type):
+-        return s
+-    else:
+-        raise TypeError("not expecting type '%s'" % type(s))
++    raise TypeError("not expecting type '%s'" % type(s))
+ 
+ 
+ def ensure_str(s, encoding='utf-8', errors='strict'):
+@@ -891,12 +924,15 @@ def ensure_str(s, encoding='utf-8', errors='strict'):
+       - `str` -> `str`
+       - `bytes` -> decoded to `str`
+     """
+-    if not isinstance(s, (text_type, binary_type)):
+-        raise TypeError("not expecting type '%s'" % type(s))
++    # Optimization: Fast return for the common case.
++    if type(s) is str:
++        return s
+     if PY2 and isinstance(s, text_type):
+-        s = s.encode(encoding, errors)
++        return s.encode(encoding, errors)
+     elif PY3 and isinstance(s, binary_type):
+-        s = s.decode(encoding, errors)
++        return s.decode(encoding, errors)
++    elif not isinstance(s, (text_type, binary_type)):
++        raise TypeError("not expecting type '%s'" % type(s))
+     return s
+ 
+ 
+@@ -919,10 +955,9 @@ def ensure_text(s, encoding='utf-8', errors='strict'):
+         raise TypeError("not expecting type '%s'" % type(s))
+ 
+ 
+-
+ def python_2_unicode_compatible(klass):
+     """
+-    A decorator that defines __unicode__ and __str__ methods under Python 2.
++    A class decorator that defines __unicode__ and __str__ methods under Python 2.
+     Under Python 3 it does nothing.
+ 
+     To support Python 2 and 3 with a single code base, define a __str__ method
+diff --git a/third_party/python/urllib3/urllib3-1.26.0.dist-info/RECORD b/third_party/python/urllib3/urllib3-1.26.0.dist-info/RECORD
+deleted file mode 100644
+index ec9088a111a41..0000000000000
+--- a/third_party/python/urllib3/urllib3-1.26.0.dist-info/RECORD
++++ /dev/null
+@@ -1,44 +0,0 @@
+-urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763
+-urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811
+-urllib3/_version.py,sha256=H0vLQ8PY350EPZlZQa8ri0tEjVS-xhGdQOHcU360-0A,63
+-urllib3/connection.py,sha256=BdaUSNpGzO0zq28i9MhOXb6QZspeVdVrYtjnkk2Eqg4,18396
+-urllib3/connectionpool.py,sha256=IKoeuJZY9YAYm0GK4q-MXAhyXW0M_FnvabYaNsDIR-E,37133
+-urllib3/exceptions.py,sha256=lNrKC5J8zeBXIu9SSKSNb7cLi8iXl9ARu9DHD2SflZM,7810
+-urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
+-urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
+-urllib3/poolmanager.py,sha256=whzlX6UTEgODMOCy0ZDMUONRBCz5wyIM8Z9opXAY-Lk,19763
+-urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985
+-urllib3/response.py,sha256=hGhGBh7TkEkh_IQg5C1W_xuPNrgIKv5BUXPyE-q0LuE,28203
+-urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+-urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
+-urllib3/contrib/appengine.py,sha256=7Pxb0tKfDB_LTGPERiswH0qomhDoUUOo5kwybAKLQyE,11010
+-urllib3/contrib/ntlmpool.py,sha256=6I95h1_71fzxmoMSNtY0gB8lnyCoVtP_DpqFGj14fdU,4160
+-urllib3/contrib/pyopenssl.py,sha256=vgh6j52w9xgwq-3R2kfB5M2JblQATJfKAK3lIAc1kSg,16778
+-urllib3/contrib/securetransport.py,sha256=KxGPZk8d4YepWm7Rc-SBt1XrzIfnLKc8JkUVV75XzgE,34286
+-urllib3/contrib/socks.py,sha256=DcRjM2l0rQMIyhYrN6r-tnVkY6ZTDxHJlM8_usAkGCA,7097
+-urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+-urllib3/contrib/_securetransport/bindings.py,sha256=E1_7ScsgOchfxneozbAueK7ziCwF35fna4DuDCYJ9_o,17637
+-urllib3/contrib/_securetransport/low_level.py,sha256=lgIdsSycqfB0Xm5BiJzXGeIKT7ybCQMFPJAgkcwPa1s,13908
+-urllib3/packages/__init__.py,sha256=h4BLhD4tLaBx1adaDtKXfupsgqY0wWLXb_f1_yVlV6A,108
+-urllib3/packages/six.py,sha256=adx4z-eM_D0Vvu0IIqVzFACQ_ux9l64y7DkSEfbxCDs,32536
+-urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+-urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
+-urllib3/packages/ssl_match_hostname/__init__.py,sha256=zppezdEQdpGsYerI6mV6MfUYy495JV4mcOWC_GgbljU,757
+-urllib3/packages/ssl_match_hostname/_implementation.py,sha256=6dZ-q074g7XhsJ27MFCgkct8iVNZB3sMZvKhf-KUVy0,5679
+-urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
+-urllib3/util/connection.py,sha256=21B-LX0c8fkxPDssyHCaK0pCnmrKmhltg5EoouHiAPU,4910
+-urllib3/util/proxy.py,sha256=FGipAEnvZteyldXNjce4DEB7YzwU-a5lep8y5S0qHQg,1604
+-urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
+-urllib3/util/request.py,sha256=NnzaEKQ1Pauw5MFMV6HmgEMHITf0Aua9fQuzi2uZzGc,4123
+-urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
+-urllib3/util/retry.py,sha256=tn168HDMUynFmXRP-uVaLRUOlbTEJikoB1RuZdwfCes,21366
+-urllib3/util/ssl_.py,sha256=cUsmU604z2zAOZcaXDpINXOokQ1RtlJMe96TBDkaJp0,16199
+-urllib3/util/ssltransport.py,sha256=IvGQvs9YWkf4jzfqVjTu_UWjwAUgPn5ActajW8VLz6A,6908
+-urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003
+-urllib3/util/url.py,sha256=LWfLSlI4l2FmUMKfCkElCaW10-0N-sJDT9bxaDZJkjs,13964
+-urllib3/util/wait.py,sha256=3MUKRSAUJDB2tgco7qRUskW0zXGAWYvRRE4Q1_6xlLs,5404
+-urllib3-1.26.0.dist-info/LICENSE.txt,sha256=w3vxhuJ8-dvpYZ5V7f486nswCRzrPaY8fay-Dm13kHs,1115
+-urllib3-1.26.0.dist-info/METADATA,sha256=Wghdt6nLf9HfZHhWj8Dpgz4n9vGRqXYhdIwJRPgki6M,42629
+-urllib3-1.26.0.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
+-urllib3-1.26.0.dist-info/top_level.txt,sha256=EMiXL2sKrTcmrMxIHTqdc3ET54pQI2Y072LexFEemvo,8
+-urllib3-1.26.0.dist-info/RECORD,,
+diff --git a/third_party/python/urllib3/urllib3-1.26.0.dist-info/LICENSE.txt b/third_party/python/urllib3/urllib3-1.26.17.dist-info/LICENSE.txt
+similarity index 100%
+rename from third_party/python/urllib3/urllib3-1.26.0.dist-info/LICENSE.txt
+rename to third_party/python/urllib3/urllib3-1.26.17.dist-info/LICENSE.txt
+diff --git a/third_party/python/urllib3/urllib3-1.26.0.dist-info/METADATA b/third_party/python/urllib3/urllib3-1.26.17.dist-info/METADATA
+similarity index 86%
+rename from third_party/python/urllib3/urllib3-1.26.0.dist-info/METADATA
+rename to third_party/python/urllib3/urllib3-1.26.17.dist-info/METADATA
+index 39869aafada8a..9493faee66c01 100644
+--- a/third_party/python/urllib3/urllib3-1.26.0.dist-info/METADATA
++++ b/third_party/python/urllib3/urllib3-1.26.17.dist-info/METADATA
+@@ -1,6 +1,6 @@
+ Metadata-Version: 2.1
+ Name: urllib3
+-Version: 1.26.0
++Version: 1.26.17
+ Summary: HTTP library with thread-safe connection pooling, file post, and more.
+ Home-page: https://urllib3.readthedocs.io/
+ Author: Andrey Petrov
+@@ -10,7 +10,6 @@ Project-URL: Documentation, https://urllib3.readthedocs.io/
+ Project-URL: Code, https://github.com/urllib3/urllib3
+ Project-URL: Issue tracker, https://github.com/urllib3/urllib3/issues
+ Keywords: urllib httplib threadsafe filepost http https ssl pooling
+-Platform: UNKNOWN
+ Classifier: Environment :: Web Environment
+ Classifier: Intended Audience :: Developers
+ Classifier: License :: OSI Approved :: MIT License
+@@ -19,27 +18,33 @@ Classifier: Programming Language :: Python
+ Classifier: Programming Language :: Python :: 2
+ Classifier: Programming Language :: Python :: 2.7
+ Classifier: Programming Language :: Python :: 3
+-Classifier: Programming Language :: Python :: 3.5
+ Classifier: Programming Language :: Python :: 3.6
+ Classifier: Programming Language :: Python :: 3.7
+ Classifier: Programming Language :: Python :: 3.8
+ Classifier: Programming Language :: Python :: 3.9
++Classifier: Programming Language :: Python :: 3.10
++Classifier: Programming Language :: Python :: 3.11
+ Classifier: Programming Language :: Python :: Implementation :: CPython
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
+ Classifier: Topic :: Internet :: WWW/HTTP
+ Classifier: Topic :: Software Development :: Libraries
+-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4
++Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
+ Description-Content-Type: text/x-rst
++License-File: LICENSE.txt
+ Provides-Extra: brotli
+-Requires-Dist: brotlipy (>=0.6.0) ; extra == 'brotli'
++Requires-Dist: brotlicffi >=0.8.0 ; ((os_name != "nt" or python_version >= "3") and platform_python_implementation != "CPython") and extra == 'brotli'
++Requires-Dist: brotli ==1.0.9 ; (os_name != "nt" and python_version < "3" and platform_python_implementation == "CPython") and extra == 'brotli'
++Requires-Dist: brotlipy >=0.6.0 ; (os_name == "nt" and python_version < "3") and extra == 'brotli'
++Requires-Dist: brotli >=1.0.9 ; (python_version >= "3" and platform_python_implementation == "CPython") and extra == 'brotli'
+ Provides-Extra: secure
+-Requires-Dist: pyOpenSSL (>=0.14) ; extra == 'secure'
+-Requires-Dist: cryptography (>=1.3.4) ; extra == 'secure'
+-Requires-Dist: idna (>=2.0.0) ; extra == 'secure'
++Requires-Dist: pyOpenSSL >=0.14 ; extra == 'secure'
++Requires-Dist: cryptography >=1.3.4 ; extra == 'secure'
++Requires-Dist: idna >=2.0.0 ; extra == 'secure'
+ Requires-Dist: certifi ; extra == 'secure'
++Requires-Dist: urllib3-secure-extra ; extra == 'secure'
+ Requires-Dist: ipaddress ; (python_version == "2.7") and extra == 'secure'
+ Provides-Extra: socks
+-Requires-Dist: PySocks (!=1.5.7,<2.0,>=1.5.6) ; extra == 'socks'
++Requires-Dist: PySocks !=1.5.7,<2.0,>=1.5.6 ; extra == 'socks'
+ 
+ 
+ urllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the
+@@ -78,8 +83,10 @@ urllib3 can be installed with `pip <https://pip.pypa.io>`_::
+ 
+ Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::
+ 
+-    $ git clone git://github.com/urllib3/urllib3.git
+-    $ python setup.py install
++    $ git clone https://github.com/urllib3/urllib3.git
++    $ cd urllib3
++    $ git checkout 1.26.x
++    $ pip install .
+ 
+ 
+ Documentation
+@@ -148,6 +155,152 @@ For Enterprise
+ Changes
+ =======
+ 
++1.26.17 (2023-10-02)
++--------------------
++
++* Added the ``Cookie`` header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via ``Retry.remove_headers_on_redirect``.
++
++
++1.26.16 (2023-05-23)
++--------------------
++
++* Fixed thread-safety issue where accessing a ``PoolManager`` with many distinct origins
++  would cause connection pools to be closed while requests are in progress (`#2954 <https://github.com/urllib3/urllib3/pull/2954>`_)
++
++
++1.26.15 (2023-03-10)
++--------------------
++
++* Fix socket timeout value when ``HTTPConnection`` is reused (`#2645 <https://github.com/urllib3/urllib3/issues/2645>`__)
++* Remove "!" character from the unreserved characters in IPv6 Zone ID parsing
++  (`#2899 <https://github.com/urllib3/urllib3/issues/2899>`__)
++* Fix IDNA handling of '\x80' byte (`#2901 <https://github.com/urllib3/urllib3/issues/2901>`__)
++
++1.26.14 (2023-01-11)
++--------------------
++
++* Fixed parsing of port 0 (zero) returning None, instead of 0. (`#2850 <https://github.com/urllib3/urllib3/issues/2850>`__)
++* Removed deprecated getheaders() calls in contrib module.
++
++1.26.13 (2022-11-23)
++--------------------
++
++* Deprecated the ``HTTPResponse.getheaders()`` and ``HTTPResponse.getheader()`` methods.
++* Fixed an issue where parsing a URL with leading zeroes in the port would be rejected
++  even when the port number after removing the zeroes was valid.
++* Fixed a deprecation warning when using cryptography v39.0.0.
++* Removed the ``<4`` in the ``Requires-Python`` packaging metadata field.
++
++
++1.26.12 (2022-08-22)
++--------------------
++
++* Deprecated the `urllib3[secure]` extra and the `urllib3.contrib.pyopenssl` module.
++  Both will be removed in v2.x. See this `GitHub issue <https://github.com/urllib3/urllib3/issues/2680>`_
++  for justification and info on how to migrate.
++
++
++1.26.11 (2022-07-25)
++--------------------
++
++* Fixed an issue where reading more than 2 GiB in a call to ``HTTPResponse.read`` would
++  raise an ``OverflowError`` on Python 3.9 and earlier.
++
++
++1.26.10 (2022-07-07)
++--------------------
++
++* Removed support for Python 3.5
++* Fixed an issue where a ``ProxyError`` recommending configuring the proxy as HTTP
++  instead of HTTPS could appear even when an HTTPS proxy wasn't configured.
++
++
++1.26.9 (2022-03-16)
++-------------------
++
++* Changed ``urllib3[brotli]`` extra to favor installing Brotli libraries that are still
++  receiving updates like ``brotli`` and ``brotlicffi`` instead of ``brotlipy``.
++  This change does not impact behavior of urllib3, only which dependencies are installed.
++* Fixed a socket leaking when ``HTTPSConnection.connect()`` raises an exception.
++* Fixed ``server_hostname`` being forwarded from ``PoolManager`` to ``HTTPConnectionPool``
++  when requesting an HTTP URL. Should only be forwarded when requesting an HTTPS URL.
++
++
++1.26.8 (2022-01-07)
++-------------------
++
++* Added extra message to ``urllib3.exceptions.ProxyError`` when urllib3 detects that
++  a proxy is configured to use HTTPS but the proxy itself appears to only use HTTP.
++* Added a mention of the size of the connection pool when discarding a connection due to the pool being full.
++* Added explicit support for Python 3.11.
++* Deprecated the ``Retry.MAX_BACKOFF`` class property in favor of ``Retry.DEFAULT_MAX_BACKOFF``
++  to better match the rest of the default parameter names. ``Retry.MAX_BACKOFF`` is removed in v2.0.
++* Changed location of the vendored ``ssl.match_hostname`` function from ``urllib3.packages.ssl_match_hostname``
++  to ``urllib3.util.ssl_match_hostname`` to ensure Python 3.10+ compatibility after being repackaged
++  by downstream distributors.
++* Fixed absolute imports, all imports are now relative.
++
++
++1.26.7 (2021-09-22)
++-------------------
++
++* Fixed a bug with HTTPS hostname verification involving IP addresses and lack
++  of SNI. (Issue #2400)
++* Fixed a bug where IPv6 braces weren't stripped during certificate hostname
++  matching. (Issue #2240)
++
++
++1.26.6 (2021-06-25)
++-------------------
++
++* Deprecated the ``urllib3.contrib.ntlmpool`` module. urllib3 is not able to support
++  it properly due to `reasons listed in this issue <https://github.com/urllib3/urllib3/issues/2282>`_.
++  If you are a user of this module please leave a comment.
++* Changed ``HTTPConnection.request_chunked()`` to not erroneously emit multiple
++  ``Transfer-Encoding`` headers in the case that one is already specified.
++* Fixed typo in deprecation message to recommend ``Retry.DEFAULT_ALLOWED_METHODS``.
++
++
++1.26.5 (2021-05-26)
++-------------------
++
++* Fixed deprecation warnings emitted in Python 3.10.
++* Updated vendored ``six`` library to 1.16.0.
++* Improved performance of URL parser when splitting
++  the authority component.
++
++
++1.26.4 (2021-03-15)
++-------------------
++
++* Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
++  during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.
++
++
++1.26.3 (2021-01-26)
++-------------------
++
++* Fixed bytes and string comparison issue with headers (Pull #2141)
++
++* Changed ``ProxySchemeUnknown`` error message to be
++  more actionable if the user supplies a proxy URL without
++  a scheme. (Pull #2107)
++
++
++1.26.2 (2020-11-12)
++-------------------
++
++* Fixed an issue where ``wrap_socket`` and ``CERT_REQUIRED`` wouldn't
++  be imported properly on Python 2.7.8 and earlier (Pull #2052)
++
++
++1.26.1 (2020-11-11)
++-------------------
++
++* Fixed an issue where two ``User-Agent`` headers would be sent if a
++  ``User-Agent`` header key is passed as ``bytes`` (Pull #2047)
++
++
+ 1.26.0 (2020-11-10)
+ -------------------
+ 
+@@ -1331,5 +1484,3 @@ Changes
+ ----------------
+ 
+ * First release.
+-
+-
+diff --git a/third_party/python/urllib3/urllib3-1.26.17.dist-info/RECORD b/third_party/python/urllib3/urllib3-1.26.17.dist-info/RECORD
+new file mode 100644
+index 0000000000000..1afc6580589c0
+--- /dev/null
++++ b/third_party/python/urllib3/urllib3-1.26.17.dist-info/RECORD
+@@ -0,0 +1,44 @@
++urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
++urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811
++urllib3/_version.py,sha256=azoM7M7BUADl2kBhMVR6PPf2GhBDI90me1fcnzTwdcw,64
++urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300
++urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990
++urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
++urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
++urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
++urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752
++urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
++urllib3/response.py,sha256=UPgLmnHj4z71ZnH8ivYOyncATifTOw9FQukUqDnckCc,30761
++urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
++urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
++urllib3/contrib/appengine.py,sha256=6IBW6lPOoVUxASPwtn6IH1AATe5DK3lLJCfwyWlLKAE,11012
++urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
++urllib3/contrib/pyopenssl.py,sha256=4AJAlo9NmjWofY4dJwRa4kbZuRuHfNJxu8Pv6yQk1ss,17055
++urllib3/contrib/securetransport.py,sha256=QOhVbWrFQTKbmV-vtyG69amekkKVxXkdjk9oymaO0Ag,34416
++urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
++urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
++urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
++urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
++urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
++urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
++urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
++urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
++urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
++urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
++urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
++urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
++urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
++urllib3/util/request.py,sha256=fWiAaa8pwdLLIqoTLBxCC2e4ed80muzKU3e3HWWTzFQ,4225
++urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
++urllib3/util/retry.py,sha256=Z6WEf518eTOXP5jr5QSQ9gqJI0DVYt3Xs3EKnYaTmus,22013
++urllib3/util/ssl_.py,sha256=c0sYiSC6272r6uPkxQpo5rYPP9QC1eR6oI7004gYqZo,17165
++urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
++urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
++urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
++urllib3/util/url.py,sha256=kMxL1k0d-aQm_iZDw_zMmnyYyjrIA_DbsMy3cm3V55M,14279
++urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
++urllib3-1.26.17.dist-info/LICENSE.txt,sha256=w3vxhuJ8-dvpYZ5V7f486nswCRzrPaY8fay-Dm13kHs,1115
++urllib3-1.26.17.dist-info/METADATA,sha256=swEiQKmb2m5Vl4fygmy4aLSzZjxDjD8q2-_XzuhO9pA,48743
++urllib3-1.26.17.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
++urllib3-1.26.17.dist-info/top_level.txt,sha256=EMiXL2sKrTcmrMxIHTqdc3ET54pQI2Y072LexFEemvo,8
++urllib3-1.26.17.dist-info/RECORD,,
+diff --git a/third_party/python/six/six-1.13.0.dist-info/WHEEL b/third_party/python/urllib3/urllib3-1.26.17.dist-info/WHEEL
+similarity index 70%
+rename from third_party/python/six/six-1.13.0.dist-info/WHEEL
+rename to third_party/python/urllib3/urllib3-1.26.17.dist-info/WHEEL
+index 8b701e93c2315..c34f1162ef9a5 100644
+--- a/third_party/python/six/six-1.13.0.dist-info/WHEEL
++++ b/third_party/python/urllib3/urllib3-1.26.17.dist-info/WHEEL
+@@ -1,5 +1,5 @@
+ Wheel-Version: 1.0
+-Generator: bdist_wheel (0.33.6)
++Generator: bdist_wheel (0.41.2)
+ Root-Is-Purelib: true
+ Tag: py2-none-any
+ Tag: py3-none-any
+diff --git a/third_party/python/urllib3/urllib3-1.26.0.dist-info/top_level.txt b/third_party/python/urllib3/urllib3-1.26.17.dist-info/top_level.txt
+similarity index 100%
+rename from third_party/python/urllib3/urllib3-1.26.0.dist-info/top_level.txt
+rename to third_party/python/urllib3/urllib3-1.26.17.dist-info/top_level.txt
+diff --git a/third_party/python/urllib3/urllib3/__init__.py b/third_party/python/urllib3/urllib3/__init__.py
+index fe86b59d782bd..c6fa38212fb55 100644
+--- a/third_party/python/urllib3/urllib3/__init__.py
++++ b/third_party/python/urllib3/urllib3/__init__.py
+@@ -19,6 +19,23 @@
+ from .util.timeout import Timeout
+ from .util.url import get_host
+ 
++# === NOTE TO REPACKAGERS AND VENDORS ===
++# Please delete this block, this logic is only
++# for urllib3 being distributed via PyPI.
++# See: https://github.com/urllib3/urllib3/issues/2680
++try:
++    import urllib3_secure_extra  # type: ignore # noqa: F401
++except ImportError:
++    pass
++else:
++    warnings.warn(
++        "'urllib3[secure]' extra is deprecated and will be removed "
++        "in a future release of urllib3 2.x. Read more in this issue: "
++        "https://github.com/urllib3/urllib3/issues/2680",
++        category=DeprecationWarning,
++        stacklevel=2,
++    )
++
+ __author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
+ __license__ = "MIT"
+ __version__ = __version__
+diff --git a/third_party/python/urllib3/urllib3/_version.py b/third_party/python/urllib3/urllib3/_version.py
+index cee465f88a931..cad75fb5df82a 100644
+--- a/third_party/python/urllib3/urllib3/_version.py
++++ b/third_party/python/urllib3/urllib3/_version.py
+@@ -1,2 +1,2 @@
+ # This file is protected via CODEOWNERS
+-__version__ = "1.26.0"
++__version__ = "1.26.17"
+diff --git a/third_party/python/urllib3/urllib3/connection.py b/third_party/python/urllib3/urllib3/connection.py
+index 52487417c946b..54b96b19154cc 100644
+--- a/third_party/python/urllib3/urllib3/connection.py
++++ b/third_party/python/urllib3/urllib3/connection.py
+@@ -43,6 +43,7 @@ class BrokenPipeError(Exception):
+         pass
+ 
+ 
++from ._collections import HTTPHeaderDict  # noqa (historical, removed in v2)
+ from ._version import __version__
+ from .exceptions import (
+     ConnectTimeoutError,
+@@ -50,15 +51,16 @@ class BrokenPipeError(Exception):
+     SubjectAltNameWarning,
+     SystemTimeWarning,
+ )
+-from .packages.ssl_match_hostname import CertificateError, match_hostname
+ from .util import SKIP_HEADER, SKIPPABLE_HEADERS, connection
+ from .util.ssl_ import (
+     assert_fingerprint,
+     create_urllib3_context,
++    is_ipaddress,
+     resolve_cert_reqs,
+     resolve_ssl_version,
+     ssl_wrap_socket,
+ )
++from .util.ssl_match_hostname import CertificateError, match_hostname
+ 
+ log = logging.getLogger(__name__)
+ 
+@@ -66,7 +68,7 @@ class BrokenPipeError(Exception):
+ 
+ # When it comes time to update this value as a part of regular maintenance
+ # (ie test_recent_date is failing) update it to ~6 months before the current date.
+-RECENT_DATE = datetime.date(2019, 1, 1)
++RECENT_DATE = datetime.date(2022, 1, 1)
+ 
+ _CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]")
+ 
+@@ -106,6 +108,10 @@ class HTTPConnection(_HTTPConnection, object):
+     #: Whether this connection verifies the host's certificate.
+     is_verified = False
+ 
++    #: Whether this proxy connection (if used) verifies the proxy host's
++    #: certificate.
++    proxy_is_verified = None
++
+     def __init__(self, *args, **kw):
+         if not six.PY2:
+             kw.pop("strict", None)
+@@ -200,7 +206,7 @@ def connect(self):
+         self._prepare_conn(conn)
+ 
+     def putrequest(self, method, url, *args, **kwargs):
+-        """"""
++        """ """
+         # Empty docstring because the indentation of CPython's implementation
+         # is broken but we don't want this method in our documentation.
+         match = _CONTAINS_CONTROL_CHAR_RE.search(method)
+@@ -213,8 +219,8 @@ def putrequest(self, method, url, *args, **kwargs):
+         return _HTTPConnection.putrequest(self, method, url, *args, **kwargs)
+ 
+     def putheader(self, header, *values):
+-        """"""
+-        if SKIP_HEADER not in values:
++        """ """
++        if not any(isinstance(v, str) and v == SKIP_HEADER for v in values):
+             _HTTPConnection.putheader(self, header, *values)
+         elif six.ensure_str(header.lower()) not in SKIPPABLE_HEADERS:
+             raise ValueError(
+@@ -223,12 +229,17 @@ def putheader(self, header, *values):
+             )
+ 
+     def request(self, method, url, body=None, headers=None):
++        # Update the inner socket's timeout value to send the request.
++        # This only triggers if the connection is re-used.
++        if getattr(self, "sock", None) is not None:
++            self.sock.settimeout(self.timeout)
++
+         if headers is None:
+             headers = {}
+         else:
+             # Avoid modifying the headers passed into .request()
+             headers = headers.copy()
+-        if "user-agent" not in (k.lower() for k in headers):
++        if "user-agent" not in (six.ensure_str(k.lower()) for k in headers):
+             headers["User-Agent"] = _get_default_user_agent()
+         super(HTTPConnection, self).request(method, url, body=body, headers=headers)
+ 
+@@ -248,7 +259,7 @@ def request_chunked(self, method, url, body=None, headers=None):
+             self.putheader("User-Agent", _get_default_user_agent())
+         for header, value in headers.items():
+             self.putheader(header, value)
+-        if "transfer-encoding" not in headers:
++        if "transfer-encoding" not in header_keys:
+             self.putheader("Transfer-Encoding", "chunked")
+         self.endheaders()
+ 
+@@ -349,17 +360,15 @@ def set_cert(
+ 
+     def connect(self):
+         # Add certificate verification
+-        conn = self._new_conn()
++        self.sock = conn = self._new_conn()
+         hostname = self.host
+         tls_in_tls = False
+ 
+         if self._is_using_tunnel():
+             if self.tls_in_tls_required:
+-                conn = self._connect_tls_proxy(hostname, conn)
++                self.sock = conn = self._connect_tls_proxy(hostname, conn)
+                 tls_in_tls = True
+ 
+-            self.sock = conn
+-
+             # Calls self._set_hostport(), so self.host is
+             # self._tunnel_host below.
+             self._tunnel()
+@@ -492,7 +501,7 @@ def _connect_tls_proxy(self, hostname, conn):
+ 
+         # If no cert was provided, use only the default options for server
+         # certificate validation
+-        return ssl_wrap_socket(
++        socket = ssl_wrap_socket(
+             sock=conn,
+             ca_certs=self.ca_certs,
+             ca_cert_dir=self.ca_cert_dir,
+@@ -501,8 +510,37 @@ def _connect_tls_proxy(self, hostname, conn):
+             ssl_context=ssl_context,
+         )
+ 
++        if ssl_context.verify_mode != ssl.CERT_NONE and not getattr(
++            ssl_context, "check_hostname", False
++        ):
++            # While urllib3 attempts to always turn off hostname matching from
++            # the TLS library, this cannot always be done. So we check whether
++            # the TLS Library still thinks it's matching hostnames.
++            cert = socket.getpeercert()
++            if not cert.get("subjectAltName", ()):
++                warnings.warn(
++                    (
++                        "Certificate for {0} has no `subjectAltName`, falling back to check for a "
++                        "`commonName` for now. This feature is being removed by major browsers and "
++                        "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 "
++                        "for details.)".format(hostname)
++                    ),
++                    SubjectAltNameWarning,
++                )
++            _match_hostname(cert, hostname)
++
++        self.proxy_is_verified = ssl_context.verify_mode == ssl.CERT_REQUIRED
++        return socket
++
+ 
+ def _match_hostname(cert, asserted_hostname):
++    # Our upstream implementation of ssl.match_hostname()
++    # only applies this normalization to IP addresses so it doesn't
++    # match DNS SANs so we do the same thing!
++    stripped_hostname = asserted_hostname.strip("u[]")
++    if is_ipaddress(stripped_hostname):
++        asserted_hostname = stripped_hostname
++
+     try:
+         match_hostname(cert, asserted_hostname)
+     except CertificateError as e:
+diff --git a/third_party/python/urllib3/urllib3/connectionpool.py b/third_party/python/urllib3/urllib3/connectionpool.py
+index 4708c5bfc7862..96844d933745d 100644
+--- a/third_party/python/urllib3/urllib3/connectionpool.py
++++ b/third_party/python/urllib3/urllib3/connectionpool.py
+@@ -2,6 +2,7 @@
+ 
+ import errno
+ import logging
++import re
+ import socket
+ import sys
+ import warnings
+@@ -35,7 +36,6 @@
+ )
+ from .packages import six
+ from .packages.six.moves import queue
+-from .packages.ssl_match_hostname import CertificateError
+ from .request import RequestMethods
+ from .response import HTTPResponse
+ from .util.connection import is_connection_dropped
+@@ -44,11 +44,19 @@
+ from .util.request import set_file_position
+ from .util.response import assert_header_parsing
+ from .util.retry import Retry
++from .util.ssl_match_hostname import CertificateError
+ from .util.timeout import Timeout
+ from .util.url import Url, _encode_target
+ from .util.url import _normalize_host as normalize_host
+ from .util.url import get_host, parse_url
+ 
++try:  # Platform-specific: Python 3
++    import weakref
++
++    weakref_finalize = weakref.finalize
++except AttributeError:  # Platform-specific: Python 2
++    from .packages.backports.weakref_finalize import weakref_finalize
++
+ xrange = six.moves.xrange
+ 
+ log = logging.getLogger(__name__)
+@@ -219,6 +227,16 @@ def __init__(
+             self.conn_kw["proxy"] = self.proxy
+             self.conn_kw["proxy_config"] = self.proxy_config
+ 
++        # Do not pass 'self' as callback to 'finalize'.
++        # Then the 'finalize' would keep an endless living (leak) to self.
++        # By just passing a reference to the pool allows the garbage collector
++        # to free self if nobody else has a reference to it.
++        pool = self.pool
++
++        # Close all the HTTPConnections in the pool before the
++        # HTTPConnectionPool object is garbage collected.
++        weakref_finalize(self, _close_pool_connections, pool)
++
+     def _new_conn(self):
+         """
+         Return a fresh :class:`HTTPConnection`.
+@@ -301,8 +319,11 @@ def _put_conn(self, conn):
+             pass
+         except queue.Full:
+             # This should never happen if self.block == True
+-            log.warning("Connection pool is full, discarding connection: %s", self.host)
+-
++            log.warning(
++                "Connection pool is full, discarding connection: %s. Connection pool size: %s",
++                self.host,
++                self.pool.qsize(),
++            )
+         # Connection never got put back into the pool, close it.
+         if conn:
+             conn.close()
+@@ -318,7 +339,7 @@ def _prepare_proxy(self, conn):
+         pass
+ 
+     def _get_timeout(self, timeout):
+-        """ Helper that always returns a :class:`urllib3.util.Timeout` """
++        """Helper that always returns a :class:`urllib3.util.Timeout`"""
+         if timeout is _Default:
+             return self.timeout.clone()
+ 
+@@ -375,7 +396,7 @@ def _make_request(
+ 
+         timeout_obj = self._get_timeout(timeout)
+         timeout_obj.start_connect()
+-        conn.timeout = timeout_obj.connect_timeout
++        conn.timeout = Timeout.resolve_default_timeout(timeout_obj.connect_timeout)
+ 
+         # Trigger any extra validation we need to do.
+         try:
+@@ -485,14 +506,8 @@ def close(self):
+         # Disable access to the pool
+         old_pool, self.pool = self.pool, None
+ 
+-        try:
+-            while True:
+-                conn = old_pool.get(block=False)
+-                if conn:
+-                    conn.close()
+-
+-        except queue.Empty:
+-            pass  # Done.
++        # Close all the HTTPConnections in the pool.
++        _close_pool_connections(old_pool)
+ 
+     def is_same_host(self, url):
+         """
+@@ -745,7 +760,35 @@ def urlopen(
+             # Discard the connection for these exceptions. It will be
+             # replaced during the next _get_conn() call.
+             clean_exit = False
+-            if isinstance(e, (BaseSSLError, CertificateError)):
++
++            def _is_ssl_error_message_from_http_proxy(ssl_error):
++                # We're trying to detect the message 'WRONG_VERSION_NUMBER' but
++                # SSLErrors are kinda all over the place when it comes to the message,
++                # so we try to cover our bases here!
++                message = " ".join(re.split("[^a-z]", str(ssl_error).lower()))
++                return (
++                    "wrong version number" in message or "unknown protocol" in message
++                )
++
++            # Try to detect a common user error with proxies which is to
++            # set an HTTP proxy to be HTTPS when it should be 'http://'
++            # (ie {'http': 'http://proxy', 'https': 'https://proxy'})
++            # Instead we add a nice error message and point to a URL.
++            if (
++                isinstance(e, BaseSSLError)
++                and self.proxy
++                and _is_ssl_error_message_from_http_proxy(e)
++                and conn.proxy
++                and conn.proxy.scheme == "https"
++            ):
++                e = ProxyError(
++                    "Your proxy appears to only use HTTP and not HTTPS, "
++                    "try changing your proxy URL to be HTTP. See: "
++                    "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
++                    "#https-proxy-error-http-proxy",
++                    SSLError(e),
++                )
++            elif isinstance(e, (BaseSSLError, CertificateError)):
+                 e = SSLError(e)
+             elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy:
+                 e = ProxyError("Cannot connect to proxy.", e)
+@@ -830,7 +873,7 @@ def urlopen(
+             )
+ 
+         # Check if we should retry the HTTP response.
+-        has_retry_after = bool(response.getheader("Retry-After"))
++        has_retry_after = bool(response.headers.get("Retry-After"))
+         if retries.is_retry(method, response.status, has_retry_after):
+             try:
+                 retries = retries.increment(method, url, response=response, _pool=self)
+@@ -1014,12 +1057,23 @@ def _validate_conn(self, conn):
+                 (
+                     "Unverified HTTPS request is being made to host '%s'. "
+                     "Adding certificate verification is strongly advised. See: "
+-                    "https://urllib3.readthedocs.io/en/latest/advanced-usage.html"
++                    "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
+                     "#ssl-warnings" % conn.host
+                 ),
+                 InsecureRequestWarning,
+             )
+ 
++        if getattr(conn, "proxy_is_verified", None) is False:
++            warnings.warn(
++                (
++                    "Unverified HTTPS connection done to an HTTPS proxy. "
++                    "Adding certificate verification is strongly advised. See: "
++                    "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
++                    "#ssl-warnings"
++                ),
++                InsecureRequestWarning,
++            )
++
+ 
+ def connection_from_url(url, **kw):
+     """
+@@ -1065,3 +1119,14 @@ def _normalize_host(host, scheme):
+     if host.startswith("[") and host.endswith("]"):
+         host = host[1:-1]
+     return host
++
++
++def _close_pool_connections(pool):
++    """Drains a queue of connections and closes each one."""
++    try:
++        while True:
++            conn = pool.get(block=False)
++            if conn:
++                conn.close()
++    except queue.Empty:
++        pass  # Done.
+diff --git a/third_party/python/urllib3/urllib3/contrib/_securetransport/bindings.py b/third_party/python/urllib3/urllib3/contrib/_securetransport/bindings.py
+index 11524d400bab2..264d564dbda67 100644
+--- a/third_party/python/urllib3/urllib3/contrib/_securetransport/bindings.py
++++ b/third_party/python/urllib3/urllib3/contrib/_securetransport/bindings.py
+@@ -48,7 +48,7 @@
+ )
+ from ctypes.util import find_library
+ 
+-from urllib3.packages.six import raise_from
++from ...packages.six import raise_from
+ 
+ if platform.system() != "Darwin":
+     raise ImportError("Only macOS is supported")
+diff --git a/third_party/python/urllib3/urllib3/contrib/_securetransport/low_level.py b/third_party/python/urllib3/urllib3/contrib/_securetransport/low_level.py
+index ed8120190c06f..fa0b245d279e9 100644
+--- a/third_party/python/urllib3/urllib3/contrib/_securetransport/low_level.py
++++ b/third_party/python/urllib3/urllib3/contrib/_securetransport/low_level.py
+@@ -188,6 +188,7 @@ def _cert_array_from_pem(pem_bundle):
+         # We only want to do that if an error occurs: otherwise, the caller
+         # should free.
+         CoreFoundation.CFRelease(cert_array)
++        raise
+ 
+     return cert_array
+ 
+diff --git a/third_party/python/urllib3/urllib3/contrib/appengine.py b/third_party/python/urllib3/urllib3/contrib/appengine.py
+index aa64a0914c601..a5a6d91035f0a 100644
+--- a/third_party/python/urllib3/urllib3/contrib/appengine.py
++++ b/third_party/python/urllib3/urllib3/contrib/appengine.py
+@@ -111,7 +111,7 @@ def __init__(
+         warnings.warn(
+             "urllib3 is using URLFetch on Google App Engine sandbox instead "
+             "of sockets. To use sockets directly instead of URLFetch see "
+-            "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.",
++            "https://urllib3.readthedocs.io/en/1.26.x/reference/urllib3.contrib.html.",
+             AppEnginePlatformWarning,
+         )
+ 
+@@ -224,7 +224,7 @@ def urlopen(
+                 )
+ 
+         # Check if we should retry the HTTP response.
+-        has_retry_after = bool(http_response.getheader("Retry-After"))
++        has_retry_after = bool(http_response.headers.get("Retry-After"))
+         if retries.is_retry(method, http_response.status, has_retry_after):
+             retries = retries.increment(method, url, response=http_response, _pool=self)
+             log.debug("Retry: %s", url)
+diff --git a/third_party/python/urllib3/urllib3/contrib/ntlmpool.py b/third_party/python/urllib3/urllib3/contrib/ntlmpool.py
+index b2df45dcf6065..471665754e9f1 100644
+--- a/third_party/python/urllib3/urllib3/contrib/ntlmpool.py
++++ b/third_party/python/urllib3/urllib3/contrib/ntlmpool.py
+@@ -5,6 +5,7 @@
+ """
+ from __future__ import absolute_import
+ 
++import warnings
+ from logging import getLogger
+ 
+ from ntlm import ntlm
+@@ -12,6 +13,14 @@
+ from .. import HTTPSConnectionPool
+ from ..packages.six.moves.http_client import HTTPSConnection
+ 
++warnings.warn(
++    "The 'urllib3.contrib.ntlmpool' module is deprecated and will be removed "
++    "in urllib3 v2.0 release, urllib3 is not able to support it properly due "
++    "to reasons listed in issue: https://github.com/urllib3/urllib3/issues/2282. "
++    "If you are a user of this module please comment in the mentioned issue.",
++    DeprecationWarning,
++)
++
+ log = getLogger(__name__)
+ 
+ 
+@@ -60,7 +69,7 @@ def _new_conn(self):
+         log.debug("Request headers: %s", headers)
+         conn.request("GET", self.authurl, None, headers)
+         res = conn.getresponse()
+-        reshdr = dict(res.getheaders())
++        reshdr = dict(res.headers)
+         log.debug("Response status: %s %s", res.status, res.reason)
+         log.debug("Response headers: %s", reshdr)
+         log.debug("Response data: %s [...]", res.read(100))
+@@ -92,7 +101,7 @@ def _new_conn(self):
+         conn.request("GET", self.authurl, None, headers)
+         res = conn.getresponse()
+         log.debug("Response status: %s %s", res.status, res.reason)
+-        log.debug("Response headers: %s", dict(res.getheaders()))
++        log.debug("Response headers: %s", dict(res.headers))
+         log.debug("Response data: %s [...]", res.read()[:100])
+         if res.status != 200:
+             if res.status == 401:
+diff --git a/third_party/python/urllib3/urllib3/contrib/pyopenssl.py b/third_party/python/urllib3/urllib3/contrib/pyopenssl.py
+index 0cabab1aed14a..1ed214b1d78fc 100644
+--- a/third_party/python/urllib3/urllib3/contrib/pyopenssl.py
++++ b/third_party/python/urllib3/urllib3/contrib/pyopenssl.py
+@@ -47,10 +47,10 @@
+ """
+ from __future__ import absolute_import
+ 
++import OpenSSL.crypto
+ import OpenSSL.SSL
+ from cryptography import x509
+ from cryptography.hazmat.backends.openssl import backend as openssl_backend
+-from cryptography.hazmat.backends.openssl.x509 import _Certificate
+ 
+ try:
+     from cryptography.x509 import UnsupportedExtension
+@@ -73,9 +73,19 @@ class UnsupportedExtension(Exception):
+ import logging
+ import ssl
+ import sys
++import warnings
+ 
+ from .. import util
+ from ..packages import six
++from ..util.ssl_ import PROTOCOL_TLS_CLIENT
++
++warnings.warn(
++    "'urllib3.contrib.pyopenssl' module is deprecated and will be removed "
++    "in a future release of urllib3 2.x. Read more in this issue: "
++    "https://github.com/urllib3/urllib3/issues/2680",
++    category=DeprecationWarning,
++    stacklevel=2,
++)
+ 
+ __all__ = ["inject_into_urllib3", "extract_from_urllib3"]
+ 
+@@ -85,6 +95,7 @@ class UnsupportedExtension(Exception):
+ # Map from urllib3 to PyOpenSSL compatible parameter-values.
+ _openssl_versions = {
+     util.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD,
++    PROTOCOL_TLS_CLIENT: OpenSSL.SSL.SSLv23_METHOD,
+     ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
+ }
+ 
+@@ -217,9 +228,8 @@ def get_subj_alt_name(peer_cert):
+     if hasattr(peer_cert, "to_cryptography"):
+         cert = peer_cert.to_cryptography()
+     else:
+-        # This is technically using private APIs, but should work across all
+-        # relevant versions before PyOpenSSL got a proper API for this.
+-        cert = _Certificate(openssl_backend, peer_cert._x509)
++        der = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, peer_cert)
++        cert = x509.load_der_x509_certificate(der, openssl_backend)
+ 
+     # We want to find the SAN extension. Ask Cryptography to locate it (it's
+     # faster than looping in Python)
+@@ -404,7 +414,6 @@ def makefile(self, mode, bufsize=-1):
+         self._makefile_refs += 1
+         return _fileobject(self, mode, bufsize, close=True)
+ 
+-
+ else:  # Platform-specific: Python 3
+     makefile = backport_makefile
+ 
+diff --git a/third_party/python/urllib3/urllib3/contrib/securetransport.py b/third_party/python/urllib3/urllib3/contrib/securetransport.py
+index ab092de67a57c..6c46a3b9f0375 100644
+--- a/third_party/python/urllib3/urllib3/contrib/securetransport.py
++++ b/third_party/python/urllib3/urllib3/contrib/securetransport.py
+@@ -67,6 +67,7 @@
+ import six
+ 
+ from .. import util
++from ..util.ssl_ import PROTOCOL_TLS_CLIENT
+ from ._securetransport.bindings import CoreFoundation, Security, SecurityConst
+ from ._securetransport.low_level import (
+     _assert_no_error,
+@@ -154,7 +155,8 @@
+ # TLSv1 and a high of TLSv1.2. For everything else, we pin to that version.
+ # TLSv1 to 1.2 are supported on macOS 10.8+
+ _protocol_to_min_max = {
+-    util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12)
++    util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12),
++    PROTOCOL_TLS_CLIENT: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12),
+ }
+ 
+ if hasattr(ssl, "PROTOCOL_SSLv2"):
+@@ -768,7 +770,6 @@ def makefile(self, mode, bufsize=-1):
+         self._makefile_refs += 1
+         return _fileobject(self, mode, bufsize, close=True)
+ 
+-
+ else:  # Platform-specific: Python 3
+ 
+     def makefile(self, mode="r", buffering=None, *args, **kwargs):
+diff --git a/third_party/python/urllib3/urllib3/contrib/socks.py b/third_party/python/urllib3/urllib3/contrib/socks.py
+index 93df8325d59c4..c326e80dd1174 100644
+--- a/third_party/python/urllib3/urllib3/contrib/socks.py
++++ b/third_party/python/urllib3/urllib3/contrib/socks.py
+@@ -51,7 +51,7 @@
+         (
+             "SOCKS support in urllib3 requires the installation of optional "
+             "dependencies: specifically, PySocks.  For more information, see "
+-            "https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies"
++            "https://urllib3.readthedocs.io/en/1.26.x/contrib.html#socks-proxies"
+         ),
+         DependencyWarning,
+     )
+diff --git a/third_party/python/urllib3/urllib3/exceptions.py b/third_party/python/urllib3/urllib3/exceptions.py
+index d69958d5dfc29..cba6f3f560f71 100644
+--- a/third_party/python/urllib3/urllib3/exceptions.py
++++ b/third_party/python/urllib3/urllib3/exceptions.py
+@@ -289,7 +289,17 @@ class ProxySchemeUnknown(AssertionError, URLSchemeUnknown):
+     # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
+ 
+     def __init__(self, scheme):
+-        message = "Not supported proxy scheme %s" % scheme
++        # 'localhost' is here because our URL parser parses
++        # localhost:8080 -> scheme=localhost, remove if we fix this.
++        if scheme == "localhost":
++            scheme = None
++        if scheme is None:
++            message = "Proxy URL had no scheme, should start with http:// or https://"
++        else:
++            message = (
++                "Proxy URL had unsupported scheme %s, should use http:// or https://"
++                % scheme
++            )
+         super(ProxySchemeUnknown, self).__init__(message)
+ 
+ 
+diff --git a/third_party/python/urllib3/urllib3/packages/__init__.py b/third_party/python/urllib3/urllib3/packages/__init__.py
+index fce4caa65d2ee..e69de29bb2d1d 100644
+--- a/third_party/python/urllib3/urllib3/packages/__init__.py
++++ b/third_party/python/urllib3/urllib3/packages/__init__.py
+@@ -1,5 +0,0 @@
+-from __future__ import absolute_import
+-
+-from . import ssl_match_hostname
+-
+-__all__ = ("ssl_match_hostname",)
+diff --git a/third_party/python/urllib3/urllib3/packages/backports/weakref_finalize.py b/third_party/python/urllib3/urllib3/packages/backports/weakref_finalize.py
+new file mode 100644
+index 0000000000000..a2f2966e54966
+--- /dev/null
++++ b/third_party/python/urllib3/urllib3/packages/backports/weakref_finalize.py
+@@ -0,0 +1,155 @@
++# -*- coding: utf-8 -*-
++"""
++backports.weakref_finalize
++~~~~~~~~~~~~~~~~~~
++
++Backports the Python 3 ``weakref.finalize`` method.
++"""
++from __future__ import absolute_import
++
++import itertools
++import sys
++from weakref import ref
++
++__all__ = ["weakref_finalize"]
++
++
++class weakref_finalize(object):
++    """Class for finalization of weakrefable objects
++    finalize(obj, func, *args, **kwargs) returns a callable finalizer
++    object which will be called when obj is garbage collected. The
++    first time the finalizer is called it evaluates func(*arg, **kwargs)
++    and returns the result. After this the finalizer is dead, and
++    calling it just returns None.
++    When the program exits any remaining finalizers for which the
++    atexit attribute is true will be run in reverse order of creation.
++    By default atexit is true.
++    """
++
++    # Finalizer objects don't have any state of their own.  They are
++    # just used as keys to lookup _Info objects in the registry.  This
++    # ensures that they cannot be part of a ref-cycle.
++
++    __slots__ = ()
++    _registry = {}
++    _shutdown = False
++    _index_iter = itertools.count()
++    _dirty = False
++    _registered_with_atexit = False
++
++    class _Info(object):
++        __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index")
++
++    def __init__(self, obj, func, *args, **kwargs):
++        if not self._registered_with_atexit:
++            # We may register the exit function more than once because
++            # of a thread race, but that is harmless
++            import atexit
++
++            atexit.register(self._exitfunc)
++            weakref_finalize._registered_with_atexit = True
++        info = self._Info()
++        info.weakref = ref(obj, self)
++        info.func = func
++        info.args = args
++        info.kwargs = kwargs or None
++        info.atexit = True
++        info.index = next(self._index_iter)
++        self._registry[self] = info
++        weakref_finalize._dirty = True
++
++    def __call__(self, _=None):
++        """If alive then mark as dead and return func(*args, **kwargs);
++        otherwise return None"""
++        info = self._registry.pop(self, None)
++        if info and not self._shutdown:
++            return info.func(*info.args, **(info.kwargs or {}))
++
++    def detach(self):
++        """If alive then mark as dead and return (obj, func, args, kwargs);
++        otherwise return None"""
++        info = self._registry.get(self)
++        obj = info and info.weakref()
++        if obj is not None and self._registry.pop(self, None):
++            return (obj, info.func, info.args, info.kwargs or {})
++
++    def peek(self):
++        """If alive then return (obj, func, args, kwargs);
++        otherwise return None"""
++        info = self._registry.get(self)
++        obj = info and info.weakref()
++        if obj is not None:
++            return (obj, info.func, info.args, info.kwargs or {})
++
++    @property
++    def alive(self):
++        """Whether finalizer is alive"""
++        return self in self._registry
++
++    @property
++    def atexit(self):
++        """Whether finalizer should be called at exit"""
++        info = self._registry.get(self)
++        return bool(info) and info.atexit
++
++    @atexit.setter
++    def atexit(self, value):
++        info = self._registry.get(self)
++        if info:
++            info.atexit = bool(value)
++
++    def __repr__(self):
++        info = self._registry.get(self)
++        obj = info and info.weakref()
++        if obj is None:
++            return "<%s object at %#x; dead>" % (type(self).__name__, id(self))
++        else:
++            return "<%s object at %#x; for %r at %#x>" % (
++                type(self).__name__,
++                id(self),
++                type(obj).__name__,
++                id(obj),
++            )
++
++    @classmethod
++    def _select_for_exit(cls):
++        # Return live finalizers marked for exit, oldest first
++        L = [(f, i) for (f, i) in cls._registry.items() if i.atexit]
++        L.sort(key=lambda item: item[1].index)
++        return [f for (f, i) in L]
++
++    @classmethod
++    def _exitfunc(cls):
++        # At shutdown invoke finalizers for which atexit is true.
++        # This is called once all other non-daemonic threads have been
++        # joined.
++        reenable_gc = False
++        try:
++            if cls._registry:
++                import gc
++
++                if gc.isenabled():
++                    reenable_gc = True
++                    gc.disable()
++                pending = None
++                while True:
++                    if pending is None or weakref_finalize._dirty:
++                        pending = cls._select_for_exit()
++                        weakref_finalize._dirty = False
++                    if not pending:
++                        break
++                    f = pending.pop()
++                    try:
++                        # gc is disabled, so (assuming no daemonic
++                        # threads) the following is the only line in
++                        # this function which might trigger creation
++                        # of a new finalizer
++                        f()
++                    except Exception:
++                        sys.excepthook(*sys.exc_info())
++                    assert f not in cls._registry
++        finally:
++            # prevent any more finalizers from executing during shutdown
++            weakref_finalize._shutdown = True
++            if reenable_gc:
++                gc.enable()
+diff --git a/third_party/python/urllib3/urllib3/packages/six.py b/third_party/python/urllib3/urllib3/packages/six.py
+index 314424099f624..f099a3dcd28d2 100644
+--- a/third_party/python/urllib3/urllib3/packages/six.py
++++ b/third_party/python/urllib3/urllib3/packages/six.py
+@@ -1,4 +1,4 @@
+-# Copyright (c) 2010-2019 Benjamin Peterson
++# Copyright (c) 2010-2020 Benjamin Peterson
+ #
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
+ # of this software and associated documentation files (the "Software"), to deal
+@@ -29,7 +29,7 @@
+ import types
+ 
+ __author__ = "Benjamin Peterson <benjamin@python.org>"
+-__version__ = "1.12.0"
++__version__ = "1.16.0"
+ 
+ 
+ # Useful for very coarse version differentiation.
+@@ -71,6 +71,11 @@ def __len__(self):
+             MAXSIZE = int((1 << 63) - 1)
+         del X
+ 
++if PY34:
++    from importlib.util import spec_from_loader
++else:
++    spec_from_loader = None
++
+ 
+ def _add_doc(func, doc):
+     """Add documentation to a function."""
+@@ -182,6 +187,11 @@ def find_module(self, fullname, path=None):
+             return self
+         return None
+ 
++    def find_spec(self, fullname, path, target=None):
++        if fullname in self.known_modules:
++            return spec_from_loader(fullname, self)
++        return None
++
+     def __get_module(self, fullname):
+         try:
+             return self.known_modules[fullname]
+@@ -220,6 +230,12 @@ def get_code(self, fullname):
+ 
+     get_source = get_code  # same as get_code
+ 
++    def create_module(self, spec):
++        return self.load_module(spec.name)
++
++    def exec_module(self, module):
++        pass
++
+ 
+ _importer = _SixMetaPathImporter(__name__)
+ 
+@@ -260,9 +276,19 @@ class _MovedItems(_LazyModule):
+     ),
+     MovedModule("builtins", "__builtin__"),
+     MovedModule("configparser", "ConfigParser"),
++    MovedModule(
++        "collections_abc",
++        "collections",
++        "collections.abc" if sys.version_info >= (3, 3) else "collections",
++    ),
+     MovedModule("copyreg", "copy_reg"),
+     MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+-    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
++    MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
++    MovedModule(
++        "_dummy_thread",
++        "dummy_thread",
++        "_dummy_thread" if sys.version_info < (3, 9) else "_thread",
++    ),
+     MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+     MovedModule("http_cookies", "Cookie", "http.cookies"),
+     MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+@@ -307,7 +333,9 @@ class _MovedItems(_LazyModule):
+ ]
+ # Add windows specific modules.
+ if sys.platform == "win32":
+-    _moved_attributes += [MovedModule("winreg", "_winreg")]
++    _moved_attributes += [
++        MovedModule("winreg", "_winreg"),
++    ]
+ 
+ for attr in _moved_attributes:
+     setattr(_MovedItems, attr.name, attr)
+@@ -476,7 +504,7 @@ class Module_six_moves_urllib_robotparser(_LazyModule):
+ 
+ 
+ _urllib_robotparser_moved_attributes = [
+-    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser")
++    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+ ]
+ for attr in _urllib_robotparser_moved_attributes:
+     setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+@@ -678,9 +706,11 @@ def u(s):
+     if sys.version_info[1] <= 1:
+         _assertRaisesRegex = "assertRaisesRegexp"
+         _assertRegex = "assertRegexpMatches"
++        _assertNotRegex = "assertNotRegexpMatches"
+     else:
+         _assertRaisesRegex = "assertRaisesRegex"
+         _assertRegex = "assertRegex"
++        _assertNotRegex = "assertNotRegex"
+ else:
+ 
+     def b(s):
+@@ -707,6 +737,7 @@ def indexbytes(buf, i):
+     _assertCountEqual = "assertItemsEqual"
+     _assertRaisesRegex = "assertRaisesRegexp"
+     _assertRegex = "assertRegexpMatches"
++    _assertNotRegex = "assertNotRegexpMatches"
+ _add_doc(b, """Byte literal""")
+ _add_doc(u, """Text literal""")
+ 
+@@ -723,6 +754,10 @@ def assertRegex(self, *args, **kwargs):
+     return getattr(self, _assertRegex)(*args, **kwargs)
+ 
+ 
++def assertNotRegex(self, *args, **kwargs):
++    return getattr(self, _assertNotRegex)(*args, **kwargs)
++
++
+ if PY3:
+     exec_ = getattr(moves.builtins, "exec")
+ 
+@@ -737,7 +772,6 @@ def reraise(tp, value, tb=None):
+             value = None
+             tb = None
+ 
+-
+ else:
+ 
+     def exec_(_code_, _globs_=None, _locs_=None):
+@@ -750,7 +784,7 @@ def exec_(_code_, _globs_=None, _locs_=None):
+             del frame
+         elif _locs_ is None:
+             _locs_ = _globs_
+-        exec("""exec _code_ in _globs_, _locs_""")
++        exec ("""exec _code_ in _globs_, _locs_""")
+ 
+     exec_(
+         """def reraise(tp, value, tb=None):
+@@ -762,18 +796,7 @@ def exec_(_code_, _globs_=None, _locs_=None):
+     )
+ 
+ 
+-if sys.version_info[:2] == (3, 2):
+-    exec_(
+-        """def raise_from(value, from_value):
+-    try:
+-        if from_value is None:
+-            raise value
+-        raise value from from_value
+-    finally:
+-        value = None
+-"""
+-    )
+-elif sys.version_info[:2] > (3, 2):
++if sys.version_info[:2] > (3,):
+     exec_(
+         """def raise_from(value, from_value):
+     try:
+@@ -863,19 +886,41 @@ def print_(*args, **kwargs):
+ _add_doc(reraise, """Reraise an exception.""")
+ 
+ if sys.version_info[0:2] < (3, 4):
++    # This does exactly the same what the :func:`py3:functools.update_wrapper`
++    # function does on Python versions after 3.2. It sets the ``__wrapped__``
++    # attribute on ``wrapper`` object and it doesn't raise an error if any of
++    # the attributes mentioned in ``assigned`` and ``updated`` are missing on
++    # ``wrapped`` object.
++    def _update_wrapper(
++        wrapper,
++        wrapped,
++        assigned=functools.WRAPPER_ASSIGNMENTS,
++        updated=functools.WRAPPER_UPDATES,
++    ):
++        for attr in assigned:
++            try:
++                value = getattr(wrapped, attr)
++            except AttributeError:
++                continue
++            else:
++                setattr(wrapper, attr, value)
++        for attr in updated:
++            getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
++        wrapper.__wrapped__ = wrapped
++        return wrapper
++
++    _update_wrapper.__doc__ = functools.update_wrapper.__doc__
+ 
+     def wraps(
+         wrapped,
+         assigned=functools.WRAPPER_ASSIGNMENTS,
+         updated=functools.WRAPPER_UPDATES,
+     ):
+-        def wrapper(f):
+-            f = functools.wraps(wrapped, assigned, updated)(f)
+-            f.__wrapped__ = wrapped
+-            return f
+-
+-        return wrapper
++        return functools.partial(
++            _update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated
++        )
+ 
++    wraps.__doc__ = functools.wraps.__doc__
+ 
+ else:
+     wraps = functools.wraps
+@@ -888,7 +933,15 @@ def with_metaclass(meta, *bases):
+     # the actual metaclass.
+     class metaclass(type):
+         def __new__(cls, name, this_bases, d):
+-            return meta(name, bases, d)
++            if sys.version_info[:2] >= (3, 7):
++                # This version introduced PEP 560 that requires a bit
++                # of extra care (we mimic what is done by __build_class__).
++                resolved_bases = types.resolve_bases(bases)
++                if resolved_bases is not bases:
++                    d["__orig_bases__"] = bases
++            else:
++                resolved_bases = bases
++            return meta(name, resolved_bases, d)
+ 
+         @classmethod
+         def __prepare__(cls, name, this_bases):
+@@ -928,12 +981,11 @@ def ensure_binary(s, encoding="utf-8", errors="strict"):
+       - `str` -> encoded to `bytes`
+       - `bytes` -> `bytes`
+     """
++    if isinstance(s, binary_type):
++        return s
+     if isinstance(s, text_type):
+         return s.encode(encoding, errors)
+-    elif isinstance(s, binary_type):
+-        return s
+-    else:
+-        raise TypeError("not expecting type '%s'" % type(s))
++    raise TypeError("not expecting type '%s'" % type(s))
+ 
+ 
+ def ensure_str(s, encoding="utf-8", errors="strict"):
+@@ -947,12 +999,15 @@ def ensure_str(s, encoding="utf-8", errors="strict"):
+       - `str` -> `str`
+       - `bytes` -> decoded to `str`
+     """
+-    if not isinstance(s, (text_type, binary_type)):
+-        raise TypeError("not expecting type '%s'" % type(s))
++    # Optimization: Fast return for the common case.
++    if type(s) is str:
++        return s
+     if PY2 and isinstance(s, text_type):
+-        s = s.encode(encoding, errors)
++        return s.encode(encoding, errors)
+     elif PY3 and isinstance(s, binary_type):
+-        s = s.decode(encoding, errors)
++        return s.decode(encoding, errors)
++    elif not isinstance(s, (text_type, binary_type)):
++        raise TypeError("not expecting type '%s'" % type(s))
+     return s
+ 
+ 
+@@ -977,7 +1032,7 @@ def ensure_text(s, encoding="utf-8", errors="strict"):
+ 
+ def python_2_unicode_compatible(klass):
+     """
+-    A decorator that defines __unicode__ and __str__ methods under Python 2.
++    A class decorator that defines __unicode__ and __str__ methods under Python 2.
+     Under Python 3 it does nothing.
+ 
+     To support Python 2 and 3 with a single code base, define a __str__ method
+diff --git a/third_party/python/urllib3/urllib3/packages/ssl_match_hostname/__init__.py b/third_party/python/urllib3/urllib3/packages/ssl_match_hostname/__init__.py
+deleted file mode 100644
+index 6b12fd90aadec..0000000000000
+--- a/third_party/python/urllib3/urllib3/packages/ssl_match_hostname/__init__.py
++++ /dev/null
+@@ -1,22 +0,0 @@
+-import sys
+-
+-try:
+-    # Our match_hostname function is the same as 3.5's, so we only want to
+-    # import the match_hostname function if it's at least that good.
+-    if sys.version_info < (3, 5):
+-        raise ImportError("Fallback to vendored code")
+-
+-    from ssl import CertificateError, match_hostname
+-except ImportError:
+-    try:
+-        # Backport of the function from a pypi module
+-        from backports.ssl_match_hostname import (  # type: ignore
+-            CertificateError,
+-            match_hostname,
+-        )
+-    except ImportError:
+-        # Our vendored copy
+-        from ._implementation import CertificateError, match_hostname  # type: ignore
+-
+-# Not needed, but documenting what we provide.
+-__all__ = ("CertificateError", "match_hostname")
+diff --git a/third_party/python/urllib3/urllib3/poolmanager.py b/third_party/python/urllib3/urllib3/poolmanager.py
+index 3a31a285bf648..14b10daf3a962 100644
+--- a/third_party/python/urllib3/urllib3/poolmanager.py
++++ b/third_party/python/urllib3/urllib3/poolmanager.py
+@@ -34,6 +34,7 @@
+     "ca_cert_dir",
+     "ssl_context",
+     "key_password",
++    "server_hostname",
+ )
+ 
+ # All known keyword arguments that could be provided to the pool manager, its
+@@ -170,7 +171,7 @@ class PoolManager(RequestMethods):
+     def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
+         RequestMethods.__init__(self, headers)
+         self.connection_pool_kw = connection_pool_kw
+-        self.pools = RecentlyUsedContainer(num_pools, dispose_func=lambda p: p.close())
++        self.pools = RecentlyUsedContainer(num_pools)
+ 
+         # Locally set the pool classes and keys so other PoolManagers can
+         # override them.
+diff --git a/third_party/python/urllib3/urllib3/request.py b/third_party/python/urllib3/urllib3/request.py
+index 398386a5b9f61..3b4cf999225b8 100644
+--- a/third_party/python/urllib3/urllib3/request.py
++++ b/third_party/python/urllib3/urllib3/request.py
+@@ -1,6 +1,9 @@
+ from __future__ import absolute_import
+ 
++import sys
++
+ from .filepost import encode_multipart_formdata
++from .packages import six
+ from .packages.six.moves.urllib.parse import urlencode
+ 
+ __all__ = ["RequestMethods"]
+@@ -168,3 +171,21 @@ def request_encode_body(
+         extra_kw.update(urlopen_kw)
+ 
+         return self.urlopen(method, url, **extra_kw)
++
++
++if not six.PY2:
++
++    class RequestModule(sys.modules[__name__].__class__):
++        def __call__(self, *args, **kwargs):
++            """
++            If user tries to call this module directly urllib3 v2.x style raise an error to the user
++            suggesting they may need urllib3 v2
++            """
++            raise TypeError(
++                "'module' object is not callable\n"
++                "urllib3.request() method is not supported in this release, "
++                "upgrade to urllib3 v2 to use it\n"
++                "see https://urllib3.readthedocs.io/en/stable/v2-migration-guide.html"
++            )
++
++    sys.modules[__name__].__class__ = RequestModule
+diff --git a/third_party/python/urllib3/urllib3/response.py b/third_party/python/urllib3/urllib3/response.py
+index 38693f4fc6e33..0bd13d40b8ac7 100644
+--- a/third_party/python/urllib3/urllib3/response.py
++++ b/third_party/python/urllib3/urllib3/response.py
+@@ -2,16 +2,22 @@
+ 
+ import io
+ import logging
++import sys
++import warnings
+ import zlib
+ from contextlib import contextmanager
+ from socket import error as SocketError
+ from socket import timeout as SocketTimeout
+ 
+ try:
+-    import brotli
++    try:
++        import brotlicffi as brotli
++    except ImportError:
++        import brotli
+ except ImportError:
+     brotli = None
+ 
++from . import util
+ from ._collections import HTTPHeaderDict
+ from .connection import BaseSSLError, HTTPException
+ from .exceptions import (
+@@ -478,6 +484,54 @@ def _error_catcher(self):
+             if self._original_response and self._original_response.isclosed():
+                 self.release_conn()
+ 
++    def _fp_read(self, amt):
++        """
++        Read a response with the thought that reading the number of bytes
++        larger than can fit in a 32-bit int at a time via SSL in some
++        known cases leads to an overflow error that has to be prevented
++        if `amt` or `self.length_remaining` indicate that a problem may
++        happen.
++
++        The known cases:
++          * 3.8 <= CPython < 3.9.7 because of a bug
++            https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900.
++          * urllib3 injected with pyOpenSSL-backed SSL-support.
++          * CPython < 3.10 only when `amt` does not fit 32-bit int.
++        """
++        assert self._fp
++        c_int_max = 2 ** 31 - 1
++        if (
++            (
++                (amt and amt > c_int_max)
++                or (self.length_remaining and self.length_remaining > c_int_max)
++            )
++            and not util.IS_SECURETRANSPORT
++            and (util.IS_PYOPENSSL or sys.version_info < (3, 10))
++        ):
++            buffer = io.BytesIO()
++            # Besides `max_chunk_amt` being a maximum chunk size, it
++            # affects memory overhead of reading a response by this
++            # method in CPython.
++            # `c_int_max` equal to 2 GiB - 1 byte is the actual maximum
++            # chunk size that does not lead to an overflow error, but
++            # 256 MiB is a compromise.
++            max_chunk_amt = 2 ** 28
++            while amt is None or amt != 0:
++                if amt is not None:
++                    chunk_amt = min(amt, max_chunk_amt)
++                    amt -= chunk_amt
++                else:
++                    chunk_amt = max_chunk_amt
++                data = self._fp.read(chunk_amt)
++                if not data:
++                    break
++                buffer.write(data)
++                del data  # to reduce peak memory usage by `max_chunk_amt`.
++            return buffer.getvalue()
++        else:
++            # StringIO doesn't like amt=None
++            return self._fp.read(amt) if amt is not None else self._fp.read()
++
+     def read(self, amt=None, decode_content=None, cache_content=False):
+         """
+         Similar to :meth:`http.client.HTTPResponse.read`, but with two additional
+@@ -510,13 +564,11 @@ def read(self, amt=None, decode_content=None, cache_content=False):
+         fp_closed = getattr(self._fp, "closed", False)
+ 
+         with self._error_catcher():
++            data = self._fp_read(amt) if not fp_closed else b""
+             if amt is None:
+-                # cStringIO doesn't like amt=None
+-                data = self._fp.read() if not fp_closed else b""
+                 flush_decoder = True
+             else:
+                 cache_content = False
+-                data = self._fp.read(amt) if not fp_closed else b""
+                 if (
+                     amt != 0 and not data
+                 ):  # Platform-specific: Buggy versions of Python.
+@@ -612,9 +664,21 @@ def from_httplib(ResponseCls, r, **response_kw):
+ 
+     # Backwards-compatibility methods for http.client.HTTPResponse
+     def getheaders(self):
++        warnings.warn(
++            "HTTPResponse.getheaders() is deprecated and will be removed "
++            "in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.",
++            category=DeprecationWarning,
++            stacklevel=2,
++        )
+         return self.headers
+ 
+     def getheader(self, name, default=None):
++        warnings.warn(
++            "HTTPResponse.getheader() is deprecated and will be removed "
++            "in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default).",
++            category=DeprecationWarning,
++            stacklevel=2,
++        )
+         return self.headers.get(name, default)
+ 
+     # Backwards compatibility for http.cookiejar
+diff --git a/third_party/python/urllib3/urllib3/util/connection.py b/third_party/python/urllib3/urllib3/util/connection.py
+index cd57455748be0..6af1138f260e4 100644
+--- a/third_party/python/urllib3/urllib3/util/connection.py
++++ b/third_party/python/urllib3/urllib3/util/connection.py
+@@ -2,9 +2,8 @@
+ 
+ import socket
+ 
+-from urllib3.exceptions import LocationParseError
+-
+ from ..contrib import _appengine_environ
++from ..exceptions import LocationParseError
+ from ..packages import six
+ from .wait import NoWayToWaitForSocketError, wait_for_read
+ 
+@@ -118,7 +117,7 @@ def allowed_gai_family():
+ 
+ 
+ def _has_ipv6(host):
+-    """ Returns True if the system can bind an IPv6 address. """
++    """Returns True if the system can bind an IPv6 address."""
+     sock = None
+     has_ipv6 = False
+ 
+diff --git a/third_party/python/urllib3/urllib3/util/proxy.py b/third_party/python/urllib3/urllib3/util/proxy.py
+index 34f884d5b314d..2199cc7b7f004 100644
+--- a/third_party/python/urllib3/urllib3/util/proxy.py
++++ b/third_party/python/urllib3/urllib3/util/proxy.py
+@@ -45,6 +45,7 @@ def create_proxy_ssl_context(
+         ssl_version=resolve_ssl_version(ssl_version),
+         cert_reqs=resolve_cert_reqs(cert_reqs),
+     )
++
+     if (
+         not ca_certs
+         and not ca_cert_dir
+diff --git a/third_party/python/urllib3/urllib3/util/request.py b/third_party/python/urllib3/urllib3/util/request.py
+index 25103383ec7ab..b574b081e98a0 100644
+--- a/third_party/python/urllib3/urllib3/util/request.py
++++ b/third_party/python/urllib3/urllib3/util/request.py
+@@ -14,7 +14,10 @@
+ 
+ ACCEPT_ENCODING = "gzip,deflate"
+ try:
+-    import brotli as _unused_module_brotli  # noqa: F401
++    try:
++        import brotlicffi as _unused_module_brotli  # noqa: F401
++    except ImportError:
++        import brotli as _unused_module_brotli  # noqa: F401
+ except ImportError:
+     pass
+ else:
+diff --git a/third_party/python/urllib3/urllib3/util/retry.py b/third_party/python/urllib3/urllib3/util/retry.py
+index ee51f922f8452..60ef6c4f3f9d0 100644
+--- a/third_party/python/urllib3/urllib3/util/retry.py
++++ b/third_party/python/urllib3/urllib3/util/retry.py
+@@ -37,7 +37,7 @@ class _RetryMeta(type):
+     def DEFAULT_METHOD_WHITELIST(cls):
+         warnings.warn(
+             "Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and "
+-            "will be removed in v2.0. Use 'Retry.DEFAULT_METHODS_ALLOWED' instead",
++            "will be removed in v2.0. Use 'Retry.DEFAULT_ALLOWED_METHODS' instead",
+             DeprecationWarning,
+         )
+         return cls.DEFAULT_ALLOWED_METHODS
+@@ -69,6 +69,24 @@ def DEFAULT_REDIRECT_HEADERS_BLACKLIST(cls, value):
+         )
+         cls.DEFAULT_REMOVE_HEADERS_ON_REDIRECT = value
+ 
++    @property
++    def BACKOFF_MAX(cls):
++        warnings.warn(
++            "Using 'Retry.BACKOFF_MAX' is deprecated and "
++            "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead",
++            DeprecationWarning,
++        )
++        return cls.DEFAULT_BACKOFF_MAX
++
++    @BACKOFF_MAX.setter
++    def BACKOFF_MAX(cls, value):
++        warnings.warn(
++            "Using 'Retry.BACKOFF_MAX' is deprecated and "
++            "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead",
++            DeprecationWarning,
++        )
++        cls.DEFAULT_BACKOFF_MAX = value
++
+ 
+ @six.add_metaclass(_RetryMeta)
+ class Retry(object):
+@@ -181,7 +199,7 @@ class Retry(object):
+ 
+         seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep
+         for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer
+-        than :attr:`Retry.BACKOFF_MAX`.
++        than :attr:`Retry.DEFAULT_BACKOFF_MAX`.
+ 
+         By default, backoff is disabled (set to 0).
+ 
+@@ -217,10 +235,10 @@ class Retry(object):
+     RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503])
+ 
+     #: Default headers to be used for ``remove_headers_on_redirect``
+-    DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset(["Authorization"])
++    DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset(["Cookie", "Authorization"])
+ 
+     #: Maximum backoff time.
+-    BACKOFF_MAX = 120
++    DEFAULT_BACKOFF_MAX = 120
+ 
+     def __init__(
+         self,
+@@ -253,6 +271,7 @@ def __init__(
+                 "Using 'method_whitelist' with Retry is deprecated and "
+                 "will be removed in v2.0. Use 'allowed_methods' instead",
+                 DeprecationWarning,
++                stacklevel=2,
+             )
+             allowed_methods = method_whitelist
+         if allowed_methods is _Default:
+@@ -320,7 +339,7 @@ def new(self, **kw):
+ 
+     @classmethod
+     def from_int(cls, retries, redirect=True, default=None):
+-        """ Backwards-compatibility for the old retries format."""
++        """Backwards-compatibility for the old retries format."""
+         if retries is None:
+             retries = default if default is not None else cls.DEFAULT
+ 
+@@ -347,7 +366,7 @@ def get_backoff_time(self):
+             return 0
+ 
+         backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1))
+-        return min(self.BACKOFF_MAX, backoff_value)
++        return min(self.DEFAULT_BACKOFF_MAX, backoff_value)
+ 
+     def parse_retry_after(self, retry_after):
+         # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4
+@@ -373,9 +392,9 @@ def parse_retry_after(self, retry_after):
+         return seconds
+ 
+     def get_retry_after(self, response):
+-        """ Get the value of Retry-After in seconds. """
++        """Get the value of Retry-After in seconds."""
+ 
+-        retry_after = response.getheader("Retry-After")
++        retry_after = response.headers.get("Retry-After")
+ 
+         if retry_after is None:
+             return None
+@@ -467,7 +486,7 @@ def is_retry(self, method, status_code, has_retry_after=False):
+         )
+ 
+     def is_exhausted(self):
+-        """ Are we out of retries? """
++        """Are we out of retries?"""
+         retry_counts = (
+             self.total,
+             self.connect,
+diff --git a/third_party/python/urllib3/urllib3/util/ssl_.py b/third_party/python/urllib3/urllib3/util/ssl_.py
+index 1cb5e7cdc1c0c..8f867812a5eb3 100644
+--- a/third_party/python/urllib3/urllib3/util/ssl_.py
++++ b/third_party/python/urllib3/urllib3/util/ssl_.py
+@@ -44,13 +44,21 @@ def _const_compare_digest_backport(a, b):
+ 
+ try:  # Test for SSL features
+     import ssl
+-    from ssl import HAS_SNI  # Has SNI?
+     from ssl import CERT_REQUIRED, wrap_socket
++except ImportError:
++    pass
++
++try:
++    from ssl import HAS_SNI  # Has SNI?
++except ImportError:
++    pass
+ 
++try:
+     from .ssltransport import SSLTransport
+ except ImportError:
+     pass
+ 
++
+ try:  # Platform-specific: Python 3.6
+     from ssl import PROTOCOL_TLS
+ 
+@@ -63,6 +71,11 @@ def _const_compare_digest_backport(a, b):
+     except ImportError:
+         PROTOCOL_SSLv23 = PROTOCOL_TLS = 2
+ 
++try:
++    from ssl import PROTOCOL_TLS_CLIENT
++except ImportError:
++    PROTOCOL_TLS_CLIENT = PROTOCOL_TLS
++
+ 
+ try:
+     from ssl import OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3
+@@ -151,7 +164,7 @@ def wrap_socket(self, socket, server_hostname=None, server_side=False):
+                 "urllib3 from configuring SSL appropriately and may cause "
+                 "certain SSL connections to fail. You can upgrade to a newer "
+                 "version of Python to solve this. For more information, see "
+-                "https://urllib3.readthedocs.io/en/latest/advanced-usage.html"
++                "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
+                 "#ssl-warnings",
+                 InsecurePlatformWarning,
+             )
+@@ -270,7 +283,11 @@ def create_urllib3_context(
+         Constructed SSLContext object with specified options
+     :rtype: SSLContext
+     """
+-    context = SSLContext(ssl_version or PROTOCOL_TLS)
++    # PROTOCOL_TLS is deprecated in Python 3.10
++    if not ssl_version or ssl_version == PROTOCOL_TLS:
++        ssl_version = PROTOCOL_TLS_CLIENT
++
++    context = SSLContext(ssl_version)
+ 
+     context.set_ciphers(ciphers or DEFAULT_CIPHERS)
+ 
+@@ -305,13 +322,25 @@ def create_urllib3_context(
+     ) is not None:
+         context.post_handshake_auth = True
+ 
+-    context.verify_mode = cert_reqs
+-    if (
+-        getattr(context, "check_hostname", None) is not None
+-    ):  # Platform-specific: Python 3.2
+-        # We do our own verification, including fingerprints and alternative
+-        # hostnames. So disable it here
+-        context.check_hostname = False
++    def disable_check_hostname():
++        if (
++            getattr(context, "check_hostname", None) is not None
++        ):  # Platform-specific: Python 3.2
++            # We do our own verification, including fingerprints and alternative
++            # hostnames. So disable it here
++            context.check_hostname = False
++
++    # The order of the below lines setting verify_mode and check_hostname
++    # matter due to safe-guards SSLContext has to prevent an SSLContext with
++    # check_hostname=True, verify_mode=NONE/OPTIONAL. This is made even more
++    # complex because we don't know whether PROTOCOL_TLS_CLIENT will be used
++    # or not so we don't know the initial state of the freshly created SSLContext.
++    if cert_reqs == ssl.CERT_REQUIRED:
++        context.verify_mode = cert_reqs
++        disable_check_hostname()
++    else:
++        disable_check_hostname()
++        context.verify_mode = cert_reqs
+ 
+     # Enable logging of TLS session keys via defacto standard environment variable
+     # 'SSLKEYLOGFILE', if the feature is available (Python 3.8+). Skip empty values.
+@@ -393,7 +422,7 @@ def ssl_wrap_socket(
+     try:
+         if hasattr(context, "set_alpn_protocols"):
+             context.set_alpn_protocols(ALPN_PROTOCOLS)
+-    except NotImplementedError:
++    except NotImplementedError:  # Defensive: in CI, we always have set_alpn_protocols
+         pass
+ 
+     # If we detect server_hostname is an IP address then the SNI
+@@ -411,7 +440,7 @@ def ssl_wrap_socket(
+             "This may cause the server to present an incorrect TLS "
+             "certificate, which can cause validation failures. You can upgrade to "
+             "a newer version of Python to solve this. For more information, see "
+-            "https://urllib3.readthedocs.io/en/latest/advanced-usage.html"
++            "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html"
+             "#ssl-warnings",
+             SNIMissingWarning,
+         )
+diff --git a/third_party/python/urllib3/urllib3/packages/ssl_match_hostname/_implementation.py b/third_party/python/urllib3/urllib3/util/ssl_match_hostname.py
+similarity index 92%
+rename from third_party/python/urllib3/urllib3/packages/ssl_match_hostname/_implementation.py
+rename to third_party/python/urllib3/urllib3/util/ssl_match_hostname.py
+index 689208d3c63f1..1dd950c489607 100644
+--- a/third_party/python/urllib3/urllib3/packages/ssl_match_hostname/_implementation.py
++++ b/third_party/python/urllib3/urllib3/util/ssl_match_hostname.py
+@@ -9,7 +9,7 @@
+ # ipaddress has been backported to 2.6+ in pypi.  If it is installed on the
+ # system, use it to handle IPAddress ServerAltnames (this was added in
+ # python-3.5) otherwise only do DNS matching.  This allows
+-# backports.ssl_match_hostname to continue to be used in Python 2.7.
++# util.ssl_match_hostname to continue to be used in Python 2.7.
+ try:
+     import ipaddress
+ except ImportError:
+@@ -78,7 +78,8 @@ def _dnsname_match(dn, hostname, max_wildcards=1):
+ 
+ def _to_unicode(obj):
+     if isinstance(obj, str) and sys.version_info < (3,):
+-        obj = unicode(obj, encoding="ascii", errors="strict")
++        # ignored flake8 # F821 to support python 2.7 function
++        obj = unicode(obj, encoding="ascii", errors="strict")  # noqa: F821
+     return obj
+ 
+ 
+@@ -111,11 +112,9 @@ def match_hostname(cert, hostname):
+     try:
+         # Divergence from upstream: ipaddress can't handle byte str
+         host_ip = ipaddress.ip_address(_to_unicode(hostname))
+-    except ValueError:
+-        # Not an IP address (common case)
+-        host_ip = None
+-    except UnicodeError:
+-        # Divergence from upstream: Have to deal with ipaddress not taking
++    except (UnicodeError, ValueError):
++        # ValueError: Not an IP address (common case)
++        # UnicodeError: Divergence from upstream: Have to deal with ipaddress not taking
+         # byte strings.  addresses should be all ascii, so we consider it not
+         # an ipaddress in this case
+         host_ip = None
+@@ -123,7 +122,7 @@ def match_hostname(cert, hostname):
+         # Divergence from upstream: Make ipaddress library optional
+         if ipaddress is None:
+             host_ip = None
+-        else:
++        else:  # Defensive
+             raise
+     dnsnames = []
+     san = cert.get("subjectAltName", ())
+diff --git a/third_party/python/urllib3/urllib3/util/ssltransport.py b/third_party/python/urllib3/urllib3/util/ssltransport.py
+index 1e41354f5d458..4a7105d17916a 100644
+--- a/third_party/python/urllib3/urllib3/util/ssltransport.py
++++ b/third_party/python/urllib3/urllib3/util/ssltransport.py
+@@ -2,8 +2,8 @@
+ import socket
+ import ssl
+ 
+-from urllib3.exceptions import ProxySchemeUnsupported
+-from urllib3.packages import six
++from ..exceptions import ProxySchemeUnsupported
++from ..packages import six
+ 
+ SSL_BLOCKSIZE = 16384
+ 
+@@ -193,7 +193,7 @@ def _wrap_ssl_read(self, len, buffer=None):
+                 raise
+ 
+     def _ssl_io_loop(self, func, *args):
+-        """ Performs an I/O loop between incoming/outgoing and the socket."""
++        """Performs an I/O loop between incoming/outgoing and the socket."""
+         should_loop = True
+         ret = None
+ 
+diff --git a/third_party/python/urllib3/urllib3/util/timeout.py b/third_party/python/urllib3/urllib3/util/timeout.py
+index ff69593b05b5e..78e18a6272482 100644
+--- a/third_party/python/urllib3/urllib3/util/timeout.py
++++ b/third_party/python/urllib3/urllib3/util/timeout.py
+@@ -2,9 +2,8 @@
+ 
+ import time
+ 
+-# The default socket timeout, used by httplib to indicate that no timeout was
+-# specified by the user
+-from socket import _GLOBAL_DEFAULT_TIMEOUT
++# The default socket timeout, used by httplib to indicate that no timeout was; specified by the user
++from socket import _GLOBAL_DEFAULT_TIMEOUT, getdefaulttimeout
+ 
+ from ..exceptions import TimeoutStateError
+ 
+@@ -116,6 +115,10 @@ def __repr__(self):
+     # __str__ provided for backwards compatibility
+     __str__ = __repr__
+ 
++    @classmethod
++    def resolve_default_timeout(cls, timeout):
++        return getdefaulttimeout() if timeout is cls.DEFAULT_TIMEOUT else timeout
++
+     @classmethod
+     def _validate_timeout(cls, value, name):
+         """Check that a timeout attribute is valid.
+diff --git a/third_party/python/urllib3/urllib3/util/url.py b/third_party/python/urllib3/urllib3/util/url.py
+index 6ff238fe3cbd0..e5682d3be4293 100644
+--- a/third_party/python/urllib3/urllib3/util/url.py
++++ b/third_party/python/urllib3/urllib3/util/url.py
+@@ -50,7 +50,7 @@
+     "(?:(?:%(hex)s:){0,6}%(hex)s)?::",
+ ]
+ 
+-UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-~"
++UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._\-~"
+ IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")"
+ ZONE_ID_PAT = "(?:%25|%)(?:[" + UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+"
+ IPV6_ADDRZ_PAT = r"\[" + IPV6_PAT + r"(?:" + ZONE_ID_PAT + r")?\]"
+@@ -63,12 +63,12 @@
+ BRACELESS_IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT[2:-2] + "$")
+ ZONE_ID_RE = re.compile("(" + ZONE_ID_PAT + r")\]$")
+ 
+-SUBAUTHORITY_PAT = (u"^(?:(.*)@)?(%s|%s|%s)(?::([0-9]{0,5}))?$") % (
++_HOST_PORT_PAT = ("^(%s|%s|%s)(?::0*?(|0|[1-9][0-9]{0,4}))?$") % (
+     REG_NAME_PAT,
+     IPV4_PAT,
+     IPV6_ADDRZ_PAT,
+ )
+-SUBAUTHORITY_RE = re.compile(SUBAUTHORITY_PAT, re.UNICODE | re.DOTALL)
++_HOST_PORT_RE = re.compile(_HOST_PORT_PAT, re.UNICODE | re.DOTALL)
+ 
+ UNRESERVED_CHARS = set(
+     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-~"
+@@ -279,6 +279,9 @@ def _normalize_host(host, scheme):
+         if scheme in NORMALIZABLE_SCHEMES:
+             is_ipv6 = IPV6_ADDRZ_RE.match(host)
+             if is_ipv6:
++                # IPv6 hosts of the form 'a::b%zone' are encoded in a URL as
++                # such per RFC 6874: 'a::b%25zone'. Unquote the ZoneID
++                # separator as necessary to return a valid RFC 4007 scoped IP.
+                 match = ZONE_ID_RE.search(host)
+                 if match:
+                     start, end = match.span(1)
+@@ -300,7 +303,7 @@ def _normalize_host(host, scheme):
+ 
+ 
+ def _idna_encode(name):
+-    if name and any([ord(x) > 128 for x in name]):
++    if name and any(ord(x) >= 128 for x in name):
+         try:
+             import idna
+         except ImportError:
+@@ -331,7 +334,7 @@ def parse_url(url):
+     """
+     Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
+     performed to parse incomplete urls. Fields not provided will be None.
+-    This parser is RFC 3986 compliant.
++    This parser is RFC 3986 and RFC 6874 compliant.
+ 
+     The parser logic and helper functions are based heavily on
+     work done in the ``rfc3986`` module.
+@@ -365,7 +368,9 @@ def parse_url(url):
+             scheme = scheme.lower()
+ 
+         if authority:
+-            auth, host, port = SUBAUTHORITY_RE.match(authority).groups()
++            auth, _, host_port = authority.rpartition("@")
++            auth = auth or None
++            host, port = _HOST_PORT_RE.match(host_port).groups()
+             if auth and normalize_uri:
+                 auth = _encode_invalid_chars(auth, USERINFO_CHARS)
+             if port == "":
+diff --git a/third_party/python/urllib3/urllib3/util/wait.py b/third_party/python/urllib3/urllib3/util/wait.py
+index c280646c7be0b..21b4590b3dc9b 100644
+--- a/third_party/python/urllib3/urllib3/util/wait.py
++++ b/third_party/python/urllib3/urllib3/util/wait.py
+@@ -42,7 +42,6 @@ class NoWayToWaitForSocketError(Exception):
+     def _retry_on_intr(fn, timeout):
+         return fn(timeout)
+ 
+-
+ else:
+     # Old and broken Pythons.
+     def _retry_on_intr(fn, timeout):
diff --git a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-115_115.2.0.bb b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-115_115.2.0.bb
index fcdf64c..e1a547c 100644
--- a/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-115_115.2.0.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/mozjs/mozjs-115_115.2.0.bb
@@ -15,6 +15,7 @@
            file://0001-rewrite-cargo-host-linker-in-python3.patch  \
            file://musl-disable-stackwalk.patch \
            file://0001-add-arm-to-list-of-mozinline.patch \
+           file://py3.12.patch \
            "
 SRC_URI[sha256sum] = "51534dd2a158d955a2cb67cc1308f100f6c9def0788713ed8b4d743f3ad72457"
 
@@ -28,7 +29,22 @@
 
 B = "${WORKDIR}/build"
 
-export PYTHONPATH = "${S}/build:${S}/third_party/python/PyYAML/lib3:${S}/testing/mozbase/mozfile:${S}/python/mozboot:${S}/third_party/python/distro:${S}/testing/mozbase/mozinfo:${S}/config:${S}/testing/mozbase/manifestparser:${S}/third_party/python/pytoml:${S}/testing/mozbase/mozprocess:${S}/third_party/python/six:${S}/python/mozbuild:${S}/python/mozbuild/mozbuild:${S}/python/mach:${S}/third_party/python/jsmin:${S}/python/mozversioncontrol"
+export PYTHONPATH = "${S}/build:\
+${S}/third_party/python/PyYAML/lib3:\
+${S}/testing/mozbase/mozfile:\
+${S}/python/mozboot:\
+${S}/third_party/python/distro:\
+${S}/testing/mozbase/mozinfo:\
+${S}/config:\
+${S}/testing/mozbase/manifestparser:\
+${S}/third_party/python/pytoml:\
+${S}/testing/mozbase/mozprocess:\
+${S}/third_party/python/six:\
+${S}/python/mozbuild:\
+${S}/python/mozbuild/mozbuild:\
+${S}/python/mach:\
+${S}/third_party/python/jsmin:\
+${S}/python/mozversioncontrol"
 
 export HOST_CC = "${BUILD_CC}"
 export HOST_CXX = "${BUILD_CXX}"
diff --git a/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2023.7.bb b/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2023.8.bb
similarity index 98%
rename from meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2023.7.bb
rename to meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2023.8.bb
index d91b0a3..0704c91 100644
--- a/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2023.7.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2023.8.bb
@@ -22,7 +22,7 @@
 SRC_URI = "${GITHUB_BASE_URI}/download/v${PV}/libostree-${PV}.tar.xz \
            file://run-ptest \
            "
-SRC_URI[sha256sum] = "19cda718705f7ac8c018c939c38b1bb8412deaaa04862da98cd9fe9243f073bf"
+SRC_URI[sha256sum] = "b6fffc267188e40d60755e6d7f2be65831795baa53b0fd9dd6c6809c7e54796d"
 
 S = "${WORKDIR}/libostree-${PV}"
 
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0001-jsauthority-Bump-mozjs-to-115.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0001-jsauthority-Bump-mozjs-to-115.patch
new file mode 100644
index 0000000..163a03cf
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0001-jsauthority-Bump-mozjs-to-115.patch
@@ -0,0 +1,26 @@
+From 2f0de2a831ab106fce210c1d65baef041256bc18 Mon Sep 17 00:00:00 2001
+From: Xi Ruoyao <xry111@xry111.site>
+Date: Mon, 18 Sep 2023 01:53:04 +0800
+Subject: [PATCH] jsauthority: Bump mozjs to 115
+
+No code change is needed!
+
+Upstream-Status: Backport [https://gitlab.freedesktop.org/polkit/polkit/-/commit/b340f50b7bb963863ede7c63f9a0b5c50c80c1e1]
+Signed-off-by: Alexander Kanavin <alex@linutronix.de>
+---
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/meson.build b/meson.build
+index 3b96562..92b68fd 100644
+--- a/meson.build
++++ b/meson.build
+@@ -153,7 +153,7 @@ if js_engine == 'duktape'
+   func = 'pthread_condattr_setclock'
+   config_h.set('HAVE_' + func.to_upper(), cc.has_function(func, prefix : '#include <pthread.h>'))
+ elif js_engine == 'mozjs'
+-  js_dep = dependency('mozjs-102')
++  js_dep = dependency('mozjs-115')
+ 
+   _system = host_machine.system().to_lower()
+   if _system.contains('freebsd')
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0001-pkexec-local-privilege-escalation-CVE-2021-4034.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0001-pkexec-local-privilege-escalation-CVE-2021-4034.patch
deleted file mode 100644
index c725c00..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0001-pkexec-local-privilege-escalation-CVE-2021-4034.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 85c2dd9275cdfb369f613089f22733c0f1ba2aec Mon Sep 17 00:00:00 2001
-From: Jan Rybar <jrybar@redhat.com>
-Date: Tue, 25 Jan 2022 17:21:46 +0000
-Subject: [PATCH 1/3] pkexec: local privilege escalation (CVE-2021-4034)
-
-Signed-off-by: Mikko Rapeli <mikko.rapeli@bmw.de>
-
----
- src/programs/pkcheck.c |  5 +++++
- src/programs/pkexec.c  | 23 ++++++++++++++++++++---
- 2 files changed, 25 insertions(+), 3 deletions(-)
-
-CVE: CVE-2021-4034
-Upstream-Status: Backport [a2bf5c9c83b6ae46cbd5c779d3055bff81ded683]
-
-diff --git a/src/programs/pkcheck.c b/src/programs/pkcheck.c
-index f1bb4e1..768525c 100644
---- a/src/programs/pkcheck.c
-+++ b/src/programs/pkcheck.c
-@@ -363,6 +363,11 @@ main (int argc, char *argv[])
-   local_agent_handle = NULL;
-   ret = 126;
- 
-+  if (argc < 1)
-+    {
-+      exit(126);
-+    }
-+
-   /* Disable remote file access from GIO. */
-   setenv ("GIO_USE_VFS", "local", 1);
- 
-diff --git a/src/programs/pkexec.c b/src/programs/pkexec.c
-index 7698c5c..84e5ef6 100644
---- a/src/programs/pkexec.c
-+++ b/src/programs/pkexec.c
-@@ -488,6 +488,15 @@ main (int argc, char *argv[])
-   pid_t pid_of_caller;
-   gpointer local_agent_handle;
- 
-+
-+  /*
-+   * If 'pkexec' is called THIS wrong, someone's probably evil-doing. Don't be nice, just bail out.
-+   */
-+  if (argc<1)
-+    {
-+      exit(127);
-+    }
-+
-   ret = 127;
-   authority = NULL;
-   subject = NULL;
-@@ -614,10 +623,10 @@ main (int argc, char *argv[])
- 
-       path = g_strdup (pwstruct.pw_shell);
-       if (!path)
--	{
-+        {
-           g_printerr ("No shell configured or error retrieving pw_shell\n");
-           goto out;
--	}
-+        }
-       /* If you change this, be sure to change the if (!command_line)
- 	 case below too */
-       command_line = g_strdup (path);
-@@ -636,7 +645,15 @@ main (int argc, char *argv[])
-           goto out;
-         }
-       g_free (path);
--      argv[n] = path = s;
-+      path = s;
-+
-+      /* argc<2 and pkexec runs just shell, argv is guaranteed to be null-terminated.
-+       * /-less shell shouldn't happen, but let's be defensive and don't write to null-termination
-+       */
-+      if (argv[n] != NULL)
-+      {
-+        argv[n] = path;
-+      }
-     }
-   if (access (path, F_OK) != 0)
-     {
--- 
-2.20.1
-
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0002-CVE-2021-4115-GHSL-2021-077-fix.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0002-CVE-2021-4115-GHSL-2021-077-fix.patch
deleted file mode 100644
index fcad872..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0002-CVE-2021-4115-GHSL-2021-077-fix.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From c86aea01a06ad4d6c428137e9cfe2f74b1ae7f01 Mon Sep 17 00:00:00 2001
-From: Jan Rybar <jrybar@redhat.com>
-Date: Mon, 21 Feb 2022 08:29:05 +0000
-Subject: [PATCH 2/3] CVE-2021-4115 (GHSL-2021-077) fix
-
-Signed-off-by: Mikko Rapeli <mikko.rapeli@bmw.de>
-
----
- src/polkit/polkitsystembusname.c | 38 ++++++++++++++++++++++++++++----
- 1 file changed, 34 insertions(+), 4 deletions(-)
-
-CVE: CVE-2021-4115
-Upstream-Status: Backport [41cb093f554da8772362654a128a84dd8a5542a7]
-
-diff --git a/src/polkit/polkitsystembusname.c b/src/polkit/polkitsystembusname.c
-index 8ed1363..2fbf5f1 100644
---- a/src/polkit/polkitsystembusname.c
-+++ b/src/polkit/polkitsystembusname.c
-@@ -62,6 +62,10 @@ enum
-   PROP_NAME,
- };
- 
-+
-+guint8 dbus_call_respond_fails;      // has to be global because of callback
-+
-+
- static void subject_iface_init (PolkitSubjectIface *subject_iface);
- 
- G_DEFINE_TYPE_WITH_CODE (PolkitSystemBusName, polkit_system_bus_name, G_TYPE_OBJECT,
-@@ -364,6 +368,7 @@ on_retrieved_unix_uid_pid (GObject              *src,
-   if (!v)
-     {
-       data->caught_error = TRUE;
-+      dbus_call_respond_fails += 1;
-     }
-   else
-     {
-@@ -405,6 +410,8 @@ polkit_system_bus_name_get_creds_sync (PolkitSystemBusName           *system_bus
-   tmp_context = g_main_context_new ();
-   g_main_context_push_thread_default (tmp_context);
- 
-+  dbus_call_respond_fails = 0;
-+
-   /* Do two async calls as it's basically as fast as one sync call.
-    */
-   g_dbus_connection_call (connection,
-@@ -432,11 +439,34 @@ polkit_system_bus_name_get_creds_sync (PolkitSystemBusName           *system_bus
- 			  on_retrieved_unix_uid_pid,
- 			  &data);
- 
--  while (!((data.retrieved_uid && data.retrieved_pid) || data.caught_error))
--    g_main_context_iteration (tmp_context, TRUE);
-+  while (TRUE)
-+  {
-+    /* If one dbus call returns error, we must wait until the other call
-+     * calls _call_finish(), otherwise fd leak is possible.
-+     * Resolves: GHSL-2021-077
-+    */
- 
--  if (data.caught_error)
--    goto out;
-+    if ( (dbus_call_respond_fails > 1) )
-+    {
-+      // we got two faults, we can leave
-+      goto out;
-+    }
-+
-+    if ((data.caught_error && (data.retrieved_pid || data.retrieved_uid)))
-+    {
-+      // we got one fault and the other call finally finished, we can leave
-+      goto out;
-+    }
-+
-+    if ( !(data.retrieved_uid && data.retrieved_pid) )
-+    {
-+      g_main_context_iteration (tmp_context, TRUE);
-+    }
-+    else
-+    {
-+      break;
-+    }
-+  }
- 
-   if (out_uid)
-     *out_uid = data.uid;
--- 
-2.20.1
-
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0002-jsauthority-port-to-mozjs-91.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0002-jsauthority-port-to-mozjs-91.patch
deleted file mode 100644
index 5b3660d..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0002-jsauthority-port-to-mozjs-91.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 4ce27b66bb07b72cb96d3d43a75108a5a6e7e156 Mon Sep 17 00:00:00 2001
-From: Xi Ruoyao <xry111@mengyan1223.wang>
-Date: Tue, 10 Aug 2021 19:09:42 +0800
-Subject: [PATCH] jsauthority: port to mozjs-91
-
-Upstream-Status: Submitted [https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/92]
-Signed-off-by: Alexander Kanavin <alex@linutronix.de>
----
- configure.ac | 2 +-
- meson.build  | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index d807086..5a7fc11 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -80,7 +80,7 @@ PKG_CHECK_MODULES(GLIB, [gmodule-2.0 gio-unix-2.0 >= 2.30.0])
- AC_SUBST(GLIB_CFLAGS)
- AC_SUBST(GLIB_LIBS)
- 
--PKG_CHECK_MODULES(LIBJS, [mozjs-78])
-+PKG_CHECK_MODULES(LIBJS, [mozjs-91])
- 
- AC_SUBST(LIBJS_CFLAGS)
- AC_SUBST(LIBJS_CXXFLAGS)
-diff --git a/meson.build b/meson.build
-index b3702be..733bbff 100644
---- a/meson.build
-+++ b/meson.build
-@@ -126,7 +126,7 @@ expat_dep = dependency('expat')
- assert(cc.has_header('expat.h', dependencies: expat_dep), 'Can\'t find expat.h. Please install expat.')
- assert(cc.has_function('XML_ParserCreate', dependencies: expat_dep), 'Can\'t find expat library. Please install expat.')
- 
--mozjs_dep = dependency('mozjs-78')
-+mozjs_dep = dependency('mozjs-91')
- 
- dbus_dep = dependency('dbus-1')
- dbus_confdir = dbus_dep.get_pkgconfig_variable('datadir', define_variable: ['datadir', pk_prefix / pk_datadir])   #changed from sysconfdir with respect to commit#8eada3836465838
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0003-Added-support-for-duktape-as-JS-engine.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0003-Added-support-for-duktape-as-JS-engine.patch
deleted file mode 100644
index b8562f8..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0003-Added-support-for-duktape-as-JS-engine.patch
+++ /dev/null
@@ -1,3459 +0,0 @@
-From 4af72493cb380ab5ce0dd7c5bcd25a8b5457d770 Mon Sep 17 00:00:00 2001
-From: Gustavo Lima Chaves <limachaves@gmail.com>
-Date: Tue, 25 Jan 2022 09:43:21 +0000
-Subject: [PATCH] Added support for duktape as JS engine
-
-Original author: Wu Xiaotian (@yetist)
-Resurrection author, runaway-killer author: Gustavo Lima Chaves (@limachaves)
-
-Signed-off-by: Mikko Rapeli <mikko.rapeli@bmw.de>
-
-Upstream-Status: Backport [c7fc4e1b61f0fd82fc697c19c604af7e9fb291a2]
-Dropped change to .gitlab-ci.yml and adapted configure.ac due to other
-patches in meta-oe.
-
----
- buildutil/ax_pthread.m4                       |  522 ++++++++
- configure.ac                                  |   34 +-
- docs/man/polkit.xml                           |    4 +-
- meson.build                                   |   16 +-
- meson_options.txt                             |    1 +
- src/polkitbackend/Makefile.am                 |   17 +-
- src/polkitbackend/meson.build                 |   14 +-
- src/polkitbackend/polkitbackendcommon.c       |  530 +++++++++
- src/polkitbackend/polkitbackendcommon.h       |  158 +++
- .../polkitbackendduktapeauthority.c           | 1051 +++++++++++++++++
- .../polkitbackendjsauthority.cpp              |  721 +----------
- .../etc/polkit-1/rules.d/10-testing.rules     |    6 +-
- .../test-polkitbackendjsauthority.c           |    2 +-
- 13 files changed, 2398 insertions(+), 678 deletions(-)
- create mode 100644 buildutil/ax_pthread.m4
- create mode 100644 src/polkitbackend/polkitbackendcommon.c
- create mode 100644 src/polkitbackend/polkitbackendcommon.h
- create mode 100644 src/polkitbackend/polkitbackendduktapeauthority.c
-
-diff --git a/buildutil/ax_pthread.m4 b/buildutil/ax_pthread.m4
-new file mode 100644
-index 0000000..9f35d13
---- /dev/null
-+++ b/buildutil/ax_pthread.m4
-@@ -0,0 +1,522 @@
-+# ===========================================================================
-+#        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
-+# ===========================================================================
-+#
-+# SYNOPSIS
-+#
-+#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
-+#
-+# DESCRIPTION
-+#
-+#   This macro figures out how to build C programs using POSIX threads. It
-+#   sets the PTHREAD_LIBS output variable to the threads library and linker
-+#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler
-+#   flags that are needed. (The user can also force certain compiler
-+#   flags/libs to be tested by setting these environment variables.)
-+#
-+#   Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
-+#   needed for multi-threaded programs (defaults to the value of CC
-+#   respectively CXX otherwise). (This is necessary on e.g. AIX to use the
-+#   special cc_r/CC_r compiler alias.)
-+#
-+#   NOTE: You are assumed to not only compile your program with these flags,
-+#   but also to link with them as well. For example, you might link with
-+#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
-+#   $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
-+#
-+#   If you are only building threaded programs, you may wish to use these
-+#   variables in your default LIBS, CFLAGS, and CC:
-+#
-+#     LIBS="$PTHREAD_LIBS $LIBS"
-+#     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-+#     CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
-+#     CC="$PTHREAD_CC"
-+#     CXX="$PTHREAD_CXX"
-+#
-+#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-+#   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
-+#   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
-+#
-+#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
-+#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with
-+#   PTHREAD_CFLAGS.
-+#
-+#   ACTION-IF-FOUND is a list of shell commands to run if a threads library
-+#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
-+#   is not found. If ACTION-IF-FOUND is not specified, the default action
-+#   will define HAVE_PTHREAD.
-+#
-+#   Please let the authors know if this macro fails on any platform, or if
-+#   you have any other suggestions or comments. This macro was based on work
-+#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
-+#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
-+#   Alejandro Forero Cuervo to the autoconf macro repository. We are also
-+#   grateful for the helpful feedback of numerous users.
-+#
-+#   Updated for Autoconf 2.68 by Daniel Richard G.
-+#
-+# LICENSE
-+#
-+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-+#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
-+#   Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
-+#
-+#   This program is free software: you can redistribute it and/or modify it
-+#   under the terms of the GNU General Public License as published by the
-+#   Free Software Foundation, either version 3 of the License, or (at your
-+#   option) any later version.
-+#
-+#   This program is distributed in the hope that it will be useful, but
-+#   WITHOUT ANY WARRANTY; without even the implied warranty of
-+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-+#   Public License for more details.
-+#
-+#   You should have received a copy of the GNU General Public License along
-+#   with this program. If not, see <https://www.gnu.org/licenses/>.
-+#
-+#   As a special exception, the respective Autoconf Macro's copyright owner
-+#   gives unlimited permission to copy, distribute and modify the configure
-+#   scripts that are the output of Autoconf when processing the Macro. You
-+#   need not follow the terms of the GNU General Public License when using
-+#   or distributing such scripts, even though portions of the text of the
-+#   Macro appear in them. The GNU General Public License (GPL) does govern
-+#   all other use of the material that constitutes the Autoconf Macro.
-+#
-+#   This special exception to the GPL applies to versions of the Autoconf
-+#   Macro released by the Autoconf Archive. When you make and distribute a
-+#   modified version of the Autoconf Macro, you may extend this special
-+#   exception to the GPL to apply to your modified version as well.
-+
-+#serial 31
-+
-+AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
-+AC_DEFUN([AX_PTHREAD], [
-+AC_REQUIRE([AC_CANONICAL_HOST])
-+AC_REQUIRE([AC_PROG_CC])
-+AC_REQUIRE([AC_PROG_SED])
-+AC_LANG_PUSH([C])
-+ax_pthread_ok=no
-+
-+# We used to check for pthread.h first, but this fails if pthread.h
-+# requires special compiler flags (e.g. on Tru64 or Sequent).
-+# It gets checked for in the link test anyway.
-+
-+# First of all, check if the user has set any of the PTHREAD_LIBS,
-+# etcetera environment variables, and if threads linking works using
-+# them:
-+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
-+        ax_pthread_save_CC="$CC"
-+        ax_pthread_save_CFLAGS="$CFLAGS"
-+        ax_pthread_save_LIBS="$LIBS"
-+        AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
-+        AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"])
-+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-+        LIBS="$PTHREAD_LIBS $LIBS"
-+        AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
-+        AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
-+        AC_MSG_RESULT([$ax_pthread_ok])
-+        if test "x$ax_pthread_ok" = "xno"; then
-+                PTHREAD_LIBS=""
-+                PTHREAD_CFLAGS=""
-+        fi
-+        CC="$ax_pthread_save_CC"
-+        CFLAGS="$ax_pthread_save_CFLAGS"
-+        LIBS="$ax_pthread_save_LIBS"
-+fi
-+
-+# We must check for the threads library under a number of different
-+# names; the ordering is very important because some systems
-+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
-+# libraries is broken (non-POSIX).
-+
-+# Create a list of thread flags to try. Items with a "," contain both
-+# C compiler flags (before ",") and linker flags (after ","). Other items
-+# starting with a "-" are C compiler flags, and remaining items are
-+# library names, except for "none" which indicates that we try without
-+# any flags at all, and "pthread-config" which is a program returning
-+# the flags for the Pth emulation library.
-+
-+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
-+
-+# The ordering *is* (sometimes) important.  Some notes on the
-+# individual items follow:
-+
-+# pthreads: AIX (must check this before -lpthread)
-+# none: in case threads are in libc; should be tried before -Kthread and
-+#       other compiler flags to prevent continual compiler warnings
-+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
-+#           (Note: HP C rejects this with "bad form for `-t' option")
-+# -pthreads: Solaris/gcc (Note: HP C also rejects)
-+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-+#      doesn't hurt to check since this sometimes defines pthreads and
-+#      -D_REENTRANT too), HP C (must be checked before -lpthread, which
-+#      is present but should not be used directly; and before -mthreads,
-+#      because the compiler interprets this as "-mt" + "-hreads")
-+# -mthreads: Mingw32/gcc, Lynx/gcc
-+# pthread: Linux, etcetera
-+# --thread-safe: KAI C++
-+# pthread-config: use pthread-config program (for GNU Pth library)
-+
-+case $host_os in
-+
-+        freebsd*)
-+
-+        # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-+        # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-+
-+        ax_pthread_flags="-kthread lthread $ax_pthread_flags"
-+        ;;
-+
-+        hpux*)
-+
-+        # From the cc(1) man page: "[-mt] Sets various -D flags to enable
-+        # multi-threading and also sets -lpthread."
-+
-+        ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
-+        ;;
-+
-+        openedition*)
-+
-+        # IBM z/OS requires a feature-test macro to be defined in order to
-+        # enable POSIX threads at all, so give the user a hint if this is
-+        # not set. (We don't define these ourselves, as they can affect
-+        # other portions of the system API in unpredictable ways.)
-+
-+        AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
-+            [
-+#            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
-+             AX_PTHREAD_ZOS_MISSING
-+#            endif
-+            ],
-+            [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
-+        ;;
-+
-+        solaris*)
-+
-+        # On Solaris (at least, for some versions), libc contains stubbed
-+        # (non-functional) versions of the pthreads routines, so link-based
-+        # tests will erroneously succeed. (N.B.: The stubs are missing
-+        # pthread_cleanup_push, or rather a function called by this macro,
-+        # so we could check for that, but who knows whether they'll stub
-+        # that too in a future libc.)  So we'll check first for the
-+        # standard Solaris way of linking pthreads (-mt -lpthread).
-+
-+        ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
-+        ;;
-+esac
-+
-+# Are we compiling with Clang?
-+
-+AC_CACHE_CHECK([whether $CC is Clang],
-+    [ax_cv_PTHREAD_CLANG],
-+    [ax_cv_PTHREAD_CLANG=no
-+     # Note that Autoconf sets GCC=yes for Clang as well as GCC
-+     if test "x$GCC" = "xyes"; then
-+        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
-+            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
-+#            if defined(__clang__) && defined(__llvm__)
-+             AX_PTHREAD_CC_IS_CLANG
-+#            endif
-+            ],
-+            [ax_cv_PTHREAD_CLANG=yes])
-+     fi
-+    ])
-+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
-+
-+
-+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
-+
-+# Note that for GCC and Clang -pthread generally implies -lpthread,
-+# except when -nostdlib is passed.
-+# This is problematic using libtool to build C++ shared libraries with pthread:
-+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
-+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
-+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
-+# To solve this, first try -pthread together with -lpthread for GCC
-+
-+AS_IF([test "x$GCC" = "xyes"],
-+      [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
-+
-+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
-+
-+AS_IF([test "x$ax_pthread_clang" = "xyes"],
-+      [ax_pthread_flags="-pthread,-lpthread -pthread"])
-+
-+
-+# The presence of a feature test macro requesting re-entrant function
-+# definitions is, on some systems, a strong hint that pthreads support is
-+# correctly enabled
-+
-+case $host_os in
-+        darwin* | hpux* | linux* | osf* | solaris*)
-+        ax_pthread_check_macro="_REENTRANT"
-+        ;;
-+
-+        aix*)
-+        ax_pthread_check_macro="_THREAD_SAFE"
-+        ;;
-+
-+        *)
-+        ax_pthread_check_macro="--"
-+        ;;
-+esac
-+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
-+      [ax_pthread_check_cond=0],
-+      [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
-+
-+
-+if test "x$ax_pthread_ok" = "xno"; then
-+for ax_pthread_try_flag in $ax_pthread_flags; do
-+
-+        case $ax_pthread_try_flag in
-+                none)
-+                AC_MSG_CHECKING([whether pthreads work without any flags])
-+                ;;
-+
-+                *,*)
-+                PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
-+                PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
-+                AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
-+                ;;
-+
-+                -*)
-+                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
-+                PTHREAD_CFLAGS="$ax_pthread_try_flag"
-+                ;;
-+
-+                pthread-config)
-+                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
-+                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
-+                PTHREAD_CFLAGS="`pthread-config --cflags`"
-+                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
-+                ;;
-+
-+                *)
-+                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
-+                PTHREAD_LIBS="-l$ax_pthread_try_flag"
-+                ;;
-+        esac
-+
-+        ax_pthread_save_CFLAGS="$CFLAGS"
-+        ax_pthread_save_LIBS="$LIBS"
-+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-+        LIBS="$PTHREAD_LIBS $LIBS"
-+
-+        # Check for various functions.  We must include pthread.h,
-+        # since some functions may be macros.  (On the Sequent, we
-+        # need a special flag -Kthread to make this header compile.)
-+        # We check for pthread_join because it is in -lpthread on IRIX
-+        # while pthread_create is in libc.  We check for pthread_attr_init
-+        # due to DEC craziness with -lpthreads.  We check for
-+        # pthread_cleanup_push because it is one of the few pthread
-+        # functions on Solaris that doesn't have a non-functional libc stub.
-+        # We try pthread_create on general principles.
-+
-+        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
-+#                       if $ax_pthread_check_cond
-+#                        error "$ax_pthread_check_macro must be defined"
-+#                       endif
-+                        static void *some_global = NULL;
-+                        static void routine(void *a)
-+                          {
-+                             /* To avoid any unused-parameter or
-+                                unused-but-set-parameter warning.  */
-+                             some_global = a;
-+                          }
-+                        static void *start_routine(void *a) { return a; }],
-+                       [pthread_t th; pthread_attr_t attr;
-+                        pthread_create(&th, 0, start_routine, 0);
-+                        pthread_join(th, 0);
-+                        pthread_attr_init(&attr);
-+                        pthread_cleanup_push(routine, 0);
-+                        pthread_cleanup_pop(0) /* ; */])],
-+            [ax_pthread_ok=yes],
-+            [])
-+
-+        CFLAGS="$ax_pthread_save_CFLAGS"
-+        LIBS="$ax_pthread_save_LIBS"
-+
-+        AC_MSG_RESULT([$ax_pthread_ok])
-+        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
-+
-+        PTHREAD_LIBS=""
-+        PTHREAD_CFLAGS=""
-+done
-+fi
-+
-+
-+# Clang needs special handling, because older versions handle the -pthread
-+# option in a rather... idiosyncratic way
-+
-+if test "x$ax_pthread_clang" = "xyes"; then
-+
-+        # Clang takes -pthread; it has never supported any other flag
-+
-+        # (Note 1: This will need to be revisited if a system that Clang
-+        # supports has POSIX threads in a separate library.  This tends not
-+        # to be the way of modern systems, but it's conceivable.)
-+
-+        # (Note 2: On some systems, notably Darwin, -pthread is not needed
-+        # to get POSIX threads support; the API is always present and
-+        # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
-+        # -pthread does define _REENTRANT, and while the Darwin headers
-+        # ignore this macro, third-party headers might not.)
-+
-+        # However, older versions of Clang make a point of warning the user
-+        # that, in an invocation where only linking and no compilation is
-+        # taking place, the -pthread option has no effect ("argument unused
-+        # during compilation").  They expect -pthread to be passed in only
-+        # when source code is being compiled.
-+        #
-+        # Problem is, this is at odds with the way Automake and most other
-+        # C build frameworks function, which is that the same flags used in
-+        # compilation (CFLAGS) are also used in linking.  Many systems
-+        # supported by AX_PTHREAD require exactly this for POSIX threads
-+        # support, and in fact it is often not straightforward to specify a
-+        # flag that is used only in the compilation phase and not in
-+        # linking.  Such a scenario is extremely rare in practice.
-+        #
-+        # Even though use of the -pthread flag in linking would only print
-+        # a warning, this can be a nuisance for well-run software projects
-+        # that build with -Werror.  So if the active version of Clang has
-+        # this misfeature, we search for an option to squash it.
-+
-+        AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
-+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
-+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
-+             # Create an alternate version of $ac_link that compiles and
-+             # links in two steps (.c -> .o, .o -> exe) instead of one
-+             # (.c -> exe), because the warning occurs only in the second
-+             # step
-+             ax_pthread_save_ac_link="$ac_link"
-+             ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
-+             ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"`
-+             ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
-+             ax_pthread_save_CFLAGS="$CFLAGS"
-+             for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
-+                AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
-+                CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
-+                ac_link="$ax_pthread_save_ac_link"
-+                AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
-+                    [ac_link="$ax_pthread_2step_ac_link"
-+                     AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
-+                         [break])
-+                    ])
-+             done
-+             ac_link="$ax_pthread_save_ac_link"
-+             CFLAGS="$ax_pthread_save_CFLAGS"
-+             AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
-+             ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
-+            ])
-+
-+        case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
-+                no | unknown) ;;
-+                *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
-+        esac
-+
-+fi # $ax_pthread_clang = yes
-+
-+
-+
-+# Various other checks:
-+if test "x$ax_pthread_ok" = "xyes"; then
-+        ax_pthread_save_CFLAGS="$CFLAGS"
-+        ax_pthread_save_LIBS="$LIBS"
-+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-+        LIBS="$PTHREAD_LIBS $LIBS"
-+
-+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
-+        AC_CACHE_CHECK([for joinable pthread attribute],
-+            [ax_cv_PTHREAD_JOINABLE_ATTR],
-+            [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
-+             for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
-+                 AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
-+                                                 [int attr = $ax_pthread_attr; return attr /* ; */])],
-+                                [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
-+                                [])
-+             done
-+            ])
-+        AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
-+               test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
-+               test "x$ax_pthread_joinable_attr_defined" != "xyes"],
-+              [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
-+                                  [$ax_cv_PTHREAD_JOINABLE_ATTR],
-+                                  [Define to necessary symbol if this constant
-+                                   uses a non-standard name on your system.])
-+               ax_pthread_joinable_attr_defined=yes
-+              ])
-+
-+        AC_CACHE_CHECK([whether more special flags are required for pthreads],
-+            [ax_cv_PTHREAD_SPECIAL_FLAGS],
-+            [ax_cv_PTHREAD_SPECIAL_FLAGS=no
-+             case $host_os in
-+             solaris*)
-+             ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
-+             ;;
-+             esac
-+            ])
-+        AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
-+               test "x$ax_pthread_special_flags_added" != "xyes"],
-+              [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
-+               ax_pthread_special_flags_added=yes])
-+
-+        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
-+            [ax_cv_PTHREAD_PRIO_INHERIT],
-+            [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
-+                                             [[int i = PTHREAD_PRIO_INHERIT;
-+                                               return i;]])],
-+                            [ax_cv_PTHREAD_PRIO_INHERIT=yes],
-+                            [ax_cv_PTHREAD_PRIO_INHERIT=no])
-+            ])
-+        AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
-+               test "x$ax_pthread_prio_inherit_defined" != "xyes"],
-+              [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
-+               ax_pthread_prio_inherit_defined=yes
-+              ])
-+
-+        CFLAGS="$ax_pthread_save_CFLAGS"
-+        LIBS="$ax_pthread_save_LIBS"
-+
-+        # More AIX lossage: compile with *_r variant
-+        if test "x$GCC" != "xyes"; then
-+            case $host_os in
-+                aix*)
-+                AS_CASE(["x/$CC"],
-+                    [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
-+                    [#handle absolute path differently from PATH based program lookup
-+                     AS_CASE(["x$CC"],
-+                         [x/*],
-+                         [
-+			   AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])
-+			   AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])])
-+			 ],
-+                         [
-+			   AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])
-+			   AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])])
-+			 ]
-+                     )
-+                    ])
-+                ;;
-+            esac
-+        fi
-+fi
-+
-+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
-+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
-+
-+AC_SUBST([PTHREAD_LIBS])
-+AC_SUBST([PTHREAD_CFLAGS])
-+AC_SUBST([PTHREAD_CC])
-+AC_SUBST([PTHREAD_CXX])
-+
-+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-+if test "x$ax_pthread_ok" = "xyes"; then
-+        ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
-+        :
-+else
-+        ax_pthread_ok=no
-+        $2
-+fi
-+AC_LANG_POP
-+])dnl AX_PTHREAD
-diff --git a/configure.ac b/configure.ac
-index b625743..bbf4768 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -80,11 +80,22 @@ PKG_CHECK_MODULES(GLIB, [gmodule-2.0 gio-unix-2.0 >= 2.30.0])
- AC_SUBST(GLIB_CFLAGS)
- AC_SUBST(GLIB_LIBS)
- 
--PKG_CHECK_MODULES(LIBJS, [mozjs-78])
--
--AC_SUBST(LIBJS_CFLAGS)
--AC_SUBST(LIBJS_CXXFLAGS)
--AC_SUBST(LIBJS_LIBS)
-+dnl ---------------------------------------------------------------------------
-+dnl - Check javascript backend
-+dnl ---------------------------------------------------------------------------
-+AC_ARG_WITH(duktape, AS_HELP_STRING([--with-duktape],[Use Duktape as javascript backend]),with_duktape=yes,with_duktape=no)
-+AS_IF([test x${with_duktape} == xyes], [
-+  PKG_CHECK_MODULES(LIBJS, [duktape >= 2.2.0 ])
-+  AC_SUBST(LIBJS_CFLAGS)
-+  AC_SUBST(LIBJS_LIBS)
-+], [
-+  PKG_CHECK_MODULES(LIBJS, [mozjs-78])
-+
-+  AC_SUBST(LIBJS_CFLAGS)
-+  AC_SUBST(LIBJS_CXXFLAGS)
-+  AC_SUBST(LIBJS_LIBS)
-+])
-+AM_CONDITIONAL(USE_DUKTAPE, [test x$with_duktape == xyes], [Using duktape as javascript engine library])
- 
- EXPAT_LIB=""
- AC_ARG_WITH(expat, [  --with-expat=<dir>      Use expat from here],
-@@ -100,6 +111,12 @@ AC_CHECK_LIB(expat,XML_ParserCreate,[EXPAT_LIBS="-lexpat"],
- 	     [AC_MSG_ERROR([Can't find expat library. Please install expat.])])
- AC_SUBST(EXPAT_LIBS)
- 
-+AX_PTHREAD([], [AC_MSG_ERROR([Cannot find the way to enable pthread support.])])
-+LIBS="$PTHREAD_LIBS $LIBS"
-+CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-+CC="$PTHREAD_CC"
-+AC_CHECK_FUNCS([pthread_condattr_setclock])
-+
- AC_CHECK_FUNCS(clearenv fdatasync)
- 
- if test "x$GCC" = "xyes"; then
-@@ -581,6 +598,13 @@ echo "
-         PAM support:                ${have_pam}
-         systemdsystemunitdir:       ${systemdsystemunitdir}
-         polkitd user:               ${POLKITD_USER}"
-+if test "x${with_duktape}" = xyes; then
-+echo "
-+        Javascript engine:          Duktape"
-+else
-+echo "
-+        Javascript engine:          Mozjs"
-+fi
- 
- if test "$have_pam" = yes ; then
- echo "
-diff --git a/docs/man/polkit.xml b/docs/man/polkit.xml
-index 99aa474..90715a5 100644
---- a/docs/man/polkit.xml
-+++ b/docs/man/polkit.xml
-@@ -639,7 +639,9 @@ polkit.Result = {
-         If user-provided code takes a long time to execute, an exception
-         will be thrown which normally results in the function being
-         terminated (the current limit is 15 seconds). This is used to
--        catch runaway scripts.
-+        catch runaway scripts. If the duktape JavaScript backend is
-+        compiled in, instead of mozjs, no exception will be thrown—the
-+        script will be killed right away (same timeout).
-       </para>
- 
-       <para>
-diff --git a/meson.build b/meson.build
-index b3702be..7506231 100644
---- a/meson.build
-+++ b/meson.build
-@@ -126,7 +126,18 @@ expat_dep = dependency('expat')
- assert(cc.has_header('expat.h', dependencies: expat_dep), 'Can\'t find expat.h. Please install expat.')
- assert(cc.has_function('XML_ParserCreate', dependencies: expat_dep), 'Can\'t find expat library. Please install expat.')
- 
--mozjs_dep = dependency('mozjs-78')
-+duktape_req_version = '>= 2.2.0'
-+
-+js_engine = get_option('js_engine')
-+if js_engine == 'duktape'
-+  js_dep = dependency('duktape', version: duktape_req_version)
-+  libm_dep = cc.find_library('m')
-+  thread_dep = dependency('threads')
-+  func = 'pthread_condattr_setclock'
-+  config_h.set('HAVE_' + func.to_upper(), cc.has_function(func, prefix : '#include <pthread.h>'))
-+elif js_engine == 'mozjs'
-+  js_dep = dependency('mozjs-78')
-+endif
- 
- dbus_dep = dependency('dbus-1')
- dbus_confdir = dbus_dep.get_pkgconfig_variable('datadir', define_variable: ['datadir', pk_prefix / pk_datadir])   #changed from sysconfdir with respect to commit#8eada3836465838
-@@ -350,6 +361,9 @@ if enable_logind
-   output += '        systemdsystemunitdir:     ' + systemd_systemdsystemunitdir + '\n'
- endif
- output += '        polkitd user:             ' + polkitd_user + ' \n'
-+output += '        Javascript engine:        ' + js_engine + '\n'
-+if enable_logind
-+endif
- output += '        PAM support:              ' + enable_pam.to_string() + '\n\n'
- if enable_pam
-   output += '        PAM file auth:            ' + pam_conf['PAM_FILE_INCLUDE_AUTH'] + '\n'
-diff --git a/meson_options.txt b/meson_options.txt
-index 25e3e77..76aa311 100644
---- a/meson_options.txt
-+++ b/meson_options.txt
-@@ -16,3 +16,4 @@ option('introspection', type: 'boolean', value: true, description: 'Enable intro
- 
- option('gtk_doc', type: 'boolean', value: false, description: 'use gtk-doc to build documentation')
- option('man', type: 'boolean', value: false, description: 'build manual pages')
-+option('js_engine', type: 'combo', choices: ['mozjs', 'duktape'], value: 'duktape', description: 'javascript engine')
-diff --git a/src/polkitbackend/Makefile.am b/src/polkitbackend/Makefile.am
-index 7e3c080..935fb98 100644
---- a/src/polkitbackend/Makefile.am
-+++ b/src/polkitbackend/Makefile.am
-@@ -17,6 +17,8 @@ AM_CPPFLAGS =                                                   \
-         -DPACKAGE_LIB_DIR=\""$(libdir)"\"                       \
-         -D_POSIX_PTHREAD_SEMANTICS                              \
-         -D_REENTRANT                                            \
-+        -D_XOPEN_SOURCE=700                                     \
-+        -D_GNU_SOURCE=1                                         \
-         $(NULL)
- 
- noinst_LTLIBRARIES=libpolkit-backend-1.la
-@@ -31,9 +33,10 @@ libpolkit_backend_1_la_SOURCES =                                   			\
-         polkitbackend.h									\
- 	polkitbackendtypes.h								\
- 	polkitbackendprivate.h								\
-+	polkitbackendcommon.h			polkitbackendcommon.c			\
- 	polkitbackendauthority.h		polkitbackendauthority.c		\
- 	polkitbackendinteractiveauthority.h	polkitbackendinteractiveauthority.c	\
--	polkitbackendjsauthority.h		polkitbackendjsauthority.cpp		\
-+	polkitbackendjsauthority.h				\
- 	polkitbackendactionpool.h		polkitbackendactionpool.c		\
- 	polkitbackendactionlookup.h		polkitbackendactionlookup.c		\
-         $(NULL)
-@@ -51,19 +54,27 @@ libpolkit_backend_1_la_CFLAGS =                                        	\
-         -D_POLKIT_BACKEND_COMPILATION                                  	\
-         $(GLIB_CFLAGS)							\
- 	$(LIBSYSTEMD_CFLAGS)						\
--	$(LIBJS_CFLAGS)							\
-+	$(LIBJS_CFLAGS)						\
-         $(NULL)
- 
- libpolkit_backend_1_la_CXXFLAGS = $(libpolkit_backend_1_la_CFLAGS)
- 
- libpolkit_backend_1_la_LIBADD =                               		\
-         $(GLIB_LIBS)							\
-+        $(DUKTAPE_LIBS)							\
- 	$(LIBSYSTEMD_LIBS)						\
- 	$(top_builddir)/src/polkit/libpolkit-gobject-1.la		\
- 	$(EXPAT_LIBS)							\
--	$(LIBJS_LIBS)							\
-+	$(LIBJS_LIBS)                                                   \
-         $(NULL)
- 
-+if USE_DUKTAPE
-+libpolkit_backend_1_la_SOURCES += polkitbackendduktapeauthority.c
-+libpolkit_backend_1_la_LIBADD += -lm
-+else
-+libpolkit_backend_1_la_SOURCES += polkitbackendjsauthority.cpp
-+endif
-+
- rulesdir = $(sysconfdir)/polkit-1/rules.d
- rules_DATA = 50-default.rules
- 
-diff --git a/src/polkitbackend/meson.build b/src/polkitbackend/meson.build
-index 93c3c34..99f8e33 100644
---- a/src/polkitbackend/meson.build
-+++ b/src/polkitbackend/meson.build
-@@ -4,8 +4,8 @@ sources = files(
-   'polkitbackendactionlookup.c',
-   'polkitbackendactionpool.c',
-   'polkitbackendauthority.c',
-+  'polkitbackendcommon.c',
-   'polkitbackendinteractiveauthority.c',
--  'polkitbackendjsauthority.cpp',
- )
- 
- output = 'initjs.h'
-@@ -21,7 +21,7 @@ sources += custom_target(
- deps = [
-   expat_dep,
-   libpolkit_gobject_dep,
--  mozjs_dep,
-+  js_dep,
- ]
- 
- c_flags = [
-@@ -29,8 +29,18 @@ c_flags = [
-   '-D_POLKIT_BACKEND_COMPILATION',
-   '-DPACKAGE_DATA_DIR="@0@"'.format(pk_prefix / pk_datadir),
-   '-DPACKAGE_SYSCONF_DIR="@0@"'.format(pk_prefix / pk_sysconfdir),
-+  '-D_XOPEN_SOURCE=700',
-+  '-D_GNU_SOURCE=1',
- ]
- 
-+if js_engine == 'duktape'
-+  sources += files('polkitbackendduktapeauthority.c')
-+  deps += libm_dep
-+  deps += thread_dep
-+elif js_engine == 'mozjs'
-+  sources += files('polkitbackendjsauthority.cpp')
-+endif
-+
- if enable_logind
-   sources += files('polkitbackendsessionmonitor-systemd.c')
- 
-diff --git a/src/polkitbackend/polkitbackendcommon.c b/src/polkitbackend/polkitbackendcommon.c
-new file mode 100644
-index 0000000..6783dff
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendcommon.c
-@@ -0,0 +1,530 @@
-+/*
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#include "polkitbackendcommon.h"
-+
-+static void
-+utils_child_watch_from_release_cb (GPid     pid,
-+                                   gint     status,
-+                                   gpointer user_data)
-+{
-+}
-+
-+static void
-+utils_spawn_data_free (UtilsSpawnData *data)
-+{
-+  if (data->timeout_source != NULL)
-+    {
-+      g_source_destroy (data->timeout_source);
-+      data->timeout_source = NULL;
-+    }
-+
-+  /* Nuke the child, if necessary */
-+  if (data->child_watch_source != NULL)
-+    {
-+      g_source_destroy (data->child_watch_source);
-+      data->child_watch_source = NULL;
-+    }
-+
-+  if (data->child_pid != 0)
-+    {
-+      GSource *source;
-+      kill (data->child_pid, SIGTERM);
-+      /* OK, we need to reap for the child ourselves - we don't want
-+       * to use waitpid() because that might block the calling
-+       * thread (the child might handle SIGTERM and use several
-+       * seconds for cleanup/rollback).
-+       *
-+       * So we use GChildWatch instead.
-+       *
-+       * Avoid taking a references to ourselves. but note that we need
-+       * to pass the GSource so we can nuke it once handled.
-+       */
-+      source = g_child_watch_source_new (data->child_pid);
-+      g_source_set_callback (source,
-+                             (GSourceFunc) utils_child_watch_from_release_cb,
-+                             source,
-+                             (GDestroyNotify) g_source_destroy);
-+      g_source_attach (source, data->main_context);
-+      g_source_unref (source);
-+      data->child_pid = 0;
-+    }
-+
-+  if (data->child_stdout != NULL)
-+    {
-+      g_string_free (data->child_stdout, TRUE);
-+      data->child_stdout = NULL;
-+    }
-+
-+  if (data->child_stderr != NULL)
-+    {
-+      g_string_free (data->child_stderr, TRUE);
-+      data->child_stderr = NULL;
-+    }
-+
-+  if (data->child_stdout_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stdout_channel);
-+      data->child_stdout_channel = NULL;
-+    }
-+  if (data->child_stderr_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stderr_channel);
-+      data->child_stderr_channel = NULL;
-+    }
-+
-+  if (data->child_stdout_source != NULL)
-+    {
-+      g_source_destroy (data->child_stdout_source);
-+      data->child_stdout_source = NULL;
-+    }
-+  if (data->child_stderr_source != NULL)
-+    {
-+      g_source_destroy (data->child_stderr_source);
-+      data->child_stderr_source = NULL;
-+    }
-+
-+  if (data->child_stdout_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stdout_fd) == 0);
-+      data->child_stdout_fd = -1;
-+    }
-+  if (data->child_stderr_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stderr_fd) == 0);
-+      data->child_stderr_fd = -1;
-+    }
-+
-+  if (data->cancellable_handler_id > 0)
-+    {
-+      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
-+      data->cancellable_handler_id = 0;
-+    }
-+
-+  if (data->main_context != NULL)
-+    g_main_context_unref (data->main_context);
-+
-+  if (data->cancellable != NULL)
-+    g_object_unref (data->cancellable);
-+
-+  g_slice_free (UtilsSpawnData, data);
-+}
-+
-+/* called in the thread where @cancellable was cancelled */
-+static void
-+utils_on_cancelled (GCancellable *cancellable,
-+                    gpointer      user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  GError *error;
-+
-+  error = NULL;
-+  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
-+  g_simple_async_result_take_error (data->simple, error);
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_timeout_cb (gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+
-+  data->timed_out = TRUE;
-+
-+  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
-+  data->timeout_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+
-+  return FALSE; /* remove source */
-+}
-+
-+static void
-+utils_child_watch_cb (GPid     pid,
-+                      gint     status,
-+                      gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar *buf;
-+  gsize buf_size;
-+
-+  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stdout, buf, buf_size);
-+      g_free (buf);
-+    }
-+  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stderr, buf, buf_size);
-+      g_free (buf);
-+    }
-+
-+  data->exit_status = status;
-+
-+  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
-+  data->child_pid = 0;
-+  data->child_watch_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_read_child_stderr (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stderr, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+static gboolean
-+utils_read_child_stdout (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stdout, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+void
-+polkit_backend_common_spawn (const gchar *const  *argv,
-+                             guint                timeout_seconds,
-+                             GCancellable        *cancellable,
-+                             GAsyncReadyCallback  callback,
-+                             gpointer             user_data)
-+{
-+  UtilsSpawnData *data;
-+  GError *error;
-+
-+  data = g_slice_new0 (UtilsSpawnData);
-+  data->timeout_seconds = timeout_seconds;
-+  data->simple = g_simple_async_result_new (NULL,
-+                                            callback,
-+                                            user_data,
-+                                            (gpointer*)polkit_backend_common_spawn);
-+  data->main_context = g_main_context_get_thread_default ();
-+  if (data->main_context != NULL)
-+    g_main_context_ref (data->main_context);
-+
-+  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
-+
-+  data->child_stdout = g_string_new (NULL);
-+  data->child_stderr = g_string_new (NULL);
-+  data->child_stdout_fd = -1;
-+  data->child_stderr_fd = -1;
-+
-+  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
-+  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
-+
-+  error = NULL;
-+  if (data->cancellable != NULL)
-+    {
-+      /* could already be cancelled */
-+      error = NULL;
-+      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
-+        {
-+          g_simple_async_result_take_error (data->simple, error);
-+          g_simple_async_result_complete_in_idle (data->simple);
-+          g_object_unref (data->simple);
-+          goto out;
-+        }
-+
-+      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
-+                                                            G_CALLBACK (utils_on_cancelled),
-+                                                            data,
-+                                                            NULL);
-+    }
-+
-+  error = NULL;
-+  if (!g_spawn_async_with_pipes (NULL, /* working directory */
-+                                 (gchar **) argv,
-+                                 NULL, /* envp */
-+                                 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
-+                                 NULL, /* child_setup */
-+                                 NULL, /* child_setup's user_data */
-+                                 &(data->child_pid),
-+                                 NULL, /* gint *stdin_fd */
-+                                 &(data->child_stdout_fd),
-+                                 &(data->child_stderr_fd),
-+                                 &error))
-+    {
-+      g_prefix_error (&error, "Error spawning: ");
-+      g_simple_async_result_take_error (data->simple, error);
-+      g_simple_async_result_complete_in_idle (data->simple);
-+      g_object_unref (data->simple);
-+      goto out;
-+    }
-+
-+  if (timeout_seconds > 0)
-+    {
-+      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
-+      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
-+      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
-+      g_source_attach (data->timeout_source, data->main_context);
-+      g_source_unref (data->timeout_source);
-+    }
-+
-+  data->child_watch_source = g_child_watch_source_new (data->child_pid);
-+  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
-+  g_source_attach (data->child_watch_source, data->main_context);
-+  g_source_unref (data->child_watch_source);
-+
-+  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
-+  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
-+  g_source_attach (data->child_stdout_source, data->main_context);
-+  g_source_unref (data->child_stdout_source);
-+
-+  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
-+  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
-+  g_source_attach (data->child_stderr_source, data->main_context);
-+  g_source_unref (data->child_stderr_source);
-+
-+ out:
-+  ;
-+}
-+
-+void
-+polkit_backend_common_on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                              GFile            *file,
-+                                              GFile            *other_file,
-+                                              GFileMonitorEvent event_type,
-+                                              gpointer          user_data)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
-+
-+  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
-+   *       Because when editing a file with emacs we get 4-8 events..
-+   */
-+
-+  if (file != NULL)
-+    {
-+      gchar *name;
-+
-+      name = g_file_get_basename (file);
-+
-+      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
-+      if (!g_str_has_prefix (name, ".") &&
-+          !g_str_has_prefix (name, "#") &&
-+          g_str_has_suffix (name, ".rules") &&
-+          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
-+           event_type == G_FILE_MONITOR_EVENT_DELETED ||
-+           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Reloading rules");
-+          polkit_backend_common_reload_scripts (authority);
-+        }
-+      g_free (name);
-+    }
-+}
-+
-+gboolean
-+polkit_backend_common_spawn_finish (GAsyncResult   *res,
-+                                    gint           *out_exit_status,
-+                                    gchar         **out_standard_output,
-+                                    gchar         **out_standard_error,
-+                                    GError        **error)
-+{
-+  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
-+  UtilsSpawnData *data;
-+  gboolean ret = FALSE;
-+
-+  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
-+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-+
-+  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == polkit_backend_common_spawn);
-+
-+  if (g_simple_async_result_propagate_error (simple, error))
-+    goto out;
-+
-+  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
-+
-+  if (data->timed_out)
-+    {
-+      g_set_error (error,
-+                   G_IO_ERROR,
-+                   G_IO_ERROR_TIMED_OUT,
-+                   "Timed out after %d seconds",
-+                   data->timeout_seconds);
-+      goto out;
-+    }
-+
-+  if (out_exit_status != NULL)
-+    *out_exit_status = data->exit_status;
-+
-+  if (out_standard_output != NULL)
-+    *out_standard_output = g_strdup (data->child_stdout->str);
-+
-+  if (out_standard_error != NULL)
-+    *out_standard_error = g_strdup (data->child_stderr->str);
-+
-+  ret = TRUE;
-+
-+ out:
-+  return ret;
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
-+{
-+  return "js";
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
-+{
-+  return PACKAGE_VERSION;
-+}
-+
-+static PolkitAuthorityFeatures
-+polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
-+{
-+  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
-+}
-+
-+void
-+polkit_backend_common_js_authority_class_init_common (PolkitBackendJsAuthorityClass *klass)
-+{
-+  GObjectClass *gobject_class;
-+  PolkitBackendAuthorityClass *authority_class;
-+  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
-+
-+  gobject_class = G_OBJECT_CLASS (klass);
-+  gobject_class->finalize                               = polkit_backend_common_js_authority_finalize;
-+  gobject_class->set_property                           = polkit_backend_common_js_authority_set_property;
-+  gobject_class->constructed                            = polkit_backend_common_js_authority_constructed;
-+
-+  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
-+  authority_class->get_name                             = polkit_backend_js_authority_get_name;
-+  authority_class->get_version                          = polkit_backend_js_authority_get_version;
-+  authority_class->get_features                         = polkit_backend_js_authority_get_features;
-+
-+  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
-+  interactive_authority_class->get_admin_identities     = polkit_backend_common_js_authority_get_admin_auth_identities;
-+  interactive_authority_class->check_authorization_sync = polkit_backend_common_js_authority_check_authorization_sync;
-+
-+  g_object_class_install_property (gobject_class,
-+                                   PROP_RULES_DIRS,
-+                                   g_param_spec_boxed ("rules-dirs",
-+                                                       NULL,
-+                                                       NULL,
-+                                                       G_TYPE_STRV,
-+                                                       G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
-+}
-+
-+gint
-+polkit_backend_common_rules_file_name_cmp (const gchar *a,
-+                                           const gchar *b)
-+{
-+  gint ret;
-+  const gchar *a_base;
-+  const gchar *b_base;
-+
-+  a_base = strrchr (a, '/');
-+  b_base = strrchr (b, '/');
-+
-+  g_assert (a_base != NULL);
-+  g_assert (b_base != NULL);
-+  a_base += 1;
-+  b_base += 1;
-+
-+  ret = g_strcmp0 (a_base, b_base);
-+  if (ret == 0)
-+    {
-+      /* /etc wins over /usr */
-+      ret = g_strcmp0 (a, b);
-+      g_assert (ret != 0);
-+    }
-+
-+  return ret;
-+}
-+
-+const gchar *
-+polkit_backend_common_get_signal_name (gint signal_number)
-+{
-+  switch (signal_number)
-+    {
-+#define _HANDLE_SIG(sig) case sig: return #sig;
-+    _HANDLE_SIG (SIGHUP);
-+    _HANDLE_SIG (SIGINT);
-+    _HANDLE_SIG (SIGQUIT);
-+    _HANDLE_SIG (SIGILL);
-+    _HANDLE_SIG (SIGABRT);
-+    _HANDLE_SIG (SIGFPE);
-+    _HANDLE_SIG (SIGKILL);
-+    _HANDLE_SIG (SIGSEGV);
-+    _HANDLE_SIG (SIGPIPE);
-+    _HANDLE_SIG (SIGALRM);
-+    _HANDLE_SIG (SIGTERM);
-+    _HANDLE_SIG (SIGUSR1);
-+    _HANDLE_SIG (SIGUSR2);
-+    _HANDLE_SIG (SIGCHLD);
-+    _HANDLE_SIG (SIGCONT);
-+    _HANDLE_SIG (SIGSTOP);
-+    _HANDLE_SIG (SIGTSTP);
-+    _HANDLE_SIG (SIGTTIN);
-+    _HANDLE_SIG (SIGTTOU);
-+    _HANDLE_SIG (SIGBUS);
-+#ifdef SIGPOLL
-+    _HANDLE_SIG (SIGPOLL);
-+#endif
-+    _HANDLE_SIG (SIGPROF);
-+    _HANDLE_SIG (SIGSYS);
-+    _HANDLE_SIG (SIGTRAP);
-+    _HANDLE_SIG (SIGURG);
-+    _HANDLE_SIG (SIGVTALRM);
-+    _HANDLE_SIG (SIGXCPU);
-+    _HANDLE_SIG (SIGXFSZ);
-+#undef _HANDLE_SIG
-+    default:
-+      break;
-+    }
-+  return "UNKNOWN_SIGNAL";
-+}
-+
-+void
-+polkit_backend_common_spawn_cb (GObject       *source_object,
-+                                GAsyncResult  *res,
-+                                gpointer       user_data)
-+{
-+  SpawnData *data = (SpawnData *)user_data;
-+  data->res = (GAsyncResult*)g_object_ref (res);
-+  g_main_loop_quit (data->loop);
-+}
-diff --git a/src/polkitbackend/polkitbackendcommon.h b/src/polkitbackend/polkitbackendcommon.h
-new file mode 100644
-index 0000000..dd700fc
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendcommon.h
-@@ -0,0 +1,158 @@
-+/*
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#if !defined (_POLKIT_BACKEND_COMPILATION) && !defined(_POLKIT_BACKEND_INSIDE_POLKIT_BACKEND_H)
-+#error "Only <polkitbackend/polkitbackend.h> can be included directly, this file may disappear or change contents."
-+#endif
-+
-+#ifndef __POLKIT_BACKEND_COMMON_H
-+#define __POLKIT_BACKEND_COMMON_H
-+
-+#include "config.h"
-+#include <sys/wait.h>
-+#include <errno.h>
-+#include <pwd.h>
-+#include <grp.h>
-+#ifdef HAVE_NETGROUP_H
-+#include <netgroup.h>
-+#else
-+#include <netdb.h>
-+#endif
-+#include <string.h>
-+#include <glib/gstdio.h>
-+#include <locale.h>
-+#include <glib/gi18n-lib.h> //here, all things glib via glib.h (including -> gspawn.h)
-+
-+#include <polkit/polkit.h>
-+#include "polkitbackendjsauthority.h"
-+
-+#include <polkit/polkitprivate.h>
-+
-+#ifdef HAVE_LIBSYSTEMD
-+#include <systemd/sd-login.h>
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+#define RUNAWAY_KILLER_TIMEOUT (15)
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+enum
-+{
-+  PROP_0,
-+  PROP_RULES_DIRS,
-+};
-+
-+typedef struct
-+{
-+  GSimpleAsyncResult *simple; /* borrowed reference */
-+  GMainContext *main_context; /* may be NULL */
-+
-+  GCancellable *cancellable;  /* may be NULL */
-+  gulong cancellable_handler_id;
-+
-+  GPid child_pid;
-+  gint child_stdout_fd;
-+  gint child_stderr_fd;
-+
-+  GIOChannel *child_stdout_channel;
-+  GIOChannel *child_stderr_channel;
-+
-+  GSource *child_watch_source;
-+  GSource *child_stdout_source;
-+  GSource *child_stderr_source;
-+
-+  guint timeout_seconds;
-+  gboolean timed_out;
-+  GSource *timeout_source;
-+
-+  GString *child_stdout;
-+  GString *child_stderr;
-+
-+  gint exit_status;
-+} UtilsSpawnData;
-+
-+typedef struct
-+{
-+  GMainLoop *loop;
-+  GAsyncResult *res;
-+} SpawnData;
-+
-+void polkit_backend_common_spawn (const gchar *const  *argv,
-+                                  guint                timeout_seconds,
-+                                  GCancellable        *cancellable,
-+                                  GAsyncReadyCallback  callback,
-+                                  gpointer             user_data);
-+void polkit_backend_common_spawn_cb (GObject       *source_object,
-+                                     GAsyncResult  *res,
-+                                     gpointer       user_data);
-+gboolean polkit_backend_common_spawn_finish (GAsyncResult   *res,
-+                                             gint           *out_exit_status,
-+                                             gchar         **out_standard_output,
-+                                             gchar         **out_standard_error,
-+                                             GError        **error);
-+
-+void polkit_backend_common_on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                                   GFile            *file,
-+                                                   GFile            *other_file,
-+                                                   GFileMonitorEvent event_type,
-+                                                   gpointer          user_data);
-+
-+void polkit_backend_common_js_authority_class_init_common (PolkitBackendJsAuthorityClass *klass);
-+
-+gint polkit_backend_common_rules_file_name_cmp (const gchar *a,
-+                                                const gchar *b);
-+
-+const gchar *polkit_backend_common_get_signal_name (gint signal_number);
-+
-+/* To be provided by each JS backend, from here onwards  ---------------------------------------------- */
-+
-+void polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority);
-+void polkit_backend_common_js_authority_finalize (GObject *object);
-+void polkit_backend_common_js_authority_constructed (GObject *object);
-+GList *polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                                     PolkitSubject                     *caller,
-+                                                                     PolkitSubject                     *subject,
-+                                                                     PolkitIdentity                    *user_for_subject,
-+                                                                     gboolean                           subject_is_local,
-+                                                                     gboolean                           subject_is_active,
-+                                                                     const gchar                       *action_id,
-+                                                                     PolkitDetails                     *details);
-+void polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                      guint         property_id,
-+                                                      const GValue *value,
-+                                                      GParamSpec   *pspec);
-+PolkitImplicitAuthorization polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                                                         PolkitSubject                     *caller,
-+                                                                                         PolkitSubject                     *subject,
-+                                                                                         PolkitIdentity                    *user_for_subject,
-+                                                                                         gboolean                           subject_is_local,
-+                                                                                         gboolean                           subject_is_active,
-+                                                                                         const gchar                       *action_id,
-+                                                                                         PolkitDetails                     *details,
-+                                                                                         PolkitImplicitAuthorization        implicit);
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* __POLKIT_BACKEND_COMMON_H */
-+
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-new file mode 100644
-index 0000000..c89dbcf
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -0,0 +1,1051 @@
-+/*
-+ * Copyright (C) 2008-2012 Red Hat, Inc.
-+ * Copyright (C) 2015 Tangent Space <jstpierre@mecheye.net>
-+ * Copyright (C) 2019 Wu Xiaotian <yetist@gmail.com>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#include <pthread.h>
-+
-+#include "polkitbackendcommon.h"
-+
-+#include "duktape.h"
-+
-+/* Built source and not too big to worry about deduplication */
-+#include "initjs.h" /* init.js */
-+
-+/**
-+ * SECTION:polkitbackendjsauthority
-+ * @title: PolkitBackendJsAuthority
-+ * @short_description: JS Authority
-+ * @stability: Unstable
-+ *
-+ * An (Duktape-based) implementation of #PolkitBackendAuthority that reads and
-+ * evaluates Javascript files and supports interaction with authentication
-+ * agents (virtue of being based on #PolkitBackendInteractiveAuthority).
-+ */
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+struct _PolkitBackendJsAuthorityPrivate
-+{
-+  gchar **rules_dirs;
-+  GFileMonitor **dir_monitors; /* NULL-terminated array of GFileMonitor instances */
-+
-+  duk_context *cx;
-+
-+  pthread_t runaway_killer_thread;
-+};
-+
-+enum
-+{
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS,
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE,
-+};
-+
-+static gboolean execute_script_with_runaway_killer(PolkitBackendJsAuthority *authority,
-+                                                   const gchar *filename);
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static duk_ret_t js_polkit_log (duk_context *cx);
-+static duk_ret_t js_polkit_spawn (duk_context *cx);
-+static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
-+
-+static const duk_function_list_entry js_polkit_functions[] =
-+{
-+  { "log", js_polkit_log, 1 },
-+  { "spawn", js_polkit_spawn, 1 },
-+  { "_userIsInNetGroup", js_polkit_user_is_in_netgroup, 2 },
-+  { NULL, NULL, 0 },
-+};
-+
-+static void report_error (void     *udata,
-+                          const char *msg)
-+{
-+    PolkitBackendJsAuthority *authority = udata;
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "fatal Duktape JS backend error: %s",
-+                                  (msg ? msg : "no message"));
-+}
-+
-+static void
-+polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-+{
-+  authority->priv = G_TYPE_INSTANCE_GET_PRIVATE (authority,
-+                                                 POLKIT_BACKEND_TYPE_JS_AUTHORITY,
-+                                                 PolkitBackendJsAuthorityPrivate);
-+}
-+
-+static void
-+load_scripts (PolkitBackendJsAuthority  *authority)
-+{
-+  GList *files = NULL;
-+  GList *l;
-+  guint num_scripts = 0;
-+  GError *error = NULL;
-+  guint n;
-+
-+  files = NULL;
-+
-+  for (n = 0; authority->priv->rules_dirs != NULL && authority->priv->rules_dirs[n] != NULL; n++)
-+    {
-+      const gchar *dir_name = authority->priv->rules_dirs[n];
-+      GDir *dir = NULL;
-+
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Loading rules from directory %s",
-+                                    dir_name);
-+
-+      dir = g_dir_open (dir_name,
-+                        0,
-+                        &error);
-+      if (dir == NULL)
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Error opening rules directory: %s (%s, %d)",
-+                                        error->message, g_quark_to_string (error->domain), error->code);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          const gchar *name;
-+          while ((name = g_dir_read_name (dir)) != NULL)
-+            {
-+              if (g_str_has_suffix (name, ".rules"))
-+                files = g_list_prepend (files, g_strdup_printf ("%s/%s", dir_name, name));
-+            }
-+          g_dir_close (dir);
-+        }
-+    }
-+
-+  files = g_list_sort (files, (GCompareFunc) polkit_backend_common_rules_file_name_cmp);
-+
-+  for (l = files; l != NULL; l = l->next)
-+    {
-+      const gchar *filename = (gchar *)l->data;
-+
-+      if (!execute_script_with_runaway_killer(authority, filename))
-+          continue;
-+      num_scripts++;
-+    }
-+
-+  polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                "Finished loading, compiling and executing %d rules",
-+                                num_scripts);
-+  g_list_free_full (files, g_free);
-+}
-+
-+void
-+polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority)
-+{
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error deleting old rules, not loading new ones");
-+      return;
-+  }
-+  duk_push_string (cx, "_deleteRules");
-+
-+  duk_call_prop (cx, 0, 0);
-+
-+  polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                "Collecting garbage unconditionally...");
-+
-+  load_scripts (authority);
-+
-+  /* Let applications know we have new rules... */
-+  g_signal_emit_by_name (authority, "changed");
-+}
-+
-+static void
-+setup_file_monitors (PolkitBackendJsAuthority *authority)
-+{
-+  guint n;
-+  GPtrArray *p;
-+
-+  p = g_ptr_array_new ();
-+  for (n = 0; authority->priv->rules_dirs != NULL && authority->priv->rules_dirs[n] != NULL; n++)
-+    {
-+      GFile *file;
-+      GError *error;
-+      GFileMonitor *monitor;
-+
-+      file = g_file_new_for_path (authority->priv->rules_dirs[n]);
-+      error = NULL;
-+      monitor = g_file_monitor_directory (file,
-+                                          G_FILE_MONITOR_NONE,
-+                                          NULL,
-+                                          &error);
-+      g_object_unref (file);
-+      if (monitor == NULL)
-+        {
-+          g_warning ("Error monitoring directory %s: %s",
-+                     authority->priv->rules_dirs[n],
-+                     error->message);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          g_signal_connect (monitor,
-+                            "changed",
-+                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-+                            authority);
-+          g_ptr_array_add (p, monitor);
-+        }
-+    }
-+  g_ptr_array_add (p, NULL);
-+  authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
-+}
-+
-+void
-+polkit_backend_common_js_authority_constructed (GObject *object)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+  duk_context *cx;
-+
-+  cx = duk_create_heap (NULL, NULL, NULL, authority, report_error);
-+  if (cx == NULL)
-+    goto fail;
-+
-+  authority->priv->cx = cx;
-+
-+  duk_push_global_object (cx);
-+  duk_push_object (cx);
-+  duk_put_function_list (cx, -1, js_polkit_functions);
-+  duk_put_prop_string (cx, -2, "polkit");
-+
-+  /* load polkit objects/functions into JS context (e.g. addRule(),
-+   * _deleteRules(), _runRules() et al)
-+   */
-+  duk_eval_string (cx, init_js);
-+
-+  if (authority->priv->rules_dirs == NULL)
-+    {
-+      authority->priv->rules_dirs = g_new0 (gchar *, 3);
-+      authority->priv->rules_dirs[0] = g_strdup (PACKAGE_SYSCONF_DIR "/polkit-1/rules.d");
-+      authority->priv->rules_dirs[1] = g_strdup (PACKAGE_DATA_DIR "/polkit-1/rules.d");
-+    }
-+
-+  setup_file_monitors (authority);
-+  load_scripts (authority);
-+
-+  G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->constructed (object);
-+  return;
-+
-+ fail:
-+  g_critical ("Error initializing JavaScript environment");
-+  g_assert_not_reached ();
-+}
-+
-+void
-+polkit_backend_common_js_authority_finalize (GObject *object)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+  guint n;
-+
-+  for (n = 0; authority->priv->dir_monitors != NULL && authority->priv->dir_monitors[n] != NULL; n++)
-+    {
-+      GFileMonitor *monitor = authority->priv->dir_monitors[n];
-+      g_signal_handlers_disconnect_by_func (monitor,
-+                                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-+                                            authority);
-+      g_object_unref (monitor);
-+    }
-+  g_free (authority->priv->dir_monitors);
-+  g_strfreev (authority->priv->rules_dirs);
-+
-+  duk_destroy_heap (authority->priv->cx);
-+
-+  G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
-+}
-+
-+void
-+polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                 guint         property_id,
-+                                                 const GValue *value,
-+                                                 GParamSpec   *pspec)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+
-+  switch (property_id)
-+    {
-+      case PROP_RULES_DIRS:
-+        g_assert (authority->priv->rules_dirs == NULL);
-+        authority->priv->rules_dirs = (gchar **) g_value_dup_boxed (value);
-+        break;
-+
-+      default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-+        break;
-+    }
-+}
-+
-+static void
-+polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
-+{
-+  polkit_backend_common_js_authority_class_init_common (klass);
-+  g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static void
-+set_property_str (duk_context *cx,
-+                  const gchar *name,
-+                  const gchar *value)
-+{
-+  duk_push_string (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_strv (duk_context *cx,
-+                   const gchar *name,
-+                   GPtrArray   *value)
-+{
-+  guint n;
-+  duk_push_array (cx);
-+  for (n = 0; n < value->len; n++)
-+    {
-+      duk_push_string (cx, g_ptr_array_index (value, n));
-+      duk_put_prop_index (cx, -2, n);
-+    }
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_int32 (duk_context *cx,
-+                    const gchar *name,
-+                    gint32       value)
-+{
-+  duk_push_int (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_bool (duk_context *cx,
-+                   const char  *name,
-+                   gboolean     value)
-+{
-+  duk_push_boolean (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static gboolean
-+push_subject (duk_context               *cx,
-+              PolkitSubject             *subject,
-+              PolkitIdentity            *user_for_subject,
-+              gboolean                   subject_is_local,
-+              gboolean                   subject_is_active,
-+              GError                   **error)
-+{
-+  gboolean ret = FALSE;
-+  pid_t pid;
-+  uid_t uid;
-+  gchar *user_name = NULL;
-+  GPtrArray *groups = NULL;
-+  struct passwd *passwd;
-+  char *seat_str = NULL;
-+  char *session_str = NULL;
-+
-+  if (!duk_get_global_string (cx, "Subject")) {
-+    return FALSE;
-+  }
-+
-+  duk_new (cx, 0);
-+
-+  if (POLKIT_IS_UNIX_PROCESS (subject))
-+    {
-+      pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (subject));
-+    }
-+  else if (POLKIT_IS_SYSTEM_BUS_NAME (subject))
-+    {
-+      PolkitSubject *process;
-+      process = polkit_system_bus_name_get_process_sync (POLKIT_SYSTEM_BUS_NAME (subject), NULL, error);
-+      if (process == NULL)
-+        goto out;
-+      pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (process));
-+      g_object_unref (process);
-+    }
-+  else
-+    {
-+      g_assert_not_reached ();
-+    }
-+
-+#ifdef HAVE_LIBSYSTEMD
-+  if (sd_pid_get_session (pid, &session_str) == 0)
-+    {
-+      if (sd_session_get_seat (session_str, &seat_str) == 0)
-+        {
-+          /* do nothing */
-+        }
-+    }
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+  g_assert (POLKIT_IS_UNIX_USER (user_for_subject));
-+  uid = polkit_unix_user_get_uid (POLKIT_UNIX_USER (user_for_subject));
-+
-+  groups = g_ptr_array_new_with_free_func (g_free);
-+
-+  passwd = getpwuid (uid);
-+  if (passwd == NULL)
-+    {
-+      user_name = g_strdup_printf ("%d", (gint) uid);
-+      g_warning ("Error looking up info for uid %d: %m", (gint) uid);
-+    }
-+  else
-+    {
-+      gid_t gids[512];
-+      int num_gids = 512;
-+
-+      user_name = g_strdup (passwd->pw_name);
-+
-+      if (getgrouplist (passwd->pw_name,
-+                        passwd->pw_gid,
-+                        gids,
-+                        &num_gids) < 0)
-+        {
-+          g_warning ("Error looking up groups for uid %d: %m", (gint) uid);
-+        }
-+      else
-+        {
-+          gint n;
-+          for (n = 0; n < num_gids; n++)
-+            {
-+              struct group *group;
-+              group = getgrgid (gids[n]);
-+              if (group == NULL)
-+                {
-+                  g_ptr_array_add (groups, g_strdup_printf ("%d", (gint) gids[n]));
-+                }
-+              else
-+                {
-+                  g_ptr_array_add (groups, g_strdup (group->gr_name));
-+                }
-+            }
-+        }
-+    }
-+
-+  set_property_int32 (cx, "pid", pid);
-+  set_property_str (cx, "user", user_name);
-+  set_property_strv (cx, "groups", groups);
-+  set_property_str (cx, "seat", seat_str);
-+  set_property_str (cx, "session", session_str);
-+  set_property_bool (cx, "local", subject_is_local);
-+  set_property_bool (cx, "active", subject_is_active);
-+
-+  ret = TRUE;
-+
-+ out:
-+  free (session_str);
-+  free (seat_str);
-+  g_free (user_name);
-+  if (groups != NULL)
-+    g_ptr_array_unref (groups);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static gboolean
-+push_action_and_details (duk_context               *cx,
-+                         const gchar               *action_id,
-+                         PolkitDetails             *details,
-+                         GError                   **error)
-+{
-+  gchar **keys;
-+  guint n;
-+
-+  if (!duk_get_global_string (cx, "Action")) {
-+    return FALSE;
-+  }
-+
-+  duk_new (cx, 0);
-+
-+  set_property_str (cx, "id", action_id);
-+
-+  keys = polkit_details_get_keys (details);
-+  for (n = 0; keys != NULL && keys[n] != NULL; n++)
-+    {
-+      gchar *key;
-+      const gchar *value;
-+      key = g_strdup_printf ("_detail_%s", keys[n]);
-+      value = polkit_details_lookup (details, keys[n]);
-+      set_property_str (cx, key, value);
-+      g_free (key);
-+    }
-+  g_strfreev (keys);
-+
-+  return TRUE;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+typedef struct {
-+  PolkitBackendJsAuthority *authority;
-+  const gchar *filename;
-+  pthread_cond_t cond;
-+  pthread_mutex_t mutex;
-+  gint ret;
-+} RunawayKillerCtx;
-+
-+static gpointer
-+runaway_killer_thread_execute_js (gpointer user_data)
-+{
-+  RunawayKillerCtx *ctx = user_data;
-+  duk_context *cx = ctx->authority->priv->cx;
-+
-+  int oldtype, pthread_err;
-+
-+  if ((pthread_err = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (ctx->authority),
-+                                  "Error setting thread cancel type: %s",
-+                                  strerror(pthread_err));
-+    goto err;
-+  }
-+
-+  GFile *file = g_file_new_for_path(ctx->filename);
-+  char *contents;
-+  gsize len;
-+
-+  if (!g_file_load_contents(file, NULL, &contents, &len, NULL, NULL)) {
-+    polkit_backend_authority_log(POLKIT_BACKEND_AUTHORITY(ctx->authority),
-+                                 "Error loading script %s", ctx->filename);
-+    g_object_unref(file);
-+    goto err;
-+  }
-+
-+  g_object_unref(file);
-+
-+  /* evaluate the script, trying to print context in any syntax errors
-+     found */
-+  if (duk_peval_lstring(cx, contents, len) != 0)
-+  {
-+    polkit_backend_authority_log(POLKIT_BACKEND_AUTHORITY(ctx->authority),
-+                                 "Error compiling script %s: %s", ctx->filename,
-+                                 duk_safe_to_string(cx, -1));
-+    duk_pop(cx);
-+    goto free_err;
-+  }
-+  g_free(contents);
-+
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+  goto end;
-+
-+free_err:
-+  g_free(contents);
-+err:
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+end:
-+  if ((pthread_err = pthread_cond_signal(&ctx->cond))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (ctx->authority),
-+                                  "Error signaling on condition variable: %s",
-+                                  strerror(pthread_err));
-+    ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+  }
-+  return NULL;
-+}
-+
-+static gpointer
-+runaway_killer_thread_call_js (gpointer user_data)
-+{
-+  RunawayKillerCtx *ctx = user_data;
-+  duk_context *cx = ctx->authority->priv->cx;
-+  int oldtype, pthread_err;
-+
-+  if ((pthread_err = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (ctx->authority),
-+                                  "Error setting thread cancel type: %s",
-+                                  strerror(pthread_err));
-+    goto err;
-+  }
-+
-+  if (duk_pcall_prop (cx, 0, 2) != DUK_EXEC_SUCCESS)
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (ctx->authority),
-+                                    "Error evaluating admin rules: ",
-+                                    duk_safe_to_string (cx, -1));
-+      goto err;
-+    }
-+
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+  goto end;
-+
-+err:
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+end:
-+  if ((pthread_err = pthread_cond_signal(&ctx->cond))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (ctx->authority),
-+                                  "Error signaling on condition variable: %s",
-+                                  strerror(pthread_err));
-+    ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+  }
-+  return NULL;
-+}
-+
-+#if defined (HAVE_PTHREAD_CONDATTR_SETCLOCK)
-+#  if defined(CLOCK_MONOTONIC)
-+#    define PK_CLOCK CLOCK_MONOTONIC
-+#  elif defined(CLOCK_BOOTTIME)
-+#    define PK_CLOCK CLOCK_BOOTTIME
-+#  else
-+     /* No suitable clock */
-+#    undef HAVE_PTHREAD_CONDATTR_SETCLOCK
-+#    define PK_CLOCK CLOCK_REALTIME
-+#  endif
-+#else  /* ! HAVE_PTHREAD_CONDATTR_SETCLOCK */
-+#  define PK_CLOCK CLOCK_REALTIME
-+#endif /* ! HAVE_PTHREAD_CONDATTR_SETCLOCK */
-+
-+static gboolean
-+runaway_killer_common(PolkitBackendJsAuthority *authority, RunawayKillerCtx *ctx, void *js_context_cb (void *user_data))
-+{
-+  int pthread_err;
-+  gboolean cancel = FALSE;
-+  pthread_condattr_t attr;
-+  struct timespec abs_time;
-+
-+#ifdef HAVE_PTHREAD_CONDATTR_SETCLOCK
-+  if ((pthread_err = pthread_condattr_init(&attr))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "Error initializing condition variable attributes: %s",
-+                                  strerror(pthread_err));
-+    return FALSE;
-+  }
-+  if ((pthread_err = pthread_condattr_setclock(&attr, PK_CLOCK))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "Error setting condition variable attributes: %s",
-+                                  strerror(pthread_err));
-+    goto err_clean_condattr;
-+  }
-+  /* Init again, with needed attr */
-+  if ((pthread_err = pthread_cond_init(&ctx->cond, &attr))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "Error initializing condition variable: %s",
-+                                  strerror(pthread_err));
-+    goto err_clean_condattr;
-+  }
-+#endif
-+
-+  if ((pthread_err = pthread_mutex_lock(&ctx->mutex))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "Error locking mutex: %s",
-+                                  strerror(pthread_err));
-+    goto err_clean_cond;
-+  }
-+
-+  if (clock_gettime(PK_CLOCK, &abs_time)) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "Error getting system's monotonic time: %s",
-+                                  strerror(errno));
-+    goto err_clean_cond;
-+  }
-+  abs_time.tv_sec += RUNAWAY_KILLER_TIMEOUT;
-+
-+  if ((pthread_err = pthread_create(&authority->priv->runaway_killer_thread, NULL,
-+                                    js_context_cb, ctx))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "Error creating runaway JS killer thread: %s",
-+                                  strerror(pthread_err));
-+    goto err_clean_cond;
-+  }
-+
-+  while (ctx->ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET) /* loop to treat spurious wakeups */
-+    if (pthread_cond_timedwait(&ctx->cond, &ctx->mutex, &abs_time) == ETIMEDOUT) {
-+      cancel = TRUE;
-+
-+      /* Log that we are terminating the script */
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Terminating runaway script after %d seconds",
-+                                    RUNAWAY_KILLER_TIMEOUT);
-+
-+      break;
-+    }
-+
-+  if ((pthread_err = pthread_mutex_unlock(&ctx->mutex))) {
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "Error unlocking mutex: %s",
-+                                  strerror(pthread_err));
-+    goto err_clean_cond;
-+  }
-+
-+  if (cancel) {
-+    if ((pthread_err = pthread_cancel (authority->priv->runaway_killer_thread))) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error cancelling runaway JS killer thread: %s",
-+                                    strerror(pthread_err));
-+      goto err_clean_cond;
-+    }
-+  }
-+  if ((pthread_err = pthread_join (authority->priv->runaway_killer_thread, NULL))) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error joining runaway JS killer thread: %s",
-+                                    strerror(pthread_err));
-+      goto err_clean_cond;
-+    }
-+
-+  return ctx->ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+
-+    err_clean_cond:
-+#ifdef HAVE_PTHREAD_CONDATTR_SETCLOCK
-+  pthread_cond_destroy(&ctx->cond);
-+#endif
-+    err_clean_condattr:
-+#ifdef HAVE_PTHREAD_CONDATTR_SETCLOCK
-+  pthread_condattr_destroy(&attr);
-+#endif
-+  return FALSE;
-+}
-+
-+/* Blocking for at most RUNAWAY_KILLER_TIMEOUT */
-+static gboolean
-+execute_script_with_runaway_killer(PolkitBackendJsAuthority *authority,
-+                                   const gchar *filename)
-+{
-+  RunawayKillerCtx ctx = {.authority = authority, .filename = filename,
-+                          .ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+                          .mutex = PTHREAD_MUTEX_INITIALIZER,
-+                          .cond = PTHREAD_COND_INITIALIZER};
-+
-+  return runaway_killer_common(authority, &ctx, &runaway_killer_thread_execute_js);
-+}
-+
-+/* Calls already stacked function and args. Blocking for at most
-+ * RUNAWAY_KILLER_TIMEOUT. If timeout is the case, ctx.ret will be
-+ * RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET, thus returning FALSE.
-+ */
-+static gboolean
-+call_js_function_with_runaway_killer(PolkitBackendJsAuthority *authority)
-+{
-+  RunawayKillerCtx ctx = {.authority = authority,
-+                          .ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+                          .mutex = PTHREAD_MUTEX_INITIALIZER,
-+                          .cond = PTHREAD_COND_INITIALIZER};
-+
-+  return runaway_killer_common(authority, &ctx, &runaway_killer_thread_call_js);
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+GList *
-+polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                              PolkitSubject                     *caller,
-+                                                              PolkitSubject                     *subject,
-+                                                              PolkitIdentity                    *user_for_subject,
-+                                                              gboolean                           subject_is_local,
-+                                                              gboolean                           subject_is_active,
-+                                                              const gchar                       *action_id,
-+                                                              PolkitDetails                     *details)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-+  GList *ret = NULL;
-+  guint n;
-+  GError *error = NULL;
-+  const char *ret_str = NULL;
-+  gchar **ret_strs = NULL;
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error deleting old rules, not loading new ones");
-+      goto out;
-+  }
-+
-+  duk_push_string (cx, "_runAdminRules");
-+
-+  if (!push_action_and_details (cx, action_id, details, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting action and details to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!push_subject (cx, subject, user_for_subject, subject_is_local, subject_is_active, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting subject to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!call_js_function_with_runaway_killer (authority))
-+    goto out;
-+
-+  ret_str = duk_require_string (cx, -1);
-+
-+  ret_strs = g_strsplit (ret_str, ",", -1);
-+  for (n = 0; ret_strs != NULL && ret_strs[n] != NULL; n++)
-+    {
-+      const gchar *identity_str = ret_strs[n];
-+      PolkitIdentity *identity;
-+
-+      error = NULL;
-+      identity = polkit_identity_from_string (identity_str, &error);
-+      if (identity == NULL)
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Identity `%s' is not valid, ignoring: %s",
-+                                        identity_str, error->message);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          ret = g_list_prepend (ret, identity);
-+        }
-+    }
-+  ret = g_list_reverse (ret);
-+
-+ out:
-+  g_strfreev (ret_strs);
-+  /* fallback to root password auth */
-+  if (ret == NULL)
-+    ret = g_list_prepend (ret, polkit_unix_user_new (0));
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+PolkitImplicitAuthorization
-+polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                             PolkitSubject                     *caller,
-+                                                             PolkitSubject                     *subject,
-+                                                             PolkitIdentity                    *user_for_subject,
-+                                                             gboolean                           subject_is_local,
-+                                                             gboolean                           subject_is_active,
-+                                                             const gchar                       *action_id,
-+                                                             PolkitDetails                     *details,
-+                                                             PolkitImplicitAuthorization        implicit)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-+  PolkitImplicitAuthorization ret = implicit;
-+  GError *error = NULL;
-+  gchar *ret_str = NULL;
-+  gboolean good = FALSE;
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      goto out;
-+  }
-+
-+  duk_push_string (cx, "_runRules");
-+
-+  if (!push_action_and_details (cx, action_id, details, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting action and details to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!push_subject (cx, subject, user_for_subject, subject_is_local, subject_is_active, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting subject to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  // If any error is the js context happened (ctx.ret ==
-+  // RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE) or it never properly returned
-+  // (runaway scripts or ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET),
-+  // unauthorize
-+  if (!call_js_function_with_runaway_killer (authority))
-+    goto out;
-+
-+  if (duk_is_null(cx, -1)) {
-+    /* this is fine, means there was no match, use implicit authorizations */
-+    good = TRUE;
-+    goto out;
-+  }
-+  ret_str = g_strdup (duk_require_string (cx, -1));
-+  if (!polkit_implicit_authorization_from_string (ret_str, &ret))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Returned result `%s' is not valid",
-+                                    ret_str);
-+      goto out;
-+    }
-+
-+  good = TRUE;
-+
-+ out:
-+  if (!good)
-+    ret = POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED;
-+  if (ret_str != NULL)
-+      g_free (ret_str);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static duk_ret_t
-+js_polkit_log (duk_context *cx)
-+{
-+  const char *str = duk_require_string (cx, 0);
-+  fprintf (stderr, "%s\n", str);
-+  return 0;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static duk_ret_t
-+js_polkit_spawn (duk_context *cx)
-+{
-+  duk_ret_t ret = DUK_RET_ERROR;
-+  gchar *standard_output = NULL;
-+  gchar *standard_error = NULL;
-+  gint exit_status;
-+  GError *error = NULL;
-+  guint32 array_len;
-+  gchar **argv = NULL;
-+  GMainContext *context = NULL;
-+  GMainLoop *loop = NULL;
-+  SpawnData data = {0};
-+  char *err_str = NULL;
-+  guint n;
-+
-+  if (!duk_is_array (cx, 0))
-+    goto out;
-+
-+  array_len = duk_get_length (cx, 0);
-+
-+  argv = g_new0 (gchar*, array_len + 1);
-+  for (n = 0; n < array_len; n++)
-+    {
-+      duk_get_prop_index (cx, 0, n);
-+      argv[n] = g_strdup (duk_to_string (cx, -1));
-+      duk_pop (cx);
-+    }
-+
-+  context = g_main_context_new ();
-+  loop = g_main_loop_new (context, FALSE);
-+
-+  g_main_context_push_thread_default (context);
-+
-+  data.loop = loop;
-+  polkit_backend_common_spawn ((const gchar *const *) argv,
-+                               10, /* timeout_seconds */
-+                               NULL, /* cancellable */
-+                               polkit_backend_common_spawn_cb,
-+                               &data);
-+
-+  g_main_loop_run (loop);
-+
-+  g_main_context_pop_thread_default (context);
-+
-+  if (!polkit_backend_common_spawn_finish (data.res,
-+                                           &exit_status,
-+                                           &standard_output,
-+                                           &standard_error,
-+                                           &error))
-+    {
-+      err_str = g_strdup_printf ("Error spawning helper: %s (%s, %d)",
-+                                 error->message, g_quark_to_string (error->domain), error->code);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!(WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 0))
-+    {
-+      GString *gstr;
-+      gstr = g_string_new (NULL);
-+      if (WIFEXITED (exit_status))
-+        {
-+          g_string_append_printf (gstr,
-+                                  "Helper exited with non-zero exit status %d",
-+                                  WEXITSTATUS (exit_status));
-+        }
-+      else if (WIFSIGNALED (exit_status))
-+        {
-+          g_string_append_printf (gstr,
-+                                  "Helper was signaled with signal %s (%d)",
-+                                  polkit_backend_common_get_signal_name (WTERMSIG (exit_status)),
-+                                  WTERMSIG (exit_status));
-+        }
-+      g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-+                              standard_output, standard_error);
-+      err_str = g_string_free (gstr, FALSE);
-+      goto out;
-+    }
-+
-+  duk_push_string (cx, standard_output);
-+  ret = 1;
-+
-+ out:
-+  g_strfreev (argv);
-+  g_free (standard_output);
-+  g_free (standard_error);
-+  g_clear_object (&data.res);
-+  if (loop != NULL)
-+    g_main_loop_unref (loop);
-+  if (context != NULL)
-+    g_main_context_unref (context);
-+
-+  if (err_str)
-+    duk_error (cx, DUK_ERR_ERROR, err_str);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+
-+static duk_ret_t
-+js_polkit_user_is_in_netgroup (duk_context *cx)
-+{
-+  const char *user;
-+  const char *netgroup;
-+  gboolean is_in_netgroup = FALSE;
-+
-+  user = duk_require_string (cx, 0);
-+  netgroup = duk_require_string (cx, 1);
-+
-+  if (innetgr (netgroup,
-+               NULL,  /* host */
-+               user,
-+               NULL)) /* domain */
-+    {
-+      is_in_netgroup = TRUE;
-+    }
-+
-+  duk_push_boolean (cx, is_in_netgroup);
-+  return 1;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
-index ca17108..11e91c0 100644
---- a/src/polkitbackend/polkitbackendjsauthority.cpp
-+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
-@@ -19,29 +19,7 @@
-  * Author: David Zeuthen <davidz@redhat.com>
-  */
- 
--#include "config.h"
--#include <sys/wait.h>
--#include <errno.h>
--#include <pwd.h>
--#include <grp.h>
--#ifdef HAVE_NETGROUP_H
--#include <netgroup.h>
--#else
--#include <netdb.h>
--#endif
--#include <string.h>
--#include <glib/gstdio.h>
--#include <locale.h>
--#include <glib/gi18n-lib.h>
--
--#include <polkit/polkit.h>
--#include "polkitbackendjsauthority.h"
--
--#include <polkit/polkitprivate.h>
--
--#ifdef HAVE_LIBSYSTEMD
--#include <systemd/sd-login.h>
--#endif /* HAVE_LIBSYSTEMD */
-+#include "polkitbackendcommon.h"
- 
- #include <js/CompilationAndEvaluation.h>
- #include <js/ContextOptions.h>
-@@ -52,6 +30,7 @@
- #include <js/Array.h>
- #include <jsapi.h>
- 
-+/* Built source and not too big to worry about deduplication */
- #include "initjs.h" /* init.js */
- 
- #ifdef JSGC_USE_EXACT_ROOTING
-@@ -67,10 +46,9 @@
-  * @short_description: JS Authority
-  * @stability: Unstable
-  *
-- * An implementation of #PolkitBackendAuthority that reads and
-- * evalates Javascript files and supports interaction with
-- * authentication agents (virtue of being based on
-- * #PolkitBackendInteractiveAuthority).
-+ * An (SpiderMonkey-based) implementation of #PolkitBackendAuthority that reads
-+ * and evaluates Javascript files and supports interaction with authentication
-+ * agents (virtue of being based on #PolkitBackendInteractiveAuthority).
-  */
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -100,57 +78,11 @@ static bool execute_script_with_runaway_killer (PolkitBackendJsAuthority *author
-                                     JS::HandleScript                 script,
-                                     JS::MutableHandleValue           rval);
- 
--static void utils_spawn (const gchar *const  *argv,
--                         guint                timeout_seconds,
--                         GCancellable        *cancellable,
--                         GAsyncReadyCallback  callback,
--                         gpointer             user_data);
--
--gboolean utils_spawn_finish (GAsyncResult   *res,
--                             gint           *out_exit_status,
--                             gchar         **out_standard_output,
--                             gchar         **out_standard_error,
--                             GError        **error);
--
--static void on_dir_monitor_changed (GFileMonitor     *monitor,
--                                    GFile            *file,
--                                    GFile            *other_file,
--                                    GFileMonitorEvent event_type,
--                                    gpointer          user_data);
--
--/* ---------------------------------------------------------------------------------------------------- */
--
--enum
--{
--  PROP_0,
--  PROP_RULES_DIRS,
--};
--
- /* ---------------------------------------------------------------------------------------------------- */
- 
- static gpointer runaway_killer_thread_func (gpointer user_data);
- static void runaway_killer_terminate (PolkitBackendJsAuthority *authority);
- 
--static GList *polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *authority,
--                                                                     PolkitSubject                     *caller,
--                                                                     PolkitSubject                     *subject,
--                                                                     PolkitIdentity                    *user_for_subject,
--                                                                     gboolean                           subject_is_local,
--                                                                     gboolean                           subject_is_active,
--                                                                     const gchar                       *action_id,
--                                                                     PolkitDetails                     *details);
--
--static PolkitImplicitAuthorization polkit_backend_js_authority_check_authorization_sync (
--                                                          PolkitBackendInteractiveAuthority *authority,
--                                                          PolkitSubject                     *caller,
--                                                          PolkitSubject                     *subject,
--                                                          PolkitIdentity                    *user_for_subject,
--                                                          gboolean                           subject_is_local,
--                                                          gboolean                           subject_is_active,
--                                                          const gchar                       *action_id,
--                                                          PolkitDetails                     *details,
--                                                          PolkitImplicitAuthorization        implicit);
--
- G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -229,33 +161,6 @@ polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-                                                  PolkitBackendJsAuthorityPrivate);
- }
- 
--static gint
--rules_file_name_cmp (const gchar *a,
--                     const gchar *b)
--{
--  gint ret;
--  const gchar *a_base;
--  const gchar *b_base;
--
--  a_base = strrchr (a, '/');
--  b_base = strrchr (b, '/');
--
--  g_assert (a_base != NULL);
--  g_assert (b_base != NULL);
--  a_base += 1;
--  b_base += 1;
--
--  ret = g_strcmp0 (a_base, b_base);
--  if (ret == 0)
--    {
--      /* /etc wins over /usr */
--      ret = g_strcmp0 (a, b);
--      g_assert (ret != 0);
--    }
--
--  return ret;
--}
--
- /* authority->priv->cx must be within a request */
- static void
- load_scripts (PolkitBackendJsAuthority  *authority)
-@@ -299,7 +204,7 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-         }
-     }
- 
--  files = g_list_sort (files, (GCompareFunc) rules_file_name_cmp);
-+  files = g_list_sort (files, (GCompareFunc) polkit_backend_common_rules_file_name_cmp);
- 
-   for (l = files; l != NULL; l = l->next)
-     {
-@@ -365,8 +270,8 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-   g_list_free_full (files, g_free);
- }
- 
--static void
--reload_scripts (PolkitBackendJsAuthority *authority)
-+void
-+polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority)
- {
-   JS::RootedValueArray<1> args(authority->priv->cx);
-   JS::RootedValue rval(authority->priv->cx);
-@@ -395,42 +300,6 @@ reload_scripts (PolkitBackendJsAuthority *authority)
-   g_signal_emit_by_name (authority, "changed");
- }
- 
--static void
--on_dir_monitor_changed (GFileMonitor     *monitor,
--                        GFile            *file,
--                        GFile            *other_file,
--                        GFileMonitorEvent event_type,
--                        gpointer          user_data)
--{
--  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
--
--  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
--   *       Because when editing a file with emacs we get 4-8 events..
--   */
--
--  if (file != NULL)
--    {
--      gchar *name;
--
--      name = g_file_get_basename (file);
--
--      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
--      if (!g_str_has_prefix (name, ".") &&
--          !g_str_has_prefix (name, "#") &&
--          g_str_has_suffix (name, ".rules") &&
--          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
--           event_type == G_FILE_MONITOR_EVENT_DELETED ||
--           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Reloading rules");
--          reload_scripts (authority);
--        }
--      g_free (name);
--    }
--}
--
--
- static void
- setup_file_monitors (PolkitBackendJsAuthority *authority)
- {
-@@ -462,7 +331,7 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-         {
-           g_signal_connect (monitor,
-                             "changed",
--                            G_CALLBACK (on_dir_monitor_changed),
-+                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                             authority);
-           g_ptr_array_add (p, monitor);
-         }
-@@ -471,8 +340,8 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-   authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
- }
- 
--static void
--polkit_backend_js_authority_constructed (GObject *object)
-+void
-+polkit_backend_common_js_authority_constructed (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -561,8 +430,8 @@ polkit_backend_js_authority_constructed (GObject *object)
-   g_assert_not_reached ();
- }
- 
--static void
--polkit_backend_js_authority_finalize (GObject *object)
-+void
-+polkit_backend_common_js_authority_finalize (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   guint n;
-@@ -577,7 +446,7 @@ polkit_backend_js_authority_finalize (GObject *object)
-     {
-       GFileMonitor *monitor = authority->priv->dir_monitors[n];
-       g_signal_handlers_disconnect_by_func (monitor,
--                                            (gpointer*)G_CALLBACK (on_dir_monitor_changed),
-+                                            (gpointer*)G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                                             authority);
-       g_object_unref (monitor);
-     }
-@@ -594,11 +463,11 @@ polkit_backend_js_authority_finalize (GObject *object)
-   G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
- }
- 
--static void
--polkit_backend_js_authority_set_property (GObject      *object,
--                                          guint         property_id,
--                                          const GValue *value,
--                                          GParamSpec   *pspec)
-+void
-+polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                 guint         property_id,
-+                                                 const GValue *value,
-+                                                 GParamSpec   *pspec)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -615,57 +484,12 @@ polkit_backend_js_authority_set_property (GObject      *object,
-     }
- }
- 
--static const gchar *
--polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
--{
--  return "js";
--}
--
--static const gchar *
--polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
--{
--  return PACKAGE_VERSION;
--}
--
--static PolkitAuthorityFeatures
--polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
--{
--  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
--}
--
- static void
- polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
- {
--  GObjectClass *gobject_class;
--  PolkitBackendAuthorityClass *authority_class;
--  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
--
--
--  gobject_class = G_OBJECT_CLASS (klass);
--  gobject_class->finalize                               = polkit_backend_js_authority_finalize;
--  gobject_class->set_property                           = polkit_backend_js_authority_set_property;
--  gobject_class->constructed                            = polkit_backend_js_authority_constructed;
--
--  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
--  authority_class->get_name                             = polkit_backend_js_authority_get_name;
--  authority_class->get_version                          = polkit_backend_js_authority_get_version;
--  authority_class->get_features                         = polkit_backend_js_authority_get_features;
--
--  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
--  interactive_authority_class->get_admin_identities     = polkit_backend_js_authority_get_admin_auth_identities;
--  interactive_authority_class->check_authorization_sync = polkit_backend_js_authority_check_authorization_sync;
--
--  g_object_class_install_property (gobject_class,
--                                   PROP_RULES_DIRS,
--                                   g_param_spec_boxed ("rules-dirs",
--                                                       NULL,
--                                                       NULL,
--                                                       G_TYPE_STRV,
--                                                       GParamFlags(G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE)));
--
-+  polkit_backend_common_js_authority_class_init_common (klass);
- 
-   g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
--
-   JS_Init ();
- }
- 
-@@ -1005,11 +829,14 @@ runaway_killer_setup (PolkitBackendJsAuthority *authority)
- {
-   g_assert (authority->priv->rkt_source == NULL);
- 
--  /* set-up timer for runaway scripts, will be executed in runaway_killer_thread */
-+  /* set-up timer for runaway scripts, will be executed in
-+     runaway_killer_thread, that is one, permanent thread running a glib
-+     mainloop (rkt_loop) whose context (rkt_context) has a timeout source
-+     (rkt_source) */
-   g_mutex_lock (&authority->priv->rkt_timeout_pending_mutex);
-   authority->priv->rkt_timeout_pending = FALSE;
-   g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex);
--  authority->priv->rkt_source = g_timeout_source_new_seconds (15);
-+  authority->priv->rkt_source = g_timeout_source_new_seconds (RUNAWAY_KILLER_TIMEOUT);
-   g_source_set_callback (authority->priv->rkt_source, rkt_on_timeout, authority, NULL);
-   g_source_attach (authority->priv->rkt_source, authority->priv->rkt_context);
- 
-@@ -1069,6 +896,9 @@ execute_script_with_runaway_killer (PolkitBackendJsAuthority *authority,
- {
-   bool ret;
- 
-+  // tries to JS_ExecuteScript(), may hang for > RUNAWAY_KILLER_TIMEOUT,
-+  // runaway_killer_thread makes sure the call returns, due to exception
-+  // injection
-   runaway_killer_setup (authority);
-   ret = JS_ExecuteScript (authority->priv->cx,
-                           script,
-@@ -1099,15 +929,15 @@ call_js_function_with_runaway_killer (PolkitBackendJsAuthority *authority,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static GList *
--polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
--                                                       PolkitSubject                     *caller,
--                                                       PolkitSubject                     *subject,
--                                                       PolkitIdentity                    *user_for_subject,
--                                                       gboolean                           subject_is_local,
--                                                       gboolean                           subject_is_active,
--                                                       const gchar                       *action_id,
--                                                       PolkitDetails                     *details)
-+GList *
-+polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                              PolkitSubject                     *caller,
-+                                                              PolkitSubject                     *subject,
-+                                                              PolkitIdentity                    *user_for_subject,
-+                                                              gboolean                           subject_is_local,
-+                                                              gboolean                           subject_is_active,
-+                                                              const gchar                       *action_id,
-+                                                              PolkitDetails                     *details)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   GList *ret = NULL;
-@@ -1202,16 +1032,16 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static PolkitImplicitAuthorization
--polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
--                                                      PolkitSubject                     *caller,
--                                                      PolkitSubject                     *subject,
--                                                      PolkitIdentity                    *user_for_subject,
--                                                      gboolean                           subject_is_local,
--                                                      gboolean                           subject_is_active,
--                                                      const gchar                       *action_id,
--                                                      PolkitDetails                     *details,
--                                                      PolkitImplicitAuthorization        implicit)
-+PolkitImplicitAuthorization
-+polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                             PolkitSubject                     *caller,
-+                                                             PolkitSubject                     *subject,
-+                                                             PolkitIdentity                    *user_for_subject,
-+                                                             gboolean                           subject_is_local,
-+                                                             gboolean                           subject_is_active,
-+                                                             const gchar                       *action_id,
-+                                                             PolkitDetails                     *details,
-+                                                             PolkitImplicitAuthorization        implicit)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   PolkitImplicitAuthorization ret = implicit;
-@@ -1324,65 +1154,6 @@ js_polkit_log (JSContext  *cx,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static const gchar *
--get_signal_name (gint signal_number)
--{
--  switch (signal_number)
--    {
--#define _HANDLE_SIG(sig) case sig: return #sig;
--    _HANDLE_SIG (SIGHUP);
--    _HANDLE_SIG (SIGINT);
--    _HANDLE_SIG (SIGQUIT);
--    _HANDLE_SIG (SIGILL);
--    _HANDLE_SIG (SIGABRT);
--    _HANDLE_SIG (SIGFPE);
--    _HANDLE_SIG (SIGKILL);
--    _HANDLE_SIG (SIGSEGV);
--    _HANDLE_SIG (SIGPIPE);
--    _HANDLE_SIG (SIGALRM);
--    _HANDLE_SIG (SIGTERM);
--    _HANDLE_SIG (SIGUSR1);
--    _HANDLE_SIG (SIGUSR2);
--    _HANDLE_SIG (SIGCHLD);
--    _HANDLE_SIG (SIGCONT);
--    _HANDLE_SIG (SIGSTOP);
--    _HANDLE_SIG (SIGTSTP);
--    _HANDLE_SIG (SIGTTIN);
--    _HANDLE_SIG (SIGTTOU);
--    _HANDLE_SIG (SIGBUS);
--#ifdef SIGPOLL
--    _HANDLE_SIG (SIGPOLL);
--#endif
--    _HANDLE_SIG (SIGPROF);
--    _HANDLE_SIG (SIGSYS);
--    _HANDLE_SIG (SIGTRAP);
--    _HANDLE_SIG (SIGURG);
--    _HANDLE_SIG (SIGVTALRM);
--    _HANDLE_SIG (SIGXCPU);
--    _HANDLE_SIG (SIGXFSZ);
--#undef _HANDLE_SIG
--    default:
--      break;
--    }
--  return "UNKNOWN_SIGNAL";
--}
--
--typedef struct
--{
--  GMainLoop *loop;
--  GAsyncResult *res;
--} SpawnData;
--
--static void
--spawn_cb (GObject       *source_object,
--          GAsyncResult  *res,
--          gpointer       user_data)
--{
--  SpawnData *data = (SpawnData *)user_data;
--  data->res = (GAsyncResult*)g_object_ref (res);
--  g_main_loop_quit (data->loop);
--}
--
- static bool
- js_polkit_spawn (JSContext  *cx,
-                  unsigned    js_argc,
-@@ -1440,21 +1211,21 @@ js_polkit_spawn (JSContext  *cx,
-   g_main_context_push_thread_default (context);
- 
-   data.loop = loop;
--  utils_spawn ((const gchar *const *) argv,
--               10, /* timeout_seconds */
--               NULL, /* cancellable */
--               spawn_cb,
--               &data);
-+  polkit_backend_common_spawn ((const gchar *const *) argv,
-+                               10, /* timeout_seconds */
-+                               NULL, /* cancellable */
-+                               polkit_backend_common_spawn_cb,
-+                               &data);
- 
-   g_main_loop_run (loop);
- 
-   g_main_context_pop_thread_default (context);
- 
--  if (!utils_spawn_finish (data.res,
--                           &exit_status,
--                           &standard_output,
--                           &standard_error,
--                           &error))
-+  if (!polkit_backend_common_spawn_finish (data.res,
-+                                           &exit_status,
-+                                           &standard_output,
-+                                           &standard_error,
-+                                           &error))
-     {
-       JS_ReportErrorUTF8 (cx,
-                       "Error spawning helper: %s (%s, %d)",
-@@ -1477,7 +1248,7 @@ js_polkit_spawn (JSContext  *cx,
-         {
-           g_string_append_printf (gstr,
-                                   "Helper was signaled with signal %s (%d)",
--                                  get_signal_name (WTERMSIG (exit_status)),
-+                                  polkit_backend_common_get_signal_name (WTERMSIG (exit_status)),
-                                   WTERMSIG (exit_status));
-         }
-       g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-@@ -1542,381 +1313,5 @@ js_polkit_user_is_in_netgroup (JSContext  *cx,
-   return ret;
- }
- 
--
--
- /* ---------------------------------------------------------------------------------------------------- */
- 
--typedef struct
--{
--  GSimpleAsyncResult *simple; /* borrowed reference */
--  GMainContext *main_context; /* may be NULL */
--
--  GCancellable *cancellable;  /* may be NULL */
--  gulong cancellable_handler_id;
--
--  GPid child_pid;
--  gint child_stdout_fd;
--  gint child_stderr_fd;
--
--  GIOChannel *child_stdout_channel;
--  GIOChannel *child_stderr_channel;
--
--  GSource *child_watch_source;
--  GSource *child_stdout_source;
--  GSource *child_stderr_source;
--
--  guint timeout_seconds;
--  gboolean timed_out;
--  GSource *timeout_source;
--
--  GString *child_stdout;
--  GString *child_stderr;
--
--  gint exit_status;
--} UtilsSpawnData;
--
--static void
--utils_child_watch_from_release_cb (GPid     pid,
--                                   gint     status,
--                                   gpointer user_data)
--{
--}
--
--static void
--utils_spawn_data_free (UtilsSpawnData *data)
--{
--  if (data->timeout_source != NULL)
--    {
--      g_source_destroy (data->timeout_source);
--      data->timeout_source = NULL;
--    }
--
--  /* Nuke the child, if necessary */
--  if (data->child_watch_source != NULL)
--    {
--      g_source_destroy (data->child_watch_source);
--      data->child_watch_source = NULL;
--    }
--
--  if (data->child_pid != 0)
--    {
--      GSource *source;
--      kill (data->child_pid, SIGTERM);
--      /* OK, we need to reap for the child ourselves - we don't want
--       * to use waitpid() because that might block the calling
--       * thread (the child might handle SIGTERM and use several
--       * seconds for cleanup/rollback).
--       *
--       * So we use GChildWatch instead.
--       *
--       * Avoid taking a references to ourselves. but note that we need
--       * to pass the GSource so we can nuke it once handled.
--       */
--      source = g_child_watch_source_new (data->child_pid);
--      g_source_set_callback (source,
--                             (GSourceFunc) utils_child_watch_from_release_cb,
--                             source,
--                             (GDestroyNotify) g_source_destroy);
--      /* attach source to the global default main context */
--      g_source_attach (source, NULL);
--      g_source_unref (source);
--      data->child_pid = 0;
--    }
--
--  if (data->child_stdout != NULL)
--    {
--      g_string_free (data->child_stdout, TRUE);
--      data->child_stdout = NULL;
--    }
--
--  if (data->child_stderr != NULL)
--    {
--      g_string_free (data->child_stderr, TRUE);
--      data->child_stderr = NULL;
--    }
--
--  if (data->child_stdout_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stdout_channel);
--      data->child_stdout_channel = NULL;
--    }
--  if (data->child_stderr_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stderr_channel);
--      data->child_stderr_channel = NULL;
--    }
--
--  if (data->child_stdout_source != NULL)
--    {
--      g_source_destroy (data->child_stdout_source);
--      data->child_stdout_source = NULL;
--    }
--  if (data->child_stderr_source != NULL)
--    {
--      g_source_destroy (data->child_stderr_source);
--      data->child_stderr_source = NULL;
--    }
--
--  if (data->child_stdout_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stdout_fd) == 0);
--      data->child_stdout_fd = -1;
--    }
--  if (data->child_stderr_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stderr_fd) == 0);
--      data->child_stderr_fd = -1;
--    }
--
--  if (data->cancellable_handler_id > 0)
--    {
--      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
--      data->cancellable_handler_id = 0;
--    }
--
--  if (data->main_context != NULL)
--    g_main_context_unref (data->main_context);
--
--  if (data->cancellable != NULL)
--    g_object_unref (data->cancellable);
--
--  g_slice_free (UtilsSpawnData, data);
--}
--
--/* called in the thread where @cancellable was cancelled */
--static void
--utils_on_cancelled (GCancellable *cancellable,
--                    gpointer      user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  GError *error;
--
--  error = NULL;
--  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
--  g_simple_async_result_take_error (data->simple, error);
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_read_child_stderr (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stderr, buf, bytes_read);
--  return TRUE;
--}
--
--static gboolean
--utils_read_child_stdout (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stdout, buf, bytes_read);
--  return TRUE;
--}
--
--static void
--utils_child_watch_cb (GPid     pid,
--                      gint     status,
--                      gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar *buf;
--  gsize buf_size;
--
--  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stdout, buf, buf_size);
--      g_free (buf);
--    }
--  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stderr, buf, buf_size);
--      g_free (buf);
--    }
--
--  data->exit_status = status;
--
--  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
--  data->child_pid = 0;
--  data->child_watch_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_timeout_cb (gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--
--  data->timed_out = TRUE;
--
--  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
--  data->timeout_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--
--  return FALSE; /* remove source */
--}
--
--static void
--utils_spawn (const gchar *const  *argv,
--             guint                timeout_seconds,
--             GCancellable        *cancellable,
--             GAsyncReadyCallback  callback,
--             gpointer             user_data)
--{
--  UtilsSpawnData *data;
--  GError *error;
--
--  data = g_slice_new0 (UtilsSpawnData);
--  data->timeout_seconds = timeout_seconds;
--  data->simple = g_simple_async_result_new (NULL,
--                                            callback,
--                                            user_data,
--                                            (gpointer*)utils_spawn);
--  data->main_context = g_main_context_get_thread_default ();
--  if (data->main_context != NULL)
--    g_main_context_ref (data->main_context);
--
--  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
--
--  data->child_stdout = g_string_new (NULL);
--  data->child_stderr = g_string_new (NULL);
--  data->child_stdout_fd = -1;
--  data->child_stderr_fd = -1;
--
--  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
--  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
--
--  error = NULL;
--  if (data->cancellable != NULL)
--    {
--      /* could already be cancelled */
--      error = NULL;
--      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
--        {
--          g_simple_async_result_take_error (data->simple, error);
--          g_simple_async_result_complete_in_idle (data->simple);
--          g_object_unref (data->simple);
--          goto out;
--        }
--
--      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
--                                                            G_CALLBACK (utils_on_cancelled),
--                                                            data,
--                                                            NULL);
--    }
--
--  error = NULL;
--  if (!g_spawn_async_with_pipes (NULL, /* working directory */
--                                 (gchar **) argv,
--                                 NULL, /* envp */
--                                 GSpawnFlags(G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD),
--                                 NULL, /* child_setup */
--                                 NULL, /* child_setup's user_data */
--                                 &(data->child_pid),
--                                 NULL, /* gint *stdin_fd */
--                                 &(data->child_stdout_fd),
--                                 &(data->child_stderr_fd),
--                                 &error))
--    {
--      g_prefix_error (&error, "Error spawning: ");
--      g_simple_async_result_take_error (data->simple, error);
--      g_simple_async_result_complete_in_idle (data->simple);
--      g_object_unref (data->simple);
--      goto out;
--    }
--
--  if (timeout_seconds > 0)
--    {
--      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
--      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
--      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
--      g_source_attach (data->timeout_source, data->main_context);
--      g_source_unref (data->timeout_source);
--    }
--
--  data->child_watch_source = g_child_watch_source_new (data->child_pid);
--  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
--  g_source_attach (data->child_watch_source, data->main_context);
--  g_source_unref (data->child_watch_source);
--
--  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
--  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
--  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
--  g_source_attach (data->child_stdout_source, data->main_context);
--  g_source_unref (data->child_stdout_source);
--
--  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
--  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
--  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
--  g_source_attach (data->child_stderr_source, data->main_context);
--  g_source_unref (data->child_stderr_source);
--
-- out:
--  ;
--}
--
--gboolean
--utils_spawn_finish (GAsyncResult   *res,
--                    gint           *out_exit_status,
--                    gchar         **out_standard_output,
--                    gchar         **out_standard_error,
--                    GError        **error)
--{
--  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
--  UtilsSpawnData *data;
--  gboolean ret = FALSE;
--
--  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
--  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
--
--  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == utils_spawn);
--
--  if (g_simple_async_result_propagate_error (simple, error))
--    goto out;
--
--  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
--
--  if (data->timed_out)
--    {
--      g_set_error (error,
--                   G_IO_ERROR,
--                   G_IO_ERROR_TIMED_OUT,
--                   "Timed out after %d seconds",
--                   data->timeout_seconds);
--      goto out;
--    }
--
--  if (out_exit_status != NULL)
--    *out_exit_status = data->exit_status;
--
--  if (out_standard_output != NULL)
--    *out_standard_output = g_strdup (data->child_stdout->str);
--
--  if (out_standard_error != NULL)
--    *out_standard_error = g_strdup (data->child_stderr->str);
--
--  ret = TRUE;
--
-- out:
--  return ret;
--}
-diff --git a/test/data/etc/polkit-1/rules.d/10-testing.rules b/test/data/etc/polkit-1/rules.d/10-testing.rules
-index 98bf062..e346b5d 100644
---- a/test/data/etc/polkit-1/rules.d/10-testing.rules
-+++ b/test/data/etc/polkit-1/rules.d/10-testing.rules
-@@ -189,8 +189,10 @@ polkit.addRule(function(action, subject) {
-                 ;
-         } catch (error) {
-             if (error == "Terminating runaway script")
--                return polkit.Result.YES;
--            return polkit.Result.NO;
-+                // Inverted logic to accomodate Duktape's model as well, which
-+                // will always fail with negation, on timeouts
-+                return polkit.Result.NO;
-+            return polkit.Result.YES;
-         }
-     }
- });
-diff --git a/test/polkitbackend/test-polkitbackendjsauthority.c b/test/polkitbackend/test-polkitbackendjsauthority.c
-index f97e0e0..2103b17 100644
---- a/test/polkitbackend/test-polkitbackendjsauthority.c
-+++ b/test/polkitbackend/test-polkitbackendjsauthority.c
-@@ -328,7 +328,7 @@ static const RulesTestCase rules_test_cases[] = {
-     "net.company.run_away_script",
-     "unix-user:root",
-     NULL,
--    POLKIT_IMPLICIT_AUTHORIZATION_AUTHORIZED,
-+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
-   },
- 
-   {
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0003-jsauthority-ensure-to-call-JS_Init-and-JS_ShutDown-e.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0003-jsauthority-ensure-to-call-JS_Init-and-JS_ShutDown-e.patch
deleted file mode 100644
index 9e9755e..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0003-jsauthority-ensure-to-call-JS_Init-and-JS_ShutDown-e.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From 7799441b9aa55324160deefbc65f9d918b8c94c1 Mon Sep 17 00:00:00 2001
-From: Xi Ruoyao <xry111@mengyan1223.wang>
-Date: Tue, 10 Aug 2021 18:52:56 +0800
-Subject: [PATCH] jsauthority: ensure to call JS_Init() and JS_ShutDown()
- exactly once
-
-Before this commit, we were calling JS_Init() in
-polkit_backend_js_authority_class_init and never called JS_ShutDown.
-This is actually a misusage of SpiderMonkey API.  Quote from a comment
-in js/Initialization.h (both mozjs-78 and mozjs-91):
-
-    It is currently not possible to initialize SpiderMonkey multiple
-    times (that is, calling JS_Init/JSAPI methods/JS_ShutDown in that
-    order, then doing so again).
-
-This misusage does not cause severe issues with mozjs-78.  However, when
-we eventually port jsauthority to use mozjs-91, bad thing will happen:
-see the test failure mentioned in #150.
-
-This commit is tested with both mozjs-78 and mozjs-91, all tests pass
-with it.
-
-Upstream-Status: Submitted [https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/91]
-Signed-off-by: Alexander Kanavin <alex@linutronix.de>
----
- src/polkitbackend/polkitbackendjsauthority.cpp | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
-index 41d8d5c..38dc001 100644
---- a/src/polkitbackend/polkitbackendjsauthority.cpp
-+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
-@@ -75,6 +75,13 @@
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
-+static class JsInitHelperType
-+{
-+public:
-+	JsInitHelperType() { JS_Init(); }
-+	~JsInitHelperType() { JS_ShutDown(); }
-+} JsInitHelper;
-+
- struct _PolkitBackendJsAuthorityPrivate
- {
-   gchar **rules_dirs;
-@@ -589,7 +596,6 @@ polkit_backend_js_authority_finalize (GObject *object)
-   delete authority->priv->js_polkit;
- 
-   JS_DestroyContext (authority->priv->cx);
--  /* JS_ShutDown (); */
- 
-   G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
- }
-@@ -665,8 +671,6 @@ polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
- 
- 
-   g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
--
--  JS_Init ();
- }
- 
- /* ---------------------------------------------------------------------------------------------------- */
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0004-Make-netgroup-support-optional.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0004-Make-netgroup-support-optional.patch
deleted file mode 100644
index 181aca1..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0004-Make-netgroup-support-optional.patch
+++ /dev/null
@@ -1,253 +0,0 @@
-From a334fac72112c01cd322f7c97ef7ca21457ab52f Mon Sep 17 00:00:00 2001
-From: "A. Wilcox" <AWilcox@Wilcox-Tech.com>
-Date: Sun, 15 May 2022 05:04:10 +0000
-Subject: [PATCH] Make netgroup support optional
-
-On at least Linux/musl and Linux/uclibc, netgroup support is not
-available.  PolKit fails to compile on these systems for that reason.
-
-This change makes netgroup support conditional on the presence of the
-setnetgrent(3) function which is required for the support to work.  If
-that function is not available on the system, an error will be returned
-to the administrator if unix-netgroup: is specified in configuration.
-
-(sam: rebased for Meson and Duktape.)
-
-Closes: https://gitlab.freedesktop.org/polkit/polkit/-/issues/14
-Closes: https://gitlab.freedesktop.org/polkit/polkit/-/issues/163
-Closes: https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/52
-Signed-off-by: A. Wilcox <AWilcox@Wilcox-Tech.com>
-
-Ported back the change in configure.ac (upstream removed autotools
-support).
-
-Upstream-Status: Backport [https://gitlab.freedesktop.org/polkit/polkit/-/commit/b57deee8178190a7ecc75290fa13cf7daabc2c66]
-Signed-off-by: Marta Rybczynska <marta.rybczynska@huawei.com>
-
----
- configure.ac                                    |  2 +-
- meson.build                                     |  1 +
- src/polkit/polkitidentity.c                     | 17 +++++++++++++++++
- src/polkit/polkitunixnetgroup.c                 |  3 +++
- .../polkitbackendinteractiveauthority.c         | 14 ++++++++------
- src/polkitbackend/polkitbackendjsauthority.cpp  |  2 ++
- test/polkit/polkitidentitytest.c                |  8 +++++++-
- test/polkit/polkitunixnetgrouptest.c            |  2 ++
- .../test-polkitbackendjsauthority.c             |  2 ++
- 9 files changed, 43 insertions(+), 8 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index ca4b9f2..4c5d596 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -100,7 +100,7 @@ AC_CHECK_LIB(expat,XML_ParserCreate,[EXPAT_LIBS="-lexpat"],
- 	     [AC_MSG_ERROR([Can't find expat library. Please install expat.])])
- AC_SUBST(EXPAT_LIBS)
- 
--AC_CHECK_FUNCS(clearenv fdatasync)
-+AC_CHECK_FUNCS(clearenv fdatasync setnetgrent)
- 
- if test "x$GCC" = "xyes"; then
-   LDFLAGS="-Wl,--as-needed $LDFLAGS"
-diff --git a/meson.build b/meson.build
-index 733bbff..d840926 100644
---- a/meson.build
-+++ b/meson.build
-@@ -82,6 +82,7 @@ config_h.set('_GNU_SOURCE', true)
- check_functions = [
-   'clearenv',
-   'fdatasync',
-+  'setnetgrent',
- ]
- 
- foreach func: check_functions
-diff --git a/src/polkit/polkitidentity.c b/src/polkit/polkitidentity.c
-index 3aa1f7f..793f17d 100644
---- a/src/polkit/polkitidentity.c
-+++ b/src/polkit/polkitidentity.c
-@@ -182,7 +182,15 @@ polkit_identity_from_string  (const gchar   *str,
-     }
-   else if (g_str_has_prefix (str, "unix-netgroup:"))
-     {
-+#ifndef HAVE_SETNETGRENT
-+      g_set_error (error,
-+                   POLKIT_ERROR,
-+                   POLKIT_ERROR_FAILED,
-+                   "Netgroups are not available on this machine ('%s')",
-+                   str);
-+#else
-       identity = polkit_unix_netgroup_new (str + sizeof "unix-netgroup:" - 1);
-+#endif
-     }
- 
-   if (identity == NULL && (error != NULL && *error == NULL))
-@@ -344,6 +352,14 @@ polkit_identity_new_for_gvariant (GVariant  *variant,
-       GVariant *v;
-       const char *name;
- 
-+#ifndef HAVE_SETNETGRENT
-+      g_set_error (error,
-+                   POLKIT_ERROR,
-+                   POLKIT_ERROR_FAILED,
-+                   "Netgroups are not available on this machine");
-+      goto out;
-+#else
-+
-       v = lookup_asv (details_gvariant, "name", G_VARIANT_TYPE_STRING, error);
-       if (v == NULL)
-         {
-@@ -353,6 +369,7 @@ polkit_identity_new_for_gvariant (GVariant  *variant,
-       name = g_variant_get_string (v, NULL);
-       ret = polkit_unix_netgroup_new (name);
-       g_variant_unref (v);
-+#endif
-     }
-   else
-     {
-diff --git a/src/polkit/polkitunixnetgroup.c b/src/polkit/polkitunixnetgroup.c
-index 8a2b369..83f8d4a 100644
---- a/src/polkit/polkitunixnetgroup.c
-+++ b/src/polkit/polkitunixnetgroup.c
-@@ -194,6 +194,9 @@ polkit_unix_netgroup_set_name (PolkitUnixNetgroup *group,
- PolkitIdentity *
- polkit_unix_netgroup_new (const gchar *name)
- {
-+#ifndef HAVE_SETNETGRENT
-+  g_assert_not_reached();
-+#endif
-   g_return_val_if_fail (name != NULL, NULL);
-   return POLKIT_IDENTITY (g_object_new (POLKIT_TYPE_UNIX_NETGROUP,
-                                        "name", name,
-diff --git a/src/polkitbackend/polkitbackendinteractiveauthority.c b/src/polkitbackend/polkitbackendinteractiveauthority.c
-index 056d9a8..36c2f3d 100644
---- a/src/polkitbackend/polkitbackendinteractiveauthority.c
-+++ b/src/polkitbackend/polkitbackendinteractiveauthority.c
-@@ -2233,25 +2233,26 @@ get_users_in_net_group (PolkitIdentity                    *group,
-   GList *ret;
- 
-   ret = NULL;
-+#ifdef HAVE_SETNETGRENT
-   name = polkit_unix_netgroup_get_name (POLKIT_UNIX_NETGROUP (group));
- 
--#ifdef HAVE_SETNETGRENT_RETURN
-+# ifdef HAVE_SETNETGRENT_RETURN
-   if (setnetgrent (name) == 0)
-     {
-       g_warning ("Error looking up net group with name %s: %s", name, g_strerror (errno));
-       goto out;
-     }
--#else
-+# else
-   setnetgrent (name);
--#endif
-+# endif /* HAVE_SETNETGRENT_RETURN */
- 
-   for (;;)
-     {
--#if defined(HAVE_NETBSD) || defined(HAVE_OPENBSD)
-+# if defined(HAVE_NETBSD) || defined(HAVE_OPENBSD)
-       const char *hostname, *username, *domainname;
--#else
-+# else
-       char *hostname, *username, *domainname;
--#endif
-+# endif /* defined(HAVE_NETBSD) || defined(HAVE_OPENBSD) */
-       PolkitIdentity *user;
-       GError *error = NULL;
- 
-@@ -2282,6 +2283,7 @@ get_users_in_net_group (PolkitIdentity                    *group,
- 
-  out:
-   endnetgrent ();
-+#endif /* HAVE_SETNETGRENT */
-   return ret;
- }
- 
-diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
-index 5027815..bcb040c 100644
---- a/src/polkitbackend/polkitbackendjsauthority.cpp
-+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
-@@ -1524,6 +1524,7 @@ js_polkit_user_is_in_netgroup (JSContext  *cx,
- 
-   JS::CallArgs args = JS::CallArgsFromVp (argc, vp);
- 
-+#ifdef HAVE_SETNETGRENT
-   JS::RootedString usrstr (authority->priv->cx);
-   usrstr = args[0].toString();
-   user = JS_EncodeStringToUTF8 (cx, usrstr);
-@@ -1538,6 +1539,7 @@ js_polkit_user_is_in_netgroup (JSContext  *cx,
-     {
-       is_in_netgroup =  true;
-     }
-+#endif
- 
-   ret = true;
- 
-diff --git a/test/polkit/polkitidentitytest.c b/test/polkit/polkitidentitytest.c
-index e91967b..2635c4c 100644
---- a/test/polkit/polkitidentitytest.c
-+++ b/test/polkit/polkitidentitytest.c
-@@ -145,11 +145,15 @@ struct ComparisonTestData comparison_test_data [] = {
-   {"unix-group:root", "unix-group:jane", FALSE},
-   {"unix-group:jane", "unix-group:jane", TRUE},
- 
-+#ifdef HAVE_SETNETGRENT
-   {"unix-netgroup:foo", "unix-netgroup:foo", TRUE},
-   {"unix-netgroup:foo", "unix-netgroup:bar", FALSE},
-+#endif
- 
-   {"unix-user:root", "unix-group:root", FALSE},
-+#ifdef HAVE_SETNETGRENT
-   {"unix-user:jane", "unix-netgroup:foo", FALSE},
-+#endif
- 
-   {NULL},
- };
-@@ -181,11 +185,13 @@ main (int argc, char *argv[])
-   g_test_add_data_func ("/PolkitIdentity/group_string_2", "unix-group:jane", test_string);
-   g_test_add_data_func ("/PolkitIdentity/group_string_3", "unix-group:users", test_string);
- 
-+#ifdef HAVE_SETNETGRENT
-   g_test_add_data_func ("/PolkitIdentity/netgroup_string", "unix-netgroup:foo", test_string);
-+  g_test_add_data_func ("/PolkitIdentity/netgroup_gvariant", "unix-netgroup:foo", test_gvariant);
-+#endif
- 
-   g_test_add_data_func ("/PolkitIdentity/user_gvariant", "unix-user:root", test_gvariant);
-   g_test_add_data_func ("/PolkitIdentity/group_gvariant", "unix-group:root", test_gvariant);
--  g_test_add_data_func ("/PolkitIdentity/netgroup_gvariant", "unix-netgroup:foo", test_gvariant);
- 
-   add_comparison_tests ();
- 
-diff --git a/test/polkit/polkitunixnetgrouptest.c b/test/polkit/polkitunixnetgrouptest.c
-index 3701ba1..e1d211e 100644
---- a/test/polkit/polkitunixnetgrouptest.c
-+++ b/test/polkit/polkitunixnetgrouptest.c
-@@ -69,7 +69,9 @@ int
- main (int argc, char *argv[])
- {
-   g_test_init (&argc, &argv, NULL);
-+#ifdef HAVE_SETNETGRENT
-   g_test_add_func ("/PolkitUnixNetgroup/new", test_new);
-   g_test_add_func ("/PolkitUnixNetgroup/set_name", test_set_name);
-+#endif
-   return g_test_run ();
- }
-diff --git a/test/polkitbackend/test-polkitbackendjsauthority.c b/test/polkitbackend/test-polkitbackendjsauthority.c
-index f97e0e0..fc52149 100644
---- a/test/polkitbackend/test-polkitbackendjsauthority.c
-+++ b/test/polkitbackend/test-polkitbackendjsauthority.c
-@@ -137,12 +137,14 @@ test_get_admin_identities (void)
-         "unix-group:users"
-       }
-     },
-+#ifdef HAVE_SETNETGRENT
-     {
-       "net.company.action3",
-       {
-         "unix-netgroup:foo"
-       }
-     },
-+#endif
-   };
-   guint n;
- 
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0005-Make-netgroup-support-optional-duktape.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0005-Make-netgroup-support-optional-duktape.patch
deleted file mode 100644
index 12988ad..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/0005-Make-netgroup-support-optional-duktape.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 792f8e2151c120ec51b50a4098e4f9642409cbec Mon Sep 17 00:00:00 2001
-From: Marta Rybczynska <rybczynska@gmail.com>
-Date: Fri, 29 Jul 2022 11:52:59 +0200
-Subject: [PATCH] Make netgroup support optional
-
-This patch adds a fragment of the netgroup patch to apply on the duktape-related
-code. This change is needed to compile with duktape+musl.
-
-Upstream-Status: Backport [https://gitlab.freedesktop.org/polkit/polkit/-/commit/b57deee8178190a7ecc75290fa13cf7daabc2c66]
-Signed-off-by: Marta Rybczynska <martarybczynska@huawei.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index c89dbcf..58a5936 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -1036,6 +1036,7 @@ js_polkit_user_is_in_netgroup (duk_context *cx)
-   user = duk_require_string (cx, 0);
-   netgroup = duk_require_string (cx, 1);
- 
-+#ifdef HAVE_SETNETGRENT
-   if (innetgr (netgroup,
-                NULL,  /* host */
-                user,
-@@ -1043,6 +1044,7 @@ js_polkit_user_is_in_netgroup (duk_context *cx)
-     {
-       is_in_netgroup = TRUE;
-     }
-+#endif
- 
-   duk_push_boolean (cx, is_in_netgroup);
-   return 1;
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/polkit-1_pam.patch b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/polkit-1_pam.patch
deleted file mode 100644
index c491abf..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit/polkit-1_pam.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-polkit: No system-auth in OE-Core, we can use common-* in place of it.
-
-Upstream-Status:Inappropriate [configuration]
-
-Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com>
-
-Upstream-Status: Inappropriate [oe specific]
-Rebase to 0.115
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
----
- configure.ac | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 36df239..8b3e1b1 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -471,10 +471,10 @@ elif test x$with_os_type = xfreebsd -o x$with_os_type = xnetbsd; then
-     PAM_FILE_INCLUDE_PASSWORD=system
-     PAM_FILE_INCLUDE_SESSION=system
- else
--   PAM_FILE_INCLUDE_AUTH=system-auth
--   PAM_FILE_INCLUDE_ACCOUNT=system-auth
--   PAM_FILE_INCLUDE_PASSWORD=system-auth
--   PAM_FILE_INCLUDE_SESSION=system-auth
-+   PAM_FILE_INCLUDE_AUTH=common-auth
-+   PAM_FILE_INCLUDE_ACCOUNT=common-account
-+   PAM_FILE_INCLUDE_PASSWORD=common-password
-+   PAM_FILE_INCLUDE_SESSION=common-session
- fi
- 
- AC_SUBST(PAM_FILE_INCLUDE_AUTH)
--- 
-2.7.4
-
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit_0.119.bb b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit_0.119.bb
deleted file mode 100644
index c4d3d25..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit_0.119.bb
+++ /dev/null
@@ -1,79 +0,0 @@
-SUMMARY = "PolicyKit Authorization Framework"
-DESCRIPTION = "The polkit package is an application-level toolkit for defining and handling the policy that allows unprivileged processes to speak to privileged processes."
-HOMEPAGE = "http://www.freedesktop.org/wiki/Software/polkit"
-LICENSE = "LGPL-2.0-or-later"
-LIC_FILES_CHKSUM = "file://COPYING;md5=155db86cdbafa7532b41f390409283eb \
-                    file://src/polkit/polkit.h;beginline=1;endline=20;md5=0a8630b0133176d0504c87a0ded39db4"
-
-DEPENDS = "expat glib-2.0 intltool-native"
-
-inherit autotools gtk-doc pkgconfig useradd systemd gobject-introspection features_check
-
-REQUIRED_DISTRO_FEATURES = "polkit"
-
-PACKAGECONFIG = "${@bb.utils.filter('DISTRO_FEATURES', 'pam', d)} \
-                 ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', \
-                    bb.utils.contains('DISTRO_FEATURES', 'x11', 'consolekit', '', d), d)} \
-                 mozjs \
-                "
-
-PACKAGECONFIG[pam] = "--with-authfw=pam,--with-authfw=shadow,libpam,libpam"
-PACKAGECONFIG[systemd] = "--enable-libsystemd-login=yes --with-systemdsystemunitdir=${systemd_unitdir}/system/,--enable-libsystemd-login=no --with-systemdsystemunitdir=,systemd"
-# there is no --enable/--disable option for consolekit and it's not picked by shlibs, so add it to RDEPENDS
-PACKAGECONFIG[consolekit] = ",,,consolekit"
-
-# Default to mozjs javascript library
-PACKAGECONFIG[mozjs] = ",,mozjs-91,,,duktape"
-# duktape javascript engine is much smaller and faster but is not compatible with
-# same javascript standards as mozjs. For example array.includes() function is not
-# supported. Test rule compatibility when switching to duktape.
-PACKAGECONFIG[duktape] = "--with-duktape,,duktape,,,mozjs"
-
-MOZJS_PATCHES = "\
-    file://0002-jsauthority-port-to-mozjs-91.patch \
-    file://0003-jsauthority-ensure-to-call-JS_Init-and-JS_ShutDown-e.patch \
-"
-DUKTAPE_PATCHES = "file://0003-Added-support-for-duktape-as-JS-engine.patch"
-DUKTAPE_NG_PATCHES = "file://0005-Make-netgroup-support-optional-duktape.patch"
-PAM_SRC_URI = "file://polkit-1_pam.patch"
-SRC_URI = "http://www.freedesktop.org/software/polkit/releases/polkit-${PV}.tar.gz \
-           ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)} \
-           ${@bb.utils.contains('PACKAGECONFIG', 'mozjs', '${MOZJS_PATCHES}', '', d)} \
-           ${@bb.utils.contains('PACKAGECONFIG', 'duktape', '${DUKTAPE_PATCHES}', '', d)} \
-           file://0001-pkexec-local-privilege-escalation-CVE-2021-4034.patch \
-           file://0002-CVE-2021-4115-GHSL-2021-077-fix.patch \
-           file://0004-Make-netgroup-support-optional.patch \
-           ${@bb.utils.contains('PACKAGECONFIG', 'duktape', '${DUKTAPE_NG_PATCHES}', '', d)} \
-           "
-SRC_URI[sha256sum] = "c8579fdb86e94295404211285fee0722ad04893f0213e571bd75c00972fd1f5c"
-
-EXTRA_OECONF = "--with-os-type=moblin \
-                --disable-man-pages \
-                --disable-libelogind \
-               "
-
-do_configure:prepend () {
-    rm -f ${S}/buildutil/lt*.m4 ${S}/buildutil/libtool.m4
-}
-
-do_compile:prepend () {
-    export GIR_EXTRA_LIBS_PATH="${B}/src/polkit/.libs"
-}
-
-PACKAGES =+ "${PN}-examples"
-
-FILES:${PN}:append = " \
-    ${libdir}/${BPN}-1 \
-    ${nonarch_libdir}/${BPN}-1 \
-    ${datadir}/dbus-1 \
-    ${datadir}/${BPN}-1 \
-    ${datadir}/gettext \
-"
-
-FILES:${PN}-examples = "${bindir}/*example*"
-
-USERADD_PACKAGES = "${PN}"
-USERADD_PARAM:${PN} = "--system --no-create-home --user-group --home-dir ${sysconfdir}/${BPN}-1 --shell /bin/nologin polkitd"
-
-SYSTEMD_SERVICE:${PN} = "${BPN}.service"
-SYSTEMD_AUTO_ENABLE = "disable"
diff --git a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit_123.bb b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit_123.bb
index 4fc2355..670fd99 100644
--- a/meta-openembedded/meta-oe/recipes-extended/polkit/polkit_123.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/polkit/polkit_123.bb
@@ -4,10 +4,10 @@
 LICENSE = "LGPL-2.0-or-later"
 LIC_FILES_CHKSUM = "file://COPYING;md5=155db86cdbafa7532b41f390409283eb"
 
-SRC_URI = " \
-	git://gitlab.freedesktop.org/polkit/polkit.git;protocol=https;branch=master \
-	file://0001-polkit.service.in-disable-MemoryDenyWriteExecute.patch \
-"
+SRC_URI = "git://gitlab.freedesktop.org/polkit/polkit.git;protocol=https;branch=master \
+           file://0001-polkit.service.in-disable-MemoryDenyWriteExecute.patch \
+           file://0001-jsauthority-Bump-mozjs-to-115.patch \
+           "
 
 S = "${WORKDIR}/git"
 SRCREV = "fc8b07e71d99f88a29258cde99b913b44da1846d"
@@ -31,7 +31,7 @@
 PACKAGECONFIG[consolekit] = ",,,consolekit"
 
 # Default to mozjs javascript library
-PACKAGECONFIG[mozjs] = "-Djs_engine=mozjs,,mozjs-102,,,duktape"
+PACKAGECONFIG[mozjs] = "-Djs_engine=mozjs,,mozjs-115,,,duktape"
 # duktape javascript engine is much smaller and faster but is not compatible with
 # same javascript standards as mozjs. For example array.includes() function is not
 # supported. Test rule compatibility when switching to duktape.
diff --git a/meta-openembedded/meta-oe/recipes-extended/redis/redis-7.2.3/redis.service b/meta-openembedded/meta-oe/recipes-extended/redis/redis-7.2.3/redis.service
index a52204c..b7791d0 100644
--- a/meta-openembedded/meta-oe/recipes-extended/redis/redis-7.2.3/redis.service
+++ b/meta-openembedded/meta-oe/recipes-extended/redis/redis-7.2.3/redis.service
@@ -10,6 +10,7 @@
 Restart=always
 LimitNOFILE=10032
 Type=notify
+StateDirectory=redis
 
 [Install]
 WantedBy=multi-user.target
diff --git a/meta-openembedded/meta-oe/recipes-extended/redis/redis/redis.service b/meta-openembedded/meta-oe/recipes-extended/redis/redis/redis.service
index 36d2985..f98f2d1 100644
--- a/meta-openembedded/meta-oe/recipes-extended/redis/redis/redis.service
+++ b/meta-openembedded/meta-oe/recipes-extended/redis/redis/redis.service
@@ -9,6 +9,7 @@
 ExecStop=/usr/bin/redis-cli shutdown
 Restart=always
 LimitNOFILE=10032
+StateDirectory=redis
 
 [Install]
 WantedBy=multi-user.target
diff --git a/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.2.13.bb b/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.2.14.bb
similarity index 95%
rename from meta-openembedded/meta-oe/recipes-extended/redis/redis_6.2.13.bb
rename to meta-openembedded/meta-oe/recipes-extended/redis/redis_6.2.14.bb
index 640831c..fa430ce 100644
--- a/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.2.13.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/redis/redis_6.2.14.bb
@@ -17,7 +17,7 @@
            file://GNU_SOURCE.patch \
            file://0006-Define-correct-gregs-for-RISCV32.patch \
            "
-SRC_URI[sha256sum] = "89ff27c80d420456a721ccfb3beb7cc628d883c53059803513749e13214a23d1"
+SRC_URI[sha256sum] = "34e74856cbd66fdb3a684fb349d93961d8c7aa668b06f81fd93ff267d09bc277"
 
 inherit autotools-brokensep update-rc.d systemd useradd
 
diff --git a/meta-openembedded/meta-oe/recipes-extended/snappy/snappy/0001-Add-inline-with-SNAPPY_ATTRIBUTE_ALWAYS_INLINE.patch b/meta-openembedded/meta-oe/recipes-extended/snappy/snappy/0001-Add-inline-with-SNAPPY_ATTRIBUTE_ALWAYS_INLINE.patch
deleted file mode 100644
index 27357d8..0000000
--- a/meta-openembedded/meta-oe/recipes-extended/snappy/snappy/0001-Add-inline-with-SNAPPY_ATTRIBUTE_ALWAYS_INLINE.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From 4728803cc8687431449c8c9fbfabb1da04943400 Mon Sep 17 00:00:00 2001
-From: "Georgi D. Sotirov" <gdsotirov@gmail.com>
-Date: Wed, 5 May 2021 14:16:46 +0300
-Subject: [PATCH] Add inline with SNAPPY_ATTRIBUTE_ALWAYS_INLINE
-
-Add inline with SNAPPY_ATTRIBUTE_ALWAYS_INLINE on AdvanceToNextTag to
-fix the following compilation errors and a warning with GCC:
-
-[  2%] Building CXX object CMakeFiles/snappy.dir/snappy.cc.o
-/usr/bin/c++   -DHAVE_CONFIG_H -Dsnappy_EXPORTS
--I/tmp/snappy-1.1.9/build -I/tmp/snappy-1.1.9  -O3
--march=i586 -mtune=i686 -Wall -Wextra -fno-exceptions -fno-rtti -O3
--DNDEBUG -fPIC   -std=c++11 -o CMakeFiles/snappy.dir/snappy.cc.o -c
-/tmp/snappy-1.1.9/snappy.cc
-/tmp/snappy-1.1.9/snappy.cc:1017:8: warning: always_inline
-function might not be inlinable [-Wattributes]
- size_t AdvanceToNextTag(const uint8_t** ip_p, size_t* tag) {
-        ^
-/tmp/snappy-1.1.9/snappy.cc: In function 'std::pair<const
-unsigned char*, int> snappy::DecompressBranchless(const uint8_t*, const
-uint8_t*, ptrdiff_t, T, ptrdiff_t) [with T = char*; uint8_t = unsigned
-char; ptrdiff_t = int]':
-/tmp/snappy-1.1.9/snappy.cc:1017:8: error: inlining failed in
-call to always_inline 'size_t snappy::AdvanceToNextTag(const uint8_t**,
-size_t*)': function body can be overwritten at link time
-/tmp/snappy-1.1.9/snappy.cc:1097:53: error: called from here
-         size_t tag_type = AdvanceToNextTag(&ip, &tag);
-                                                     ^
-/tmp/snappy-1.1.9/snappy.cc:1017:8: error: inlining failed in
-call to always_inline 'size_t snappy::AdvanceToNextTag(const uint8_t**,
-size_t*)': function body can be overwritten at link time
- size_t AdvanceToNextTag(const uint8_t** ip_p, size_t* tag) {
-        ^
-/tmp/snappy-1.1.9/snappy.cc:1097:53: error: called from here
-         size_t tag_type = AdvanceToNextTag(&ip, &tag);
-                                                     ^
-/tmp/snappy-1.1.9/snappy.cc:1017:8: error: inlining failed in
-call to always_inline 'size_t snappy::AdvanceToNextTag(const uint8_t**,
-size_t*)': function body can be overwritten at link time
- size_t AdvanceToNextTag(const uint8_t** ip_p, size_t* tag) {
-        ^
-/tmp/snappy-1.1.9/snappy.cc:1097:53: error: called from here
-         size_t tag_type = AdvanceToNextTag(&ip, &tag);
-                                                     ^
-CMakeFiles/snappy.dir/build.make:137: recipe for target
-'CMakeFiles/snappy.dir/snappy.cc.o' failed
-
-Just like with other functions using SNAPPY_ATTRIBUTE_ALWAYS_INLINE
-macro (i.e. __attribute__((always_inline)) ) it is necessary to use C++
-inline specifier.
-
-Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
-
-Upstream-Status: Submitted [https://github.com/google/snappy/pull/128]
----
- snappy.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/snappy.cc b/snappy.cc
-index 79dc0e8..51157be 100644
---- a/snappy.cc
-+++ b/snappy.cc
-@@ -1014,7 +1014,7 @@ void MemMove(ptrdiff_t dst, const void* src, size_t size) {
- }
- 
- SNAPPY_ATTRIBUTE_ALWAYS_INLINE
--size_t AdvanceToNextTag(const uint8_t** ip_p, size_t* tag) {
-+inline size_t AdvanceToNextTag(const uint8_t** ip_p, size_t* tag) {
-   const uint8_t*& ip = *ip_p;
-   // This section is crucial for the throughput of the decompression loop.
-   // The latency of an iteration is fundamentally constrained by the
diff --git a/meta-openembedded/meta-oe/recipes-extended/snappy/snappy/fix-build-on-32bit-arm.patch b/meta-openembedded/meta-oe/recipes-extended/snappy/snappy/fix-build-on-32bit-arm.patch
new file mode 100644
index 0000000..b6ab149
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/snappy/snappy/fix-build-on-32bit-arm.patch
@@ -0,0 +1,33 @@
+From ecb3bcc283ce740a34d6342cbcda569f3193ade9 Mon Sep 17 00:00:00 2001
+From: David Michael <fedora.dm0@gmail.com>
+Date: Mon, 1 May 2023 11:14:32 -0400
+Subject: [PATCH] Specifically check for NEON for ARMv8 CPUs.
+
+The actual NEON implementation uses instructions that are not
+supported on 32-bit CPUs.  Make the CMake test reflect this so that
+ARMv7 builds succeed again.
+
+Upstream-Status: Submitted [https://github.com/google/snappy/pull/169]
+
+Signed-off-by: David Michael <fedora.dm0@gmail.com>
+Signed-off-by: Alper Ak <alperyasinak1@gmail.com>
+---
+ CMakeLists.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 85afe58e..e8775859 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -207,9 +207,9 @@ int main() {
+ check_cxx_source_compiles("
+ #include <arm_neon.h>
+ int main() {
+-  uint8_t val = 3, dup[8];
++  uint8_t val = 3;
+   uint8x16_t v = vld1q_dup_u8(&val);
+-  vst1q_u8(dup, v);
++  val = vmaxvq_u8(v);
+   return 0;
+ }" SNAPPY_HAVE_NEON)
+ 
diff --git a/meta-openembedded/meta-oe/recipes-extended/snappy/snappy_1.1.9.bb b/meta-openembedded/meta-oe/recipes-extended/snappy/snappy_1.1.10.bb
similarity index 86%
rename from meta-openembedded/meta-oe/recipes-extended/snappy/snappy_1.1.9.bb
rename to meta-openembedded/meta-oe/recipes-extended/snappy/snappy_1.1.10.bb
index 9e0e43c..bc3bc3a 100644
--- a/meta-openembedded/meta-oe/recipes-extended/snappy/snappy_1.1.9.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/snappy/snappy_1.1.10.bb
@@ -11,11 +11,11 @@
 LIC_FILES_CHKSUM = "file://COPYING;md5=f62f3080324a97b3159a7a7e61812d0c"
 
 SRC_URI = "gitsm://github.com/google/snappy.git;protocol=https;branch=main \
-    file://0001-Add-inline-with-SNAPPY_ATTRIBUTE_ALWAYS_INLINE.patch \
-"
-SRCREV = "2b63814b15a2aaae54b7943f0cd935892fae628f"
-S = "${WORKDIR}/git"
+	   file://fix-build-on-32bit-arm.patch"
 
+SRCREV = "dc05e026488865bc69313a68bcc03ef2e4ea8e83"
+
+S = "${WORKDIR}/git"
 
 inherit cmake pkgconfig
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.33.bb b/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.33.bb
deleted file mode 100644
index 85da5bf..0000000
--- a/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_2.0.33.bb
+++ /dev/null
@@ -1,26 +0,0 @@
-SUMMARY = "Jpeg 2000 implementation"
-HOMEPAGE = "https://jasper-software.github.io/jasper/"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=a80440d1d8f17d041c71c7271d6e06eb"
-
-SRC_URI = "git://github.com/jasper-software/jasper.git;protocol=https;branch=master"
-SRCREV = "fe00207dc10db1d7cc6f2757961c5c6bdfd10973"
-
-CVE_STATUS[CVE-2015-8751] = "fixed-version: The CPE in the NVD database doesn't reflect correctly the vulnerable versions."
-
-S = "${WORKDIR}/git"
-
-inherit cmake
-
-PACKAGECONFIG ??= ""
-PACKAGECONFIG[jpeg] = "-DJAS_ENABLE_LIBJPEG=true, -DJAS_ENABLE_LIBJPEG=false, jpeg"
-PACKAGECONFIG[opengl] = "-DJAS_ENABLE_OPENGL=true, -DJAS_ENABLE_OPENGL=false, freeglut"
-
-EXTRA_OECMAKE:append = " -DJAS_ENABLE_SHARED=true"
-
-do_install:append() {
-    chrpath -d ${D}${bindir}/jasper
-    chrpath -d ${D}${bindir}/imginfo
-    chrpath -d ${D}${bindir}/imgcmp
-    chrpath -d ${D}${libdir}/libjasper.so.*
-}
diff --git a/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_4.1.1.bb b/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_4.1.1.bb
new file mode 100644
index 0000000..5281980
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-graphics/jasper/jasper_4.1.1.bb
@@ -0,0 +1,34 @@
+SUMMARY = "Jpeg 2000 implementation"
+HOMEPAGE = "https://jasper-software.github.io/jasper/"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a80440d1d8f17d041c71c7271d6e06eb"
+
+SRC_URI = "git://github.com/jasper-software/jasper.git;protocol=https;branch=master"
+SRCREV = "917f7708b755d8434f70618108c1a76f1b6a0a82"
+
+CVE_STATUS[CVE-2015-8751] = "fixed-version: The CPE in the NVD database doesn't reflect correctly the vulnerable versions."
+
+S = "${WORKDIR}/git"
+
+inherit cmake multilib_header
+
+do_configure:prepend() {
+	JAS_STDC_VERSION="$(echo __STDC_VERSION__ | ${CPP} -E -P -)"
+}
+
+EXTRA_OECMAKE:append = " -DJAS_STDC_VERSION=${JAS_STDC_VERSION}"
+
+PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl x11', 'opengl', '', d)} \
+		   jpeg"
+
+PACKAGECONFIG[jpeg] = "-DJAS_ENABLE_LIBJPEG=ON,-DJAS_ENABLE_LIBJPEG=OFF,jpeg,"
+PACKAGECONFIG[opengl] = "-DJAS_ENABLE_OPENGL=ON,-DJAS_ENABLE_OPENGL=OFF,freeglut,"
+
+do_install:append() {
+    chrpath -d ${D}${bindir}/jasper
+    chrpath -d ${D}${bindir}/imginfo
+    chrpath -d ${D}${bindir}/imgcmp
+    chrpath -d ${D}${libdir}/libjasper.so.*
+    oe_multilib_header jasper/jas_config.h
+}
+
diff --git a/meta-openembedded/meta-oe/recipes-graphics/lvgl/lvgl_8.3.10.bb b/meta-openembedded/meta-oe/recipes-graphics/lvgl/lvgl_8.3.11.bb
similarity index 96%
rename from meta-openembedded/meta-oe/recipes-graphics/lvgl/lvgl_8.3.10.bb
rename to meta-openembedded/meta-oe/recipes-graphics/lvgl/lvgl_8.3.11.bb
index 7dd36ca..2523680 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/lvgl/lvgl_8.3.10.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/lvgl/lvgl_8.3.11.bb
@@ -9,7 +9,7 @@
 LIC_FILES_CHKSUM = "file://LICENCE.txt;md5=bf1198c89ae87f043108cea62460b03a"
 
 SRC_URI = "git://github.com/lvgl/lvgl;protocol=https;branch=release/v8.3"
-SRCREV = "06e229cc7679c01119ca5d905a1f9dad96f475f0"
+SRCREV = "74d0a816a440eea53e030c4f1af842a94f7ce3d3"
 
 inherit cmake
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/renderdoc/renderdoc/0001-renderdoc-use-xxd-instead-of-cross-compiling-shim-bi.patch b/meta-openembedded/meta-oe/recipes-graphics/renderdoc/renderdoc/0001-renderdoc-use-xxd-instead-of-cross-compiling-shim-bi.patch
deleted file mode 100644
index e96dedf..0000000
--- a/meta-openembedded/meta-oe/recipes-graphics/renderdoc/renderdoc/0001-renderdoc-use-xxd-instead-of-cross-compiling-shim-bi.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 41a8c9b5ac13066770baee476ebf9828371f4dad Mon Sep 17 00:00:00 2001
-From: Adrian Ratiu <adrian.ratiu@collabora.com>
-Date: Tue, 24 Sep 2019 16:07:18 +0300
-Subject: [PATCH] renderdoc: use xxd instead of cross-compiling shim binary
-
-Renderdoc's attempt to cross compile an xxd replacement by directly
-calling a host cross-compiler breaks under OE's recipe specific
-sysroots protection because this is not a native recipe, so we just
-use xxd-native instead.
-
-Upstream-Status: Inappropriate [embedded-specific]
-
----
- renderdoc/CMakeLists.txt | 23 +----------------------
- 1 file changed, 1 insertion(+), 22 deletions(-)
-
-diff --git a/renderdoc/CMakeLists.txt b/renderdoc/CMakeLists.txt
-index 5cb7440a4..453a034ba 100644
---- a/renderdoc/CMakeLists.txt
-+++ b/renderdoc/CMakeLists.txt
-@@ -370,26 +370,6 @@ set(data
- set(data_objects)
- 
- if(UNIX)
--    # If we're cross-compiling, include-bin will get built for the target and we
--    # then can't execute it. Instead, we force calling c++ (which we can safely
--    # assume is present) directly to build the binary
--
--    if(CMAKE_CROSSCOMPILING)
--        set(HOST_NATIVE_CPP_COMPILER c++ CACHE STRING "Command to run to compile a .cpp into an executable. Default is just c++")
--
--        add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include-bin
--            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
--            COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
--            COMMAND ${HOST_NATIVE_CPP_COMPILER} 3rdparty/include-bin/main.cpp -o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include-bin
--            DEPENDS 3rdparty/include-bin/main.cpp)
--        set(INCLUDE_BIN_EXE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include-bin")
--        set(INCLUDE_BIN_DEP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include-bin")
--    else()
--        add_executable(include-bin 3rdparty/include-bin/main.cpp)
--        set(INCLUDE_BIN_EXE $<TARGET_FILE:include-bin>)
--        set(INCLUDE_BIN_DEP include-bin)
--    endif()
--
-     foreach(res ${data})
-         set(in ${res})
-         set(working_dir ${CMAKE_CURRENT_SOURCE_DIR})
-@@ -399,8 +379,7 @@ if(UNIX)
-         add_custom_command(OUTPUT ${out_src}
-             WORKING_DIRECTORY ${working_dir}
-             COMMAND ${CMAKE_COMMAND} -E make_directory ${out_src_dir}
--            COMMAND ${INCLUDE_BIN_EXE} ${in} ${out_src}
--            DEPENDS ${INCLUDE_BIN_DEP}
-+            COMMAND xxd -i ${in} ${out_src}
-             DEPENDS ${res})
- 
-         list(APPEND data_objects ${out_src})
diff --git a/meta-openembedded/meta-oe/recipes-graphics/renderdoc/renderdoc_1.27.bb b/meta-openembedded/meta-oe/recipes-graphics/renderdoc/renderdoc_1.27.bb
index c89b2d1..e52ec5f 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/renderdoc/renderdoc_1.27.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/renderdoc/renderdoc_1.27.bb
@@ -7,7 +7,6 @@
 SRCREV = "35b13a8e8fd2a331854dba6da81a20452e142d6f"
 SRC_URI = " \
     git://github.com/baldurk/${BPN}.git;protocol=https;branch=v1.x \
-    file://0001-renderdoc-use-xxd-instead-of-cross-compiling-shim-bi.patch \
 "
 S = "${WORKDIR}/git"
 
@@ -32,6 +31,7 @@
     -DENABLE_PYRENDERDOC=OFF \
     -DENABLE_RENDERDOCCMD=ON \
     -DCMAKE_BUILD_TYPE=Release \
+    -DHOST_NATIVE_CPP_COMPILER="${BUILD_CXX}" \
 "
 
 FILES:${PN} += "${libdir}"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/terminus-font/terminus-font/use-no-name-option-for-gzip.patch b/meta-openembedded/meta-oe/recipes-graphics/terminus-font/terminus-font/use-no-name-option-for-gzip.patch
new file mode 100644
index 0000000..97213c0
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-graphics/terminus-font/terminus-font/use-no-name-option-for-gzip.patch
@@ -0,0 +1,66 @@
+Build compressed archives with -n
+
+The compressed archives contain a header with the field MTIME
+(Modification Time) which is initialized from the built date.
+As a consequence, two separate builds generate compressed archives
+whose checksum differs. Such behavior prevents reproducible builds.
+
+Adding the -n option to gzip while compressing the archive does
+not save the original time stamp by default hence making
+reproducible build.
+
+Upstream-Status: Inappropriate
+
+Signed-off-by: Jean-Marc BOUCHE <jean-marc.bouche@foss.st.com>
+Index: terminus-font-4.49.1/Makefile
+===================================================================
+--- terminus-font-4.49.1.orig/Makefile
++++ terminus-font-4.49.1/Makefile
+@@ -92,9 +92,9 @@ otbdir  = $(prefix)/share/fonts/terminus
+ 
+ install: $(PSF) $(PCF)
+ 	mkdir -p $(DESTDIR)$(psfdir)
+-	for i in $(PSF) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
++	for i in $(PSF) ; do gzip -c -n $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
+ 	mkdir -p $(DESTDIR)$(x11dir)
+-	for i in $(PCF) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
++	for i in $(PCF) ; do gzip -c -n $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
+ 
+ uninstall:
+ 	for i in $(PSF) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
+@@ -193,7 +193,7 @@ psf: $(PSF)
+ 
+ install-psf: $(PSF)
+ 	mkdir -p $(DESTDIR)$(psfdir)
+-	for i in $(PSF) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
++	for i in $(PSF) ; do gzip -c -n $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
+ 
+ uninstall-psf:
+ 	for i in $(PSF) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
+@@ -202,7 +202,7 @@ psf-vgaw: $(PSF_VGAW)
+ 
+ install-psf-vgaw: $(PSF_VGAW)
+ 	mkdir -p $(DESTDIR)$(psfdir)
+-	for i in $(PSF_VGAW) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
++	for i in $(PSF_VGAW) ; do gzip -c -n $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
+ 
+ uninstall-psf-vgaw:
+ 	for i in $(PSF_VGAW) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
+@@ -279,7 +279,7 @@ pcf: $(PCF)
+ 
+ install-pcf: $(PCF)
+ 	mkdir -p $(DESTDIR)$(x11dir)
+-	for i in $(PCF) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
++	for i in $(PCF) ; do gzip -c -n $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
+ 
+ uninstall-pcf:
+ 	for i in $(PCF) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
+@@ -288,7 +288,7 @@ pcf-8bit: $(PCF_8BIT)
+ 
+ install-pcf-8bit: $(PCF_8BIT)
+ 	mkdir -p $(DESTDIR)$(x11dir)
+-	for i in $(PCF_8BIT) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
++	for i in $(PCF_8BIT) ; do gzip -c -n $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
+ 
+ uninstall-pcf-8bit:
+ 	for i in $(PCF_8BIT) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
diff --git a/meta-openembedded/meta-oe/recipes-graphics/terminus-font/terminus-font_4.49.1.bb b/meta-openembedded/meta-oe/recipes-graphics/terminus-font/terminus-font_4.49.1.bb
index 65cafab..1fabe2e 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/terminus-font/terminus-font_4.49.1.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/terminus-font/terminus-font_4.49.1.bb
@@ -9,7 +9,9 @@
 
 DEPENDS = "hostperl-runtime-native gzip-native bdftopcf-native"
 
-SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BPN}-${PV}.tar.gz"
+SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BPN}-${PV}.tar.gz \
+          file://use-no-name-option-for-gzip.patch \
+          "
 SRC_URI[md5sum] = "1b6acbd221957e33c8a792ebfaf3a659"
 SRC_URI[sha256sum] = "d961c1b781627bf417f9b340693d64fc219e0113ad3a3af1a3424c7aa373ef79"
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-arphic-uming_20080216.bb b/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-arphic-uming_20080216.bb
index 3fc7f39..05ece8b 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-arphic-uming_20080216.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-arphic-uming_20080216.bb
@@ -2,7 +2,7 @@
 HOMEPAGE = "http://www.freedesktop.org/wiki/Software/CJKUnifonts"
 LICENSE = "Arphic-Public-License"
 LIC_FILES_CHKSUM = "file://license/english/ARPHICPL.TXT;md5=4555ed88e9a72fc9562af379d07c3350"
-SRC_DISTRIBUTE_LICENSES += "${PN}"
+
 RPROVIDES:${PN} = "virtual-chinese-font"
 PR = "r6"
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-sazanami_20040629.bb b/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-sazanami_20040629.bb
index 5a403f0..c7229df 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-sazanami_20040629.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-sazanami_20040629.bb
@@ -6,7 +6,7 @@
 HOMEPAGE = "http://sourceforge.jp/projects/efont/"
 LICENSE = "PD"
 LIC_FILES_CHKSUM = "file://README;md5=97d739900be6e852830f55aa3c07d4a0"
-SRC_DISTRIBUTE_LICENSES += "${PN}"
+
 RPROVIDES:${PN} = "virtual-japanese-font"
 PR = "r9"
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/wayland/libei_1.1.0.bb b/meta-openembedded/meta-oe/recipes-graphics/wayland/libei_1.2.0.bb
similarity index 92%
rename from meta-openembedded/meta-oe/recipes-graphics/wayland/libei_1.1.0.bb
rename to meta-openembedded/meta-oe/recipes-graphics/wayland/libei_1.2.0.bb
index 1727ef9..aba49de 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/wayland/libei_1.1.0.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/wayland/libei_1.2.0.bb
@@ -17,7 +17,7 @@
 SRC_URI = "git://gitlab.freedesktop.org/libinput/libei.git;protocol=https;branch=main"
 
 S = "${WORKDIR}/git"
-SRCREV = "82cdbc9129a0e2c255fcee6bcaa7abed5578ae14"
+SRCREV = "493631688437657a87e9169a76f14a3216c0024f"
 
 inherit meson pkgconfig
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xcursorgen/xcursorgen_1.0.7.bb b/meta-openembedded/meta-oe/recipes-graphics/xcursorgen/xcursorgen_1.0.8.bb
similarity index 64%
rename from meta-openembedded/meta-oe/recipes-graphics/xcursorgen/xcursorgen_1.0.7.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xcursorgen/xcursorgen_1.0.8.bb
index 936d71b..3770bab 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xcursorgen/xcursorgen_1.0.7.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xcursorgen/xcursorgen_1.0.8.bb
@@ -3,9 +3,8 @@
 
 DEPENDS = "libpng libxcursor"
 
-SRC_URI = "http://xorg.freedesktop.org/archive/individual/app/${BPN}-${PV}.tar.bz2"
-SRC_URI[md5sum] = "25cc7ca1ce5dcbb61c2b471c55e686b5"
-SRC_URI[sha256sum] = "35b6f844b24f1776e9006c880a745728800764dbe3b327a128772b4610d8eb3d"
+SRC_URI = "http://xorg.freedesktop.org/archive/individual/app/${BPN}-${PV}.tar.xz"
+SRC_URI[sha256sum] = "32b33ce27b4e285e64ff375731806bb7988cc626ff10915c65f1dc4da640cc9b"
 
 inherit features_check autotools pkgconfig
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/sessreg_1.1.2.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/sessreg_1.1.3.bb
similarity index 73%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-app/sessreg_1.1.2.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-app/sessreg_1.1.3.bb
index d4e9597..33ab22c 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/sessreg_1.1.2.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/sessreg_1.1.3.bb
@@ -4,8 +4,8 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://COPYING;md5=d938a70c8280c265a1ccd2954365d185"
 SRC_URI += "file://0001-Makefile.am-Error-Fix.patch"
-SRC_URI[md5sum] = "92be564d4be7d8aa7b5024057b715210"
-SRC_URI[sha256sum] = "dfcb9e954273ace63879aec053c7880466f8755752a35aa9ced3fa5f04fd2c33"
+SRC_URI_EXT = "xz"
+SRC_URI[sha256sum] = "022acd5de8077dddc4f919961f79e102ecd5f3228a333681af5cd0e7344facc2"
 
 CFLAGS:append:libc-musl = " -D_WTMPX_FILE=WTMP_FILE -D_PATH_WTMPX=_PATH_WTMP -D_UTMPX_FILE=UTMP_FILE -D_PATH_UTMPX=_PATH_UTMP "
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xgamma_1.0.6.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xgamma_1.0.7.bb
similarity index 71%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-app/xgamma_1.0.6.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-app/xgamma_1.0.7.bb
index 4949616..dc9cbad 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xgamma_1.0.6.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xgamma_1.0.7.bb
@@ -11,5 +11,5 @@
 
 BBCLASSEXTEND = "native"
 
-SRC_URI[md5sum] = "90b4305157c2b966d5180e2ee61262be"
-SRC_URI[sha256sum] = "0ef1c35b5c18b1b22317f455c8df13c0a471a8efad63c89c98ae3ce8c2b222d3"
+SRC_URI_EXT = "xz"
+SRC_URI[sha256sum] = "1c79dae85a8953a15f4fe5c2895a033307b43b8613456c87ec47b374b113bc8f"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xkbevd_1.1.4.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xkbevd_1.1.5.bb
similarity index 72%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-app/xkbevd_1.1.4.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-app/xkbevd_1.1.5.bb
index b42c1b9..afc1fe1 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xkbevd_1.1.4.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xkbevd_1.1.5.bb
@@ -9,5 +9,5 @@
 
 BBCLASSEXTEND = "native"
 
-SRC_URI[md5sum] = "c747faf1f78f5a5962419f8bdd066501"
-SRC_URI[sha256sum] = "2430a2e5302a4cb4a5530c1df8cb3721a149bbf8eb377a2898921a145197f96a"
+SRC_URI_EXT = "xz"
+SRC_URI[sha256sum] = "38357b702de9d3457c4ff75053390f457b84c4accc7f088101255c37c684926b"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsatoms_1.1.3.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsatoms_1.1.4.bb
similarity index 73%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsatoms_1.1.3.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsatoms_1.1.4.bb
index 288bcfc..ad06612 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsatoms_1.1.3.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsatoms_1.1.4.bb
@@ -10,5 +10,5 @@
 DEPENDS += "libxmu"
 BBCLASSEXTEND = "native"
 
-SRC_URI[md5sum] = "61671fee12535347db24ec3a715032a7"
-SRC_URI[sha256sum] = "57868f958c263976727881f3078e55b86b4a109dc578d2b92f5c6d690850a382"
+SRC_URI_EXT = "xz"
+SRC_URI[sha256sum] = "f4bfa15f56c066d326a5d5b292646708f25b9247506840b9047cd2687dcc71b7"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsclients_1.1.4.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsclients_1.1.5.bb
similarity index 74%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsclients_1.1.4.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsclients_1.1.5.bb
index 42bda7e..d73a27f 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsclients_1.1.4.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xlsclients_1.1.5.bb
@@ -10,5 +10,5 @@
 
 BBCLASSEXTEND = "native"
 
-SRC_URI[md5sum] = "4fa92377e0ddc137cd226a7a87b6b29a"
-SRC_URI[sha256sum] = "773f2af49c7ea2c44fba4213bee64325875c1b3c9bc4bbcd8dac9261751809c1"
+SRC_URI_EXT = "xz"
+SRC_URI[sha256sum] = "68baee57e70250ac4a7759fb78221831f97d88bc8e51dcc2e64eb3f8ca56bae3"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xsetroot_1.1.2.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xsetroot_1.1.3.bb
similarity index 66%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-app/xsetroot_1.1.2.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-app/xsetroot_1.1.3.bb
index a9a8acf..7e909f9 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xsetroot_1.1.2.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xsetroot_1.1.3.bb
@@ -7,7 +7,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://COPYING;md5=6ea29dbee22324787c061f039e0529de"
 
-DEPENDS += "xbitmaps libxcursor"
+DEPENDS += "xbitmaps libxcursor libxmu"
 
-SRC_URI[md5sum] = "5fe769c8777a6e873ed1305e4ce2c353"
-SRC_URI[sha256sum] = "10c442ba23591fb5470cea477a0aa5f679371f4f879c8387a1d9d05637ae417c"
+SRC_URI_EXT = "xz"
+SRC_URI[sha256sum] = "6081b45a9eb4426e045d259d1e144b32417fb635e5b96aa90647365ac96638d1"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xstdcmap_1.0.4.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xstdcmap_1.0.5.bb
similarity index 74%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-app/xstdcmap_1.0.4.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-app/xstdcmap_1.0.5.bb
index 9d523bd..7d3aab5 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xstdcmap_1.0.4.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-app/xstdcmap_1.0.5.bb
@@ -11,6 +11,6 @@
 DEPENDS += "libxmu"
 BBCLASSEXTEND = "native"
 
-SRC_URI[md5sum] = "da67142c128d18386ff145882e0afc66"
-SRC_URI[sha256sum] = "06898b3f1eaad0b205ff3c75bdefa3207868b889d4cb37b32b8267b2bbfe6f8b"
+SRC_URI_EXT = "xz"
+SRC_URI[sha256sum] = "365847e379398499ec9ad9a299cc47a0d6e7feba9546dfd4e5b422204b5ac180"
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xbitmaps_1.1.2.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xbitmaps_1.1.2.bb
deleted file mode 100644
index 37183b1..0000000
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xbitmaps_1.1.2.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-require xorg-data-common.inc
-
-SUMMARY = "Common X11 Bitmaps"
-LICENSE = "MIT"
-DEPENDS += "libxmu"
-RDEPENDS:${PN}-dev = ""
-
-LIC_FILES_CHKSUM = "file://COPYING;md5=dbd075aaffa4a60a8d00696f2e4b9a8f"
-
-SRC_URI[md5sum] = "cedeef095918aca86da79a2934e03daf"
-SRC_URI[sha256sum] = "b9f0c71563125937776c8f1f25174ae9685314cbd130fb4c2efce811981e07ee"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xbitmaps_1.1.3.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xbitmaps_1.1.3.bb
new file mode 100644
index 0000000..5f49152
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xbitmaps_1.1.3.bb
@@ -0,0 +1,7 @@
+require xorg-data-common.inc
+
+SUMMARY = "Common X11 Bitmaps"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=dbd075aaffa4a60a8d00696f2e4b9a8f"
+
+SRC_URI[sha256sum] = "ad6cad54887832a17d86c2ccfc5e52a1dfab090f8307b152c78b0e1529cd0f7a"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xcursor-themes_1.0.7.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xcursor-themes_1.0.7.bb
new file mode 100644
index 0000000..9ebd2d1
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xcursor-themes_1.0.7.bb
@@ -0,0 +1,11 @@
+require xorg-data-common.inc
+
+SUMMARY = "Default set of cursor themes for use with libXcursor"
+
+DEPENDS:append = " libxcursor xcursorgen-native"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=d8cbd99fff773f92e844948f74ef0df8"
+
+SRC_URI[sha256sum] = "95bae8f48823d894a05bf42dfbf453674ab7dbdeb11e2bc079e8525ad47378c8"
+
+FILES:${PN} += "${datadir}/icons"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xorg-data-common.inc b/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xorg-data-common.inc
index 1c6408d..17fe00a 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xorg-data-common.inc
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-data/xorg-data-common.inc
@@ -2,10 +2,10 @@
 SECTION = "x11/data"
 LICENSE = "MIT"
 
-XORG_PN = "${BPN}"
+DEPENDS = "util-macros-native virtual/libx11"
 
-SRC_URI = "${XORG_MIRROR}/individual/data/${BP}.tar.bz2"
-S = "${WORKDIR}/${XORG_PN}-${PV}"
+SRC_URI_EXT = "xz"
+SRC_URI = "${XORG_MIRROR}/individual/data/${BP}.tar.${SRC_URI_EXT}"
 
 inherit features_check autotools pkgconfig
 
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-doc-common.inc b/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-doc-common.inc
index aa4795e..042db48 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-doc-common.inc
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-doc-common.inc
@@ -3,10 +3,11 @@
 SECTION = "x11/docs"
 LICENSE = "MIT"
 
-SRC_URI = "${XORG_MIRROR}/individual/doc/${BPN}-${PV}.tar.bz2"
+DEPENDS = "util-macros-native"
 
-S = "${WORKDIR}/${BPN}-${PV}"
-
-INC_PR = "r1"
+SRC_URI_EXT = "bz2"
+SRC_URI = "${XORG_MIRROR}/individual/doc/${BPN}-${PV}.tar.${SRC_URI_EXT}"
 
 inherit autotools pkgconfig
+
+
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-docs_1.7.2.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-docs_1.7.2.bb
new file mode 100644
index 0000000..4cef981
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-docs_1.7.2.bb
@@ -0,0 +1,7 @@
+require xorg-doc-common.inc
+
+SUMMARY = "Documentation for the X Window System"
+
+LIC_FILES_CHKSUM = "file://general/License.xml;md5=f2677c20a4066714e233e9bbd8659aa2"
+
+SRC_URI[sha256sum] = "2391b8af472626c12d3c3814b5e7a0ea43c3a96eda94255b7ed8bdff0fbf08e3"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-sgml-doctools_1.12.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-sgml-doctools_1.12.bb
index 050cb29..21a0ed7 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-sgml-doctools_1.12.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-doc/xorg-sgml-doctools_1.12.bb
@@ -1,10 +1,11 @@
 require xorg-doc-common.inc
+
 PE = "1"
 
-DEPENDS += "util-macros"
+SUMMARY = "SGML entities and XML/CSS stylesheets used in X.Org docs"
 
 LIC_FILES_CHKSUM = "file://COPYING;md5=c8c6c808cd3c797a07b24e443af1c449"
 
 SRC_URI[sha256sum] = "65a9fdddedc17bd5e9c0b00d904960f03f047c3a62de5458989d493c29fec806"
 
-FILES:${PN} += " /usr/share/sgml/X11"
+FILES:${PN} += "${datadir}/sgml/X11"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-input-void_1.4.1.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-input-void_1.4.1.bb
deleted file mode 100644
index 88fb4b9..0000000
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-input-void_1.4.1.bb
+++ /dev/null
@@ -1,8 +0,0 @@
-require recipes-graphics/xorg-driver/xorg-driver-input.inc
-SUMMARY = "X.Org X server -- void input driver"
-PR = "r22"
-
-LIC_FILES_CHKSUM = "file://COPYING;md5=4be6a915bfbf111cd88706fc6a6f141b"
-
-SRC_URI[md5sum] = "5227013b52b3ca85d6b7ec8adea988d4"
-SRC_URI[sha256sum] = "f96e4f0a622821bf43a74bd419f2a18423343996c9d243c7e1430ba2d142339c"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-input-void_1.4.2.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-input-void_1.4.2.bb
new file mode 100644
index 0000000..54a6476
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-input-void_1.4.2.bb
@@ -0,0 +1,8 @@
+require recipes-graphics/xorg-driver/xorg-driver-input.inc
+SUMMARY = "X.Org X server -- void input driver"
+PR = "r22"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=4be6a915bfbf111cd88706fc6a6f141b"
+
+XORG_DRIVER_COMPRESSOR = ".tar.xz"
+SRC_URI[sha256sum] = "a211d8e21ce0e2ed8af5b8a2e8d4409d70c9c7e5ee528f5e6002ad279bf07885"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-ati_git.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-ati_22.0.0.bb
similarity index 74%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-ati_git.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-ati_22.0.0.bb
index 9452c3a..57ea9d2 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-ati_git.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-ati_22.0.0.bb
@@ -9,18 +9,10 @@
 DEPENDS += "virtual/libx11 libxvmc drm \
             virtual/libgl xorgproto libpciaccess"
 
-inherit features_check
-
 REQUIRED_DISTRO_FEATURES += "opengl"
 
-SRC_URI = "git://git@gitlab.freedesktop.org/xorg/driver/xf86-video-ati.git;branch=master"
-SRCREV = "7a6a34af026f0bef8080b91baf97a729380bca01"
-
-SRC_URI[sha256sum] = "659f5a1629eea5f5334d9b39b18e6807a63aa1efa33c1236d9cc53acbb223c49"
-
-PV = "19.1.0+git${SRCPV}"
-
-S = "${WORKDIR}/git"
+XORG_DRIVER_COMPRESSOR = ".tar.xz"
+SRC_URI[sha256sum] = "c8c8bb56d3f6227c97e59c3a3c85a25133584ceb82ab5bc05a902a743ab7bf6d"
 
 PACKAGECONFIG ??= "udev"
 PACKAGECONFIG[udev] = "--enable-udev,--disable-udev,udev"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga/checkfile.patch b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga/checkfile.patch
deleted file mode 100644
index ceae6df..0000000
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga/checkfile.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-Upstream-Status: Submitted [https://bugs.freedesktop.org/show_bug.cgi?id=57606]
-Signed-off-by: Ross Burton <ross.burton@intel.com>
-
-From c9014a8f3c9b691b5aa7b1f3ec66cf7c84b8211b Mon Sep 17 00:00:00 2001
-From: Ross Burton <ross.burton@intel.com>
-Date: Thu, 29 Nov 2012 11:00:43 +0000
-Subject: [PATCH] build: dont use AC_CHECK_FILE when enabling DRI
-
-Automatically enabling or disabling a feature based on installed files isn't
-deterministic, and AC_CHECK_FILE returns an error when cross-compiling.
-
-Fix this by enabling DRI by default, and removing the explicit file checks as
-pkg-config is good enough.
-
-(#57606)
-
-Signed-off-by: Ross Burton <ross.burton@intel.com>
----
- configure.ac |   25 ++-----------------------
- 1 file changed, 2 insertions(+), 23 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index fca1a9c..d2aa2ed 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -55,9 +55,9 @@ AC_ARG_WITH(xorg-module-dir,
-             [moduledir="$libdir/xorg/modules"])
- 
- AC_ARG_ENABLE(dri, AS_HELP_STRING([--disable-dri],
--                                  [Disable DRI support [[default=auto]]]),
-+                                  [Disable DRI support [[default=enabled]]]),
-               [DRI="$enableval"],
--              [DRI=auto])
-+              [DRI=yes])
- AC_ARG_ENABLE(exa,
-               AS_HELP_STRING([--disable-exa],
-                              [Disable EXA support [[default=enabled]]]),
-@@ -76,27 +76,6 @@ sdkdir=`$PKG_CONFIG --variable=sdkdir xorg-server`
- 
- # Checks for libraries.
- 
--if test "x$DRI" != xno; then
--        AC_CHECK_FILE([${sdkdir}/dri.h],
--                      [have_dri_h="yes"], [have_dri_h="no"])
--        AC_CHECK_FILE([${sdkdir}/sarea.h],
--                      [have_sarea_h="yes"], [have_sarea_h="no"])
--        AC_CHECK_FILE([${sdkdir}/dristruct.h],
--                      [have_dristruct_h="yes"], [have_dristruct_h="no"])
--fi
--
--AC_MSG_CHECKING([whether to include DRI support])
--if test "x$DRI" = xauto; then
--        if test "x$have_dri_h" = xyes && \
--           test "x$have_sarea_h" = xyes && \
--           test "x$have_dristruct_h" = xyes; then
--                DRI="yes"
--        else
--                DRI="no"
--        fi
--fi
--AC_MSG_RESULT([$DRI])
--
- AM_CONDITIONAL(DRI, test "x$DRI" = xyes)
- if test "x$DRI" = xyes; then
-         PKG_CHECK_MODULES(DRI, [libdrm >= 2.0 xf86driproto])
--- 
-1.7.10.4
-
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga_2.0.0.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga_2.0.1.bb
similarity index 66%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga_2.0.0.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga_2.0.1.bb
index a9ae901..34b3e4c 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga_2.0.0.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-driver/xf86-video-mga_2.0.1.bb
@@ -4,16 +4,14 @@
 
 DESCRIPTION = "mga is an Xorg driver for Matrox video cards"
 
-LIC_FILES_CHKSUM = "file://COPYING;md5=bc1395d2cd32dfc5d6c57d2d8f83d3fc"
-
-SRC_URI += "file://checkfile.patch"
+LIC_FILES_CHKSUM = "file://COPYING;md5=4aa220f495ce9be5ce4243d21ebac14f"
 
 DEPENDS += "virtual/libx11 libpciaccess"
 
 COMPATIBLE_HOST = '(i.86.*-linux|x86_64.*-linux)'
 
-SRC_URI[md5sum] = "b8fc99b4adea8bfe80156b13df4b6c9c"
-SRC_URI[sha256sum] = "268946e1a13e9d80e4f724a0740df9e6e8c8bad37697fcbf456924e9fdbb5d79"
+XORG_DRIVER_COMPRESSOR = ".tar.xz"
+SRC_URI[sha256sum] = "27a33b70837965bb4a5f27fd260be085ca5bba837a4e62907f093c2f205603ab"
 
 PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'dri', '', d)}"
 PACKAGECONFIG[dri] = "--enable-dri,--disable-dri,drm xorgproto,xserver-xorg-extension-dri"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/xorg-lib/libxaw_1.0.14.bb b/meta-openembedded/meta-oe/recipes-graphics/xorg-lib/libxaw_1.0.15.bb
similarity index 80%
rename from meta-openembedded/meta-oe/recipes-graphics/xorg-lib/libxaw_1.0.14.bb
rename to meta-openembedded/meta-oe/recipes-graphics/xorg-lib/libxaw_1.0.15.bb
index 4a90984..253bb6f 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/xorg-lib/libxaw_1.0.14.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/xorg-lib/libxaw_1.0.15.bb
@@ -7,10 +7,8 @@
 PE = "1"
 
 XORG_PN = "libXaw"
-XORG_EXT = "tar.bz2"
 
-SRC_URI[md5sum] = "c1ce21c296bbf3da3e30cf651649563e"
-SRC_URI[sha256sum] = "76aef98ea3df92615faec28004b5ce4e5c6855e716fa16de40c32030722a6f8e"
+SRC_URI[sha256sum] = "ab35f70fde9fb02cc71b342f654846a74328b74cb3a0703c02d20eddb212754a"
 
 do_install:append () {
     ln -sf libXaw6.so.6 ${D}${libdir}/libXaw.so.6
diff --git a/meta-openembedded/meta-oe/recipes-kernel/crash/crash-cross-canadian_8.0.4.bb b/meta-openembedded/meta-oe/recipes-kernel/crash/crash-cross-canadian_8.0.4.bb
new file mode 100644
index 0000000..04be126
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-kernel/crash/crash-cross-canadian_8.0.4.bb
@@ -0,0 +1,53 @@
+inherit cross-canadian
+
+SUMMARY = "crash utility (cross-canadian crash for ${TARGET_ARCH} target)"
+PN = "crash-cross-canadian-${TRANSLATED_TARGET_ARCH}"
+BPN = "crash"
+
+require crash.inc
+
+PR = "${INC_PR}.0"
+
+DEPENDS = "\
+    nativesdk-ncurses \
+    nativesdk-expat \
+    nativesdk-gettext \
+    nativesdk-gmp \
+    nativesdk-mpfr \
+    nativesdk-readline \
+    nativesdk-zlib \
+    virtual/${HOST_PREFIX}gcc \
+    virtual/${HOST_PREFIX}binutils \
+    virtual/nativesdk-${HOST_PREFIX}compilerlibs \
+    virtual/nativesdk-libc"
+
+RDEPENDS:${PN} = "nativesdk-liblzma"
+
+EXTRA_OEMAKE:class-cross-canadian = 'RPMPKG="${PV}" \
+                                     GDB_TARGET="${BUILD_SYS} --target=${TARGET_SYS}" \
+                                     GDB_HOST="${HOST_SYS}" \
+                                     GDB_MAKE_JOBS="${PARALLEL_MAKE}" \
+                                     LDFLAGS="${LDFLAGS}" \
+                                     '
+
+# To ship crash into your sdk, you should create/update a packagegroup-cross-canadian.bbappend and
+# add the following
+# CRASH = "crash-cross-canadian-${TRANSLATED_TARGET_ARCH}"
+# RDEPENDS:${PN} += "${@all_multilib_tune_values(d, 'CRASH')}"
+#
+# You should also add some kernel packages in your sdk, add the followng in your conf/local.conf:
+#
+# TOOLCHAIN_TARGET_TASK += "\
+#     kernel-vmlinux \
+#     kernel-dbg \
+#     kernel-dev \
+# "
+#
+# After sourcing the sdk environment script, you can analyze a kernel panic dump with
+#
+# crash $OECORE_TARGET_SYSROOT/boot/<vmlinux file> $OECORE_TARGET_SYSROOT/boot/<System.map file> <your vmcore>
+
+do_install:class-cross-canadian () {
+    install -m 0755 ${S}/crash ${D}/${bindir}
+    cross_canadian_bindirlinks
+}
diff --git a/meta-openembedded/meta-oe/recipes-kernel/crash/crash_8.0.2.bb b/meta-openembedded/meta-oe/recipes-kernel/crash/crash.inc
similarity index 82%
rename from meta-openembedded/meta-oe/recipes-kernel/crash/crash_8.0.2.bb
rename to meta-openembedded/meta-oe/recipes-kernel/crash/crash.inc
index f8a460b..04318b1 100644
--- a/meta-openembedded/meta-oe/recipes-kernel/crash/crash_8.0.2.bb
+++ b/meta-openembedded/meta-oe/recipes-kernel/crash/crash.inc
@@ -12,6 +12,8 @@
 
 DEPENDS = "zlib readline coreutils-native ncurses-native"
 
+INC_PR = "r1"
+
 S = "${WORKDIR}/git"
 SRC_URI = "git://github.com/crash-utility/${BPN}.git;branch=master;protocol=https \
            ${GNU_MIRROR}/gdb/gdb-10.2.tar.gz;name=gdb;subdir=git \
@@ -20,9 +22,8 @@
            file://0001-cross_add_configure_option.patch \
            file://donnot-extract-gdb-during-do-compile.patch \
            file://gdb_build_jobs_and_not_write_crash_target.patch \
-           file://0001-make-src-string-const-in-strlcpy.patch \
            "
-SRCREV = "f1cd581d1c4afa5b8ffdfaa6a3ea9f545fe4ec91"
+SRCREV = "a6832f608cb5d473739cf33bbf84ab1df8d98fd5"
 
 SRC_URI[gdb.sha256sum] = "b33ad58d687487a821ec8d878daab0f716be60d0936f2e3ac5cf08419ce70350"
 
@@ -30,7 +31,6 @@
 
 inherit gettext
 
-BBCLASSEXTEND = "native cross"
 TARGET_CC_ARCH:append = " ${SELECTED_OPTIMIZATION}"
 
 # crash 7.1.3 and before don't support mips64/riscv64
@@ -47,15 +47,6 @@
                 LDFLAGS="${LDFLAGS}" \
                 '
 
-EXTRA_OEMAKE:class-cross = 'RPMPKG="${PV}" \
-                            GDB_TARGET="${BUILD_SYS} --target=${TARGET_SYS}" \
-                            GDB_HOST="${BUILD_SYS}" \
-                            GDB_MAKE_JOBS="${PARALLEL_MAKE}" \
-                            '
-
-EXTRA_OEMAKE:append:class-native = " LDFLAGS='${BUILD_LDFLAGS}'"
-EXTRA_OEMAKE:append:class-cross = " LDFLAGS='${BUILD_LDFLAGS}'"
-
 do_configure() {
     :
 }
@@ -90,21 +81,7 @@
     install -m 0644 ${S}/defs.h ${D}${includedir}/crash
 }
 
-do_install:class-target () {
-    oe_runmake DESTDIR=${D} install
-}
-
-do_install:class-native () {
-    oe_runmake DESTDIR=${D}${STAGING_DIR_NATIVE} install
-}
-
-do_install:class-cross () {
-    install -m 0755 ${S}/crash ${D}/${bindir}
-}
-
 RDEPENDS:${PN} += "liblzma"
-RDEPENDS:${PN}:class-native = ""
-RDEPENDS:${PN}:class-cross = ""
 
 # Causes gcc to get stuck and eat all available memory in qemuarm builds
 # jenkins  15161  100 12.5 10389596 10321284 ?   R    11:40  28:17 /home/jenkins/oe/world/shr-core/tmp-glibc/sysroots/x86_64-linux/usr/libexec/arm-oe-linux-gnueabi/gcc/arm-oe-linux-gnueabi/4.9.2/cc1 -quiet -I . -I . -I ./common -I ./config -I ./../include/opcode -I ./../opcodes/.. -I ./../readline/.. -I ../bfd -I ./../bfd -I ./../include -I ../libdecnumber -I ./../libdecnumber -I ./gnulib/import -I build-gnulib/import -isysroot /home/jenkins/oe/world/shr-core/tmp-glibc/sysroots/qemuarm -MMD eval.d -MF .deps/eval.Tpo -MP -MT eval.o -D LOCALEDIR="/usr/local/share/locale" -D CRASH_MERGE -D HAVE_CONFIG_H -D TUI=1 eval.c -quiet -dumpbase eval.c -march=armv5te -mthumb -mthumb-interwork -mtls-dialect=gnu -auxbase-strip eval.o -g -O2 -Wall -Wpointer-arith -Wformat-nonliteral -Wno-pointer-sign -Wno-unused -Wunused-value -Wunused-function -Wno-switch -Wno-char-subscripts -Wmissing-prototypes -Wdeclaration-after-statement -Wempty-body -feliminate-unused-debug-types -o -
diff --git a/meta-openembedded/meta-oe/recipes-kernel/crash/crash/0001-make-src-string-const-in-strlcpy.patch b/meta-openembedded/meta-oe/recipes-kernel/crash/crash/0001-make-src-string-const-in-strlcpy.patch
deleted file mode 100644
index 546973e..0000000
--- a/meta-openembedded/meta-oe/recipes-kernel/crash/crash/0001-make-src-string-const-in-strlcpy.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From 4ee56105881d7bb1da1e668ac5bb47a4e0846676 Mon Sep 17 00:00:00 2001
-From: Lianbo Jiang <lijiang@redhat.com>
-Date: Wed, 5 Jul 2023 10:02:59 +0800
-Subject: [PATCH] Fix compilation error due to new strlcpy function that glibc
- added
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The crash-utility has its own strlcpy(), but recently the latest glibc
-has also implemented the strlcpy function, which is derived from
-OpenBSD.  Eventually this caused the following compilation error:
-
-  # make -j8 lzo
-  ...
-  In file included from global_data.c:18:
-  defs.h:5556:8: error: conflicting types for ‘strlcpy’; have ‘size_t(char *, char *, size_t)’ {aka ‘long unsigned int(char *, char *, long unsigned int)’}
-   5556 | size_t strlcpy(char *, char *, size_t);
-        |        ^~~~~~~
-  In file included from memory.c:19:
-  defs.h:5556:8: error: conflicting types for ‘strlcpy’; have ‘size_t(char *, char *, size_t)’ {aka ‘long unsigned int(char *, char *, long unsigned int)’}
-   5556 | size_t strlcpy(char *, char *, size_t);
-        |        ^~~~~~~
-  ...
-
-To fix the issue, let's declare the strlcpy() as a weak function and
-keep the same parameter types as the glibc function has.
-
-Related glibc commits:
-454a20c8756c ("Implement strlcpy and strlcat [BZ #178]")
-d2fda60e7c40 ("manual: Manual update for strlcat, strlcpy, wcslcat, wclscpy")
-388ae538ddcb ("hurd: Add strlcpy, strlcat, wcslcpy, wcslcat to libc.abilist")
-
-Upstream-Status: Backport [https://github.com/kraj/crash/commit/4ee56105881d7bb1da1e668ac5bb47a4e0846676]
-Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
----
- defs.h  | 2 +-
- tools.c | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/defs.h b/defs.h
-index 8f7d1fa..26afe23 100644
---- a/defs.h
-+++ b/defs.h
-@@ -5553,7 +5553,7 @@ uint32_t swap32(uint32_t, int);
- uint64_t swap64(uint64_t, int);
- ulong *get_cpumask_buf(void);
- int make_cpumask(char *, ulong *, int, int *);
--size_t strlcpy(char *, char *, size_t);
-+size_t strlcpy(char *, const char *, size_t) __attribute__ ((__weak__));
- struct rb_node *rb_first(struct rb_root *);
- struct rb_node *rb_parent(struct rb_node *, struct rb_node *);
- struct rb_node *rb_right(struct rb_node *, struct rb_node *);
-diff --git a/tools.c b/tools.c
-index 392a797..0f2db10 100644
---- a/tools.c
-+++ b/tools.c
-@@ -6795,7 +6795,7 @@ make_cpumask_error:
-  * always be NULL-terminated.
-  */
- size_t 
--strlcpy(char *dest, char *src, size_t size)
-+strlcpy(char *dest, const char *src, size_t size)
- {
- 	size_t ret = strlen(src);
- 
--- 
-2.41.0
-
diff --git a/meta-openembedded/meta-oe/recipes-kernel/crash/crash/config-site.crash-7.0.9 b/meta-openembedded/meta-oe/recipes-kernel/crash/crash/config-site.crash-7.0.9
deleted file mode 100644
index d6fc22f..0000000
--- a/meta-openembedded/meta-oe/recipes-kernel/crash/crash/config-site.crash-7.0.9
+++ /dev/null
@@ -1 +0,0 @@
-bash_cv_have_mbstate_t=yes
diff --git a/meta-openembedded/meta-oe/recipes-kernel/crash/crash_8.0.4.bb b/meta-openembedded/meta-oe/recipes-kernel/crash/crash_8.0.4.bb
new file mode 100644
index 0000000..cc46ab9
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-kernel/crash/crash_8.0.4.bb
@@ -0,0 +1,29 @@
+require crash.inc
+
+PR = "${INC_PR}.0"
+
+BBCLASSEXTEND = "native cross"
+
+EXTRA_OEMAKE:class-cross = 'RPMPKG="${PV}" \
+                            GDB_TARGET="${BUILD_SYS} --target=${TARGET_SYS}" \
+                            GDB_HOST="${BUILD_SYS}" \
+                            GDB_MAKE_JOBS="${PARALLEL_MAKE}" \
+                            '
+
+EXTRA_OEMAKE:append:class-native = " LDFLAGS='${BUILD_LDFLAGS}'"
+EXTRA_OEMAKE:append:class-cross = " LDFLAGS='${BUILD_LDFLAGS}'"
+
+do_install:class-target () {
+    oe_runmake DESTDIR=${D} install
+}
+
+do_install:class-native () {
+    oe_runmake DESTDIR=${D}${STAGING_DIR_NATIVE} install
+}
+
+do_install:class-cross () {
+    install -m 0755 ${S}/crash ${D}/${bindir}
+}
+
+RDEPENDS:${PN}:class-native = ""
+RDEPENDS:${PN}:class-cross = ""
diff --git a/meta-openembedded/meta-oe/recipes-multimedia/faad2/faad2_2.10.0.bb b/meta-openembedded/meta-oe/recipes-multimedia/faad2/faad2_2.11.1.bb
similarity index 82%
rename from meta-openembedded/meta-oe/recipes-multimedia/faad2/faad2_2.10.0.bb
rename to meta-openembedded/meta-oe/recipes-multimedia/faad2/faad2_2.11.1.bb
index 1b42360..76e8f72 100644
--- a/meta-openembedded/meta-oe/recipes-multimedia/faad2/faad2_2.10.0.bb
+++ b/meta-openembedded/meta-oe/recipes-multimedia/faad2/faad2_2.11.1.bb
@@ -10,8 +10,8 @@
 PV .= "+git${SRCPV}"
 
 SRC_URI = "git://github.com/knik0/faad2.git;branch=master;protocol=https"
-SRCREV = "df42c6fc018552519d140e3d8ffe7046ed48b0cf"
+SRCREV = "216f00e8ddba6f2c64caf481a04f1ddd78b93e78"
 
 S = "${WORKDIR}/git"
 
-inherit autotools lib_package
+inherit cmake
diff --git a/meta-openembedded/meta-oe/recipes-printing/qpdf/qpdf_11.6.3.bb b/meta-openembedded/meta-oe/recipes-printing/qpdf/qpdf_11.6.4.bb
similarity index 94%
rename from meta-openembedded/meta-oe/recipes-printing/qpdf/qpdf_11.6.3.bb
rename to meta-openembedded/meta-oe/recipes-printing/qpdf/qpdf_11.6.4.bb
index ceb9f25..2dd7b68 100644
--- a/meta-openembedded/meta-oe/recipes-printing/qpdf/qpdf_11.6.3.bb
+++ b/meta-openembedded/meta-oe/recipes-printing/qpdf/qpdf_11.6.4.bb
@@ -6,7 +6,7 @@
 DEPENDS = "zlib jpeg ${@bb.utils.contains('PACKAGECONFIG', 'gnutls', 'gnutls', 'openssl', d)}"
 
 SRC_URI = "git://github.com/qpdf/qpdf.git;protocol=https;branch=main"
-SRCREV = "81823f4032caefd1050bccb207d315839c1c48db"
+SRCREV = "d8371889d070d2f88636434ebd8412708a63e54e"
 
 inherit cmake pkgconfig gettext
 
diff --git a/meta-openembedded/meta-oe/recipes-support/avro/avro-c_1.11.2.bb b/meta-openembedded/meta-oe/recipes-support/avro/avro-c_1.11.3.bb
similarity index 88%
rename from meta-openembedded/meta-oe/recipes-support/avro/avro-c_1.11.2.bb
rename to meta-openembedded/meta-oe/recipes-support/avro/avro-c_1.11.3.bb
index 9b6a52e..14a3cbe 100644
--- a/meta-openembedded/meta-oe/recipes-support/avro/avro-c_1.11.2.bb
+++ b/meta-openembedded/meta-oe/recipes-support/avro/avro-c_1.11.3.bb
@@ -8,7 +8,7 @@
 DEPENDS = "jansson zlib xz"
 
 BRANCH = "branch-1.11"
-SRCREV = "44d1c4f221ccc4571a4b4b9edb023ed1e89354b7"
+SRCREV = "35ff8b997738e4d983871902d47bfb67b3250734"
 SRC_URI = "git://github.com/apache/avro;branch=${BRANCH};protocol=https \
           "
 
diff --git a/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares/run-ptest b/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares/run-ptest
new file mode 100644
index 0000000..15971de
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares/run-ptest
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+if ./arestest; then
+	echo "PASS: c-ares"
+else
+	echo "FAIL: c-ares"
+fi
diff --git a/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares_1.22.1.bb b/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares_1.22.1.bb
deleted file mode 100644
index 8ba1b60..0000000
--- a/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares_1.22.1.bb
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2012-2014 LG Electronics, Inc.
-SUMMARY = "c-ares is a C library that resolves names asynchronously."
-HOMEPAGE = "http://daniel.haxx.se/projects/c-ares/"
-SECTION = "libs"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.md;md5=fdbc58a6da11a9f68aa73c453818decc"
-
-SRC_URI = "git://github.com/c-ares/c-ares.git;branch=main;protocol=https"
-SRCREV = "36466bb240661fa8fdc2ffa47d229d92ac762286"
-
-UPSTREAM_CHECK_GITTAGREGEX = "cares-(?P<pver>\d+_(\d_?)+)"
-
-S = "${WORKDIR}/git"
-
-inherit cmake pkgconfig
-
-PACKAGES =+ "${PN}-utils"
-
-FILES:${PN}-utils = "${bindir}"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares_1.24.0.bb b/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares_1.24.0.bb
new file mode 100644
index 0000000..3b3b2b8
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/c-ares/c-ares_1.24.0.bb
@@ -0,0 +1,30 @@
+# Copyright (c) 2012-2014 LG Electronics, Inc.
+SUMMARY = "c-ares is a C library that resolves names asynchronously."
+HOMEPAGE = "http://daniel.haxx.se/projects/c-ares/"
+SECTION = "libs"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=fdbc58a6da11a9f68aa73c453818decc"
+
+SRC_URI = "https://c-ares.org/download/c-ares-1.24.0.tar.gz \
+           file://run-ptest"
+SRC_URI[sha256sum] = "c517de6d5ac9cd55a9b72c1541c3e25b84588421817b5f092850ac09a8df5103"
+
+PACKAGECONFIG ?= "${@bb.utils.contains('PTEST_ENABLED', '1', 'tests', '', d)}"
+PACKAGECONFIG[manpages] = ""
+PACKAGECONFIG[tests] = "-DCARES_BUILD_TESTS=ON,-DCARES_BUILD_TESTS=OFF,googletest"
+
+inherit cmake manpages pkgconfig ptest
+
+EXTRA_OECMAKE = "-DCARES_STATIC=${@ 'ON' if d.getVar('DISABLE_STATIC') == '' else 'OFF' }"
+
+do_install_ptest () {
+	install -d ${D}${PTEST_PATH}
+	install -m 0755 ${B}/bin/arestest ${D}${PTEST_PATH}
+	install -m 0755 ${WORKDIR}/run-ptest ${D}${PTEST_PATH}
+}
+
+PACKAGE_BEFORE_PN = "${PN}-utils"
+
+FILES:${PN}-utils = "${bindir}"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.18.bb b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.19.bb
similarity index 91%
rename from meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.18.bb
rename to meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.19.bb
index 3654550..aec7286 100644
--- a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.18.bb
+++ b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.19.bb
@@ -11,8 +11,8 @@
            file://disable-float-tests.patch \
            file://disable-outside-tests.patch "
 
-# tag 2.10.18
-SRCREV= "122d09549201da5383321d870bed45ecb9e168c5"
+# tag 2.10.19
+SRCREV= "411a109150b270f23c8c97fa4ec9a0a4a98cdecf"
 
 S = "${WORKDIR}/git"
 
diff --git a/meta-openembedded/meta-oe/recipes-support/cyaml/cyaml_1.4.1.bb b/meta-openembedded/meta-oe/recipes-support/cyaml/cyaml_1.4.1.bb
new file mode 100644
index 0000000..f63348a
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/cyaml/cyaml_1.4.1.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Cyaml library"
+DESCRIPTION = "LibCYAML is a library for reading and writing structured YAML documents."
+HOMEPAGE = "https://github.com/tlsa/libcyaml"
+SECTION = "libs"
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=fe6f0e49348c87bddd5d27803dceaaf0"
+DEPENDS = " \
+    libyaml \
+"
+SRCREV = "07ff8654a270ec9b410acd3152b60de9e9f941af"
+
+SRC_URI = "git://github.com/tlsa/libcyaml.git;protocol=https;branch=main"
+
+S = "${WORKDIR}/git"
+
+inherit pkgconfig
+
+EXTRA_OEMAKE = "'PREFIX=""' 'DESTDIR=${D}' 'CFLAGS=${CFLAGS}' 'LIBDIR=${libdir}' 'INCLUDEDIR=${includedir}' 'VARIANT=release'"
+
+do_compile() {
+    oe_runmake
+}
+do_install() {
+    oe_runmake install
+}
+
+CFLAGS += "-pedantic -Wall -Wextra -O3 -Iinclude"
\ No newline at end of file
diff --git a/meta-openembedded/meta-oe/recipes-support/dool/dool/0001-Fix-build-error-as-following.patch b/meta-openembedded/meta-oe/recipes-support/dool/dool/0001-Fix-build-error-as-following.patch
deleted file mode 100644
index 2324af4..0000000
--- a/meta-openembedded/meta-oe/recipes-support/dool/dool/0001-Fix-build-error-as-following.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From e81feec1ebbc676220cd8759d83f46335602d079 Mon Sep 17 00:00:00 2001
-From: Lei Maohui <leimaohui@fujitsu.com>
-Date: Fri, 7 Jan 2022 14:37:36 +0900
-Subject: [PATCH] Fix build error as following:
-
-*** No rule to make target 'dstat.1', needed by 'docs'.  Stop.
-
-Upstream-Status: Pending
-
-Signed-off-by: Lei Maohui <leimaohui@fujitsu.com>
----
- docs/Makefile | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/docs/Makefile b/docs/Makefile
-index c031e82..1a85e61 100644
---- a/docs/Makefile
-+++ b/docs/Makefile
-@@ -11,13 +11,13 @@ all:
- 
- dist: docs
- 
--docs: dstat.1 $(htmltargets)
-+docs: dool.1 $(htmltargets)
- 
--install: dstat.1
--	install -Dp -m0644 dstat.1 $(DESTDIR)$(mandir)/man1/dstat.1
-+install: dool.1
-+	install -Dp -m0644 dool.1 $(DESTDIR)$(mandir)/man1/dool.1
- 
- clean:
--	rm -f dstat.1 *.html *.xml
-+	rm -f dool.1 *.html *.xml
- 
- %.1.html: %.1.adoc
- 	asciidoc -d manpage $<
--- 
-2.25.1
-
diff --git a/meta-openembedded/meta-oe/recipes-support/dool/dool/0001-Fix-rename-in-docs.patch b/meta-openembedded/meta-oe/recipes-support/dool/dool/0001-Fix-rename-in-docs.patch
deleted file mode 100644
index 8d576f5..0000000
--- a/meta-openembedded/meta-oe/recipes-support/dool/dool/0001-Fix-rename-in-docs.patch
+++ /dev/null
@@ -1,261 +0,0 @@
-From 689c65fb050976d5a548a5b9a0f5d2c14eaa3301 Mon Sep 17 00:00:00 2001
-From: Alexander Stein <alexander.stein@tq-group.com>
-Date: Thu, 8 Dec 2022 14:11:46 +0100
-Subject: [PATCH 1/1] Fix rename in docs
-
-The content of dool.1.adoc is completly unchanged from dstat.1.adoc.
-Unfortunately the 'NAME' specifies the created file name. So
-building/cleaning docs is currently broken
-
-Upstream-Status: Pending
-https://github.com/scottchiefbaker/dool/pull/30
-
-Signed-off-by: Alexander Stein <alexander.stein@tq-group.com>
----
- docs/dool.1.adoc | 108 +++++++++++++++++++++++------------------------
- 1 file changed, 54 insertions(+), 54 deletions(-)
-
-diff --git a/docs/dool.1.adoc b/docs/dool.1.adoc
-index 24c4a54..921df1f 100644
---- a/docs/dool.1.adoc
-+++ b/docs/dool.1.adoc
-@@ -1,35 +1,35 @@
--= dstat(1)
-+= dool(1)
- Dag Wieers <dag@wieers.com>
- v0.7.3, August 2014
- 
- 
- == NAME
--dstat - versatile tool for generating system resource statistics
-+dool - versatile tool for generating system resource statistics
- 
- 
- == SYNOPSIS
--dstat [-afv] [options..] [delay [count]]
-+dool [-afv] [options..] [delay [count]]
- 
- 
- == DESCRIPTION
--Dstat is a versatile replacement for vmstat, iostat and ifstat. Dstat
-+Dool is a versatile replacement for vmstat, iostat and ifstat. Dool
- overcomes some of the limitations and adds some extra features.
- 
--Dstat allows you to view all of your system resources instantly, you
-+Dool allows you to view all of your system resources instantly, you
- can eg. compare disk usage in combination with interrupts from your
- IDE controller, or compare the network bandwidth numbers directly with
- the disk throughput (in the same interval).
- 
--Dstat also cleverly gives you the most detailed information in columns
-+Dool also cleverly gives you the most detailed information in columns
- and clearly indicates in what magnitude and unit the output is displayed.
- Less confusion, less mistakes, more efficient.
- 
--Dstat is unique in letting you aggregate block device throughput for a
-+Dool is unique in letting you aggregate block device throughput for a
- certain diskset or network bandwidth for a group of interfaces, ie. 
- you can see the throughput for all the block devices that make up a
- single filesystem or storage system.
- 
--Dstat allows its data to be directly written to a CSV file to be
-+Dool allows its data to be directly written to a CSV file to be
- imported and used by OpenOffice, Gnumeric or Excel to create graphs.
- 
- [NOTE]
-@@ -187,13 +187,13 @@ Possible internal stats are::
-     write CSV output to file
- 
- --profile::
--    show profiling statistics when exiting dstat
-+    show profiling statistics when exiting dool
- 
- 
- == PLUGINS
--While anyone can create their own dstat plugins (and contribute them) dstat
-+While anyone can create their own dool plugins (and contribute them) dool
- ships with a number of plugins already that extend its capabilities greatly.
--Here is an overview of the plugins dstat ships with:
-+Here is an overview of the plugins dool ships with:
- 
- --battery::
-     battery in percentage (needs ACPI)
-@@ -225,17 +225,17 @@ Here is an overview of the plugins dstat ships with:
- --disk-wait::
-     average time (in milliseconds) for I/O requests issued to the device to be served
- 
----dstat::
--    show dstat cputime consumption and latency
-+--dool::
-+    show dool cputime consumption and latency
- 
----dstat-cpu::
--    show dstat advanced cpu usage
-+--dool-cpu::
-+    show dool advanced cpu usage
- 
----dstat-ctxt::
--    show dstat context switches
-+--dool-ctxt::
-+    show dool context switches
- 
----dstat-mem::
--    show dstat advanced memory usage
-+--dool-mem::
-+    show dool advanced memory usage
- 
- --fan::
-     fan speed (needs ACPI)
-@@ -250,7 +250,7 @@ Here is an overview of the plugins dstat ships with:
-     GPFS filesystem operations (needs mmpmon)
- 
- --helloworld::
--    Hello world example dstat plugin
-+    Hello world example dool plugin
- 
- --innodb-buffer::
-     show innodb buffer stats
-@@ -340,22 +340,22 @@ Here is an overview of the plugins dstat ships with:
-     show sendmail queue size (needs sendmail)
- 
- --snmp-cpu::
--    show CPU stats using SNMP from DSTAT_SNMPSERVER
-+    show CPU stats using SNMP from DOOL_SNMPSERVER
- 
- --snmp-load::
--    show load stats using SNMP from DSTAT_SNMPSERVER
-+    show load stats using SNMP from DOOL_SNMPSERVER
- 
- --snmp-mem::
--    show memory stats using SNMP from DSTAT_SNMPSERVER
-+    show memory stats using SNMP from DOOL_SNMPSERVER
- 
- --snmp-net::
--    show network stats using SNMP from DSTAT_SNMPSERVER
-+    show network stats using SNMP from DOOL_SNMPSERVER
- 
- --snmp-net-err:
--    show network errors using SNMP from DSTAT_SNMPSERVER
-+    show network errors using SNMP from DOOL_SNMPSERVER
- 
- --snmp-sys::
--    show system stats (interrupts and context switches) using SNMP from DSTAT_SNMPSERVER
-+    show system stats (interrupts and context switches) using SNMP from DOOL_SNMPSERVER
- 
- --snooze::
-     show number of ticks per second
-@@ -463,7 +463,7 @@ The default delay is 1 and count is unspecified (unlimited)
- 
- 
- == INTERMEDIATE UPDATES
--When invoking dstat with a *delay* greater than 1 and without the
-+When invoking dool with a *delay* greater than 1 and without the
- *--noupdate* option, it will show intermediate updates, ie. the first
- time a 1 sec average, the second update a 2 second average, etc. until
- the delay has been reached.
-@@ -475,34 +475,34 @@ average on a new line, just like with vmstat.
- 
- 
- == EXAMPLES
--Using dstat to relate disk-throughput with network-usage (eth0), total CPU-usage and system counters:
-+Using dool to relate disk-throughput with network-usage (eth0), total CPU-usage and system counters:
- ----
--dstat -dnyc -N eth0 -C total -f 5
-+dool -dnyc -N eth0 -C total -f 5
- ----
- 
--Checking dstat's behaviour and the system impact of dstat:
-+Checking dool's behaviour and the system impact of dool:
- ----
--dstat -taf --debug
-+dool -taf --debug
- ----
- 
- Using the time plugin together with cpu, net, disk, system, load, proc and
- top_cpu plugins:
- ----
--dstat -tcndylp --top-cpu
-+dool -tcndylp --top-cpu
- ----
- this is identical to
- ----
--dstat --time --cpu --net --disk --sys --load --proc --top-cpu
-+dool --time --cpu --net --disk --sys --load --proc --top-cpu
- ----
- 
--Using dstat to relate advanced cpu stats with interrupts per device:
-+Using dool to relate advanced cpu stats with interrupts per device:
- ----
--dstat -t --cpu-adv -yif
-+dool -t --cpu-adv -yif
- ----
- 
- 
- == BUGS
--Since it is practically impossible to test dstat on every possible
-+Since it is practically impossible to test dool on every possible
- permutation of kernel, python or distribution version, I need your
- help and your feedback to fix the remaining problems. If you have
- improvements or bugreports, please send them to:
-@@ -513,40 +513,40 @@ Please see the TODO file for known bugs and future plans.
- 
- 
- == FILES
--Paths that may contain external dstat_*.py plugins:
-+Paths that may contain external dool_*.py plugins:
- 
--    ~/.dstat/
-+    ~/.dool/
-     (path of binary)/plugins/
--    /usr/share/dstat/
--    /usr/local/share/dstat/
-+    /usr/share/dool/
-+    /usr/local/share/dool/
- 
- == ENVIRONMENT VARIABLES
- 
--Dstat will read additional command line arguments from the environment
--variable *DSTAT_OPTS*. You can use this to configure Dstat's default
-+Dool will read additional command line arguments from the environment
-+variable *DOOL_OPTS*. You can use this to configure Dool's default
- behavior, e.g. if you have a black-on-white terminal:
- 
--    export DSTAT_OPTS="--bw --noupdate"
-+    export DOOL_OPTS="--bw --noupdate"
- 
- Other internal or external plugins have their own environment variables
- to influence their behavior, e.g.
- 
- 
--    DSTAT_NTPSERVER
-+    DOOL_NTPSERVER
- 
--    DSTAT_MYSQL
--    DSTAT_MYSQL_HOST
--    DSTAT_MYSQL_PORT
--    DSTAT_MYSQL_SOCKET
--    DSTAT_MYSQL_USER
--    DSTAT_MYSQL_PWD
-+    DOOL_MYSQL
-+    DOOL_MYSQL_HOST
-+    DOOL_MYSQL_PORT
-+    DOOL_MYSQL_SOCKET
-+    DOOL_MYSQL_USER
-+    DOOL_MYSQL_PWD
- 
--    DSTAT_SNMPSERVER
--    DSTAT_SNMPCOMMUNITY
-+    DOOL_SNMPSERVER
-+    DOOL_SNMPCOMMUNITY
- 
--    DSTAT_SQUID_OPTS
-+    DOOL_SQUID_OPTS
- 
--    DSTAT_TIMEFMT
-+    DOOL_TIMEFMT
- 
- == SEE ALSO
- 
--- 
-2.34.1
-
diff --git a/meta-openembedded/meta-oe/recipes-support/dool/dool_1.1.0.bb b/meta-openembedded/meta-oe/recipes-support/dool/dool_1.1.0.bb
deleted file mode 100644
index 211f3a2..0000000
--- a/meta-openembedded/meta-oe/recipes-support/dool/dool_1.1.0.bb
+++ /dev/null
@@ -1,25 +0,0 @@
-SUMMARY = "versatile resource statics tool"
-DESCRIPTION = "Dstat is a versatile replacement for vmstat, iostat, netstat and ifstat. \
-Dstat overcomes some of their limitations and adds some extra features, more counters \
-and flexibility. Dstat is handy for monitoring systems during performance tuning tests, \
-benchmarks or troubleshooting."
-HOMEPAGE = "http://dag.wiee.rs/home-made/dstat"
-LICENSE = "GPL-2.0-only"
-LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
-
-DEPENDS += "asciidoc-native xmlto-native"
-
-SRC_URI = "git://github.com/scottchiefbaker/dool.git;branch=master;protocol=https \
-	   file://0001-Fix-build-error-as-following.patch \
-	   file://0001-Fix-rename-in-docs.patch \
-          "
-
-SRCREV = "41ec7b392b358dae29f0b587711d5c8f7f462805"
-
-S = "${WORKDIR}/git"
-
-do_install() {
-    oe_runmake 'DESTDIR=${D}' install
-}
-
-RDEPENDS:${PN} += "python3-core python3-misc python3-resource python3-shell python3-six python3-unixadmin"
diff --git a/meta-openembedded/meta-oe/recipes-support/dool/dool_1.3.1.bb b/meta-openembedded/meta-oe/recipes-support/dool/dool_1.3.1.bb
new file mode 100644
index 0000000..b20f8b4
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/dool/dool_1.3.1.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Dool is a Python3 compatible fork of Dstat"
+DESCRIPTION = "Dool is a command line tool to monitor many aspects of your system: \
+CPU, Memory, Network, Load Average, etc. It also includes a robust plug-in architecture \
+to allow monitoring other system metrics."
+HOMEPAGE = "http://dag.wiee.rs/home-made/dstat"
+LICENSE = "GPL-3.0-only"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1ebbd3e34237af26da5dc08a4e440464"
+
+DEPENDS += "asciidoc-native xmlto-native"
+RDEPENDS:${PN} += "python3-core python3-misc python3-resource python3-shell python3-six python3-unixadmin"
+
+SRC_URI = "git://github.com/scottchiefbaker/dool.git;branch=master;protocol=https \
+          "
+
+SRCREV = "30847c748483bc088549486292232d805b086b1f"
+
+S = "${WORKDIR}/git"
+
+do_install() {
+    oe_runmake 'DESTDIR=${D}' install
+}
+
+
diff --git a/meta-openembedded/meta-oe/recipes-support/driverctl/driverctl_0.111.bb b/meta-openembedded/meta-oe/recipes-support/driverctl/driverctl_0.111.bb
deleted file mode 100644
index f5f542c..0000000
--- a/meta-openembedded/meta-oe/recipes-support/driverctl/driverctl_0.111.bb
+++ /dev/null
@@ -1,28 +0,0 @@
-SUMMARY = "driverctl is a device driver control utility for Linux"
-LICENSE = "LGPL-2.1-only"
-LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/LGPL-2.1-only;md5=1a6d268fd218675ffea8be556788b780"
-
-REQUIRED_DISTRO_FEATURES = "systemd"
-
-DEPENDS = "systemd"
-RDEPENDS:${PN} += "bash bash-completion"
-
-SRC_URI = " git://gitlab.com/driverctl/driverctl.git;branch=master"
-SRCREV = "fa9dce43d1a667d6e6e26895fbed01b3b04362c9"
-
-S = "${WORKDIR}/git"
-
-inherit pkgconfig systemd features_check
-
-FILES:${PN} += "${libdir}"
-FILES:${PN} += "${libdir}/udev"
-FILES:${PN} += "${libdir}/udev/rules.d"
-FILES:${PN} += "${systemd_unitdir}"
-FILES:${PN} += "${systemd_unitdir}/system"
-FILES:${PN} += "${datadir}"
-FILES:${PN} += "${datadir}/bash-completion"
-FILES:${PN} += "${datadir}/bash-completion/completions"
-
-do_install () {
-	oe_runmake install DESTDIR=${D}
-}
diff --git a/meta-openembedded/meta-oe/recipes-support/driverctl/driverctl_0.115.bb b/meta-openembedded/meta-oe/recipes-support/driverctl/driverctl_0.115.bb
new file mode 100644
index 0000000..970844f
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/driverctl/driverctl_0.115.bb
@@ -0,0 +1,26 @@
+SUMMARY = "driverctl is a device driver control utility for Linux"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c"
+
+REQUIRED_DISTRO_FEATURES = "systemd"
+
+DEPENDS = "systemd"
+RDEPENDS:${PN} += "bash bash-completion"
+
+SRC_URI = "git://gitlab.com/driverctl/driverctl.git;branch=master;protocol=https"
+SRCREV = "2ba60536eb20ca0a6a751bd8b6501dba84ec45d3"
+
+S = "${WORKDIR}/git"
+
+inherit pkgconfig systemd features_check
+
+do_install () {
+	oe_runmake install DESTDIR=${D}
+}
+
+FILES:${PN} += " \
+    ${libdir} \
+    ${datadir} \
+    ${systemd_system_unitdir} \
+"
+
diff --git a/meta-openembedded/meta-oe/recipes-support/hdf5/hdf5_1.14.2.bb b/meta-openembedded/meta-oe/recipes-support/hdf5/hdf5_1.14.2.bb
index e716430..b8a81bb 100644
--- a/meta-openembedded/meta-oe/recipes-support/hdf5/hdf5_1.14.2.bb
+++ b/meta-openembedded/meta-oe/recipes-support/hdf5/hdf5_1.14.2.bb
@@ -58,7 +58,5 @@
 
 BBCLASSEXTEND = "native"
 
-SRC_DISTRIBUTE_LICENSES += "HDF5"
-
 # h5fuse.sh script needs bash
 RDEPENDS:${PN} += "bash"
diff --git a/meta-openembedded/meta-oe/recipes-support/hstr/hstr_2.5.0.bb b/meta-openembedded/meta-oe/recipes-support/hstr/hstr_3.1.0.bb
similarity index 77%
rename from meta-openembedded/meta-oe/recipes-support/hstr/hstr_2.5.0.bb
rename to meta-openembedded/meta-oe/recipes-support/hstr/hstr_3.1.0.bb
index 6c9f65e..a641fee 100644
--- a/meta-openembedded/meta-oe/recipes-support/hstr/hstr_2.5.0.bb
+++ b/meta-openembedded/meta-oe/recipes-support/hstr/hstr_3.1.0.bb
@@ -6,12 +6,12 @@
 
 DEPENDS = "ncurses readline"
 
-SRC_URI = "https://github.com/dvorka/hstr/releases/download/2.5/hstr-${PV}-tarball.tgz \
+SRC_URI = "https://github.com/dvorka/hstr/releases/download/3.1/hstr-${PV}-tarball.tgz \
            file://0001-configure.ac-Don-t-use-AC_CHECK_FILE.patch \
            file://0001-Use-OE-specific-checks-for-ncurses.patch"
 
 S = "${WORKDIR}/${BPN}"
 
-SRC_URI[sha256sum] = "44bb6d93ef064536218f8ae5464772861bfccfe364a436397d9f770207cd306d"
+SRC_URI[sha256sum] = "4dabf61f045f022bac8bc909e5fd96041af6c53df56d97dfa3cfbf49af4453a5"
 
 inherit autotools pkgconfig bash-completion
diff --git a/meta-openembedded/meta-oe/recipes-support/hwdata/hwdata_0.376.bb b/meta-openembedded/meta-oe/recipes-support/hwdata/hwdata_0.377.bb
similarity index 91%
rename from meta-openembedded/meta-oe/recipes-support/hwdata/hwdata_0.376.bb
rename to meta-openembedded/meta-oe/recipes-support/hwdata/hwdata_0.377.bb
index 1666d5e..dea819e 100644
--- a/meta-openembedded/meta-oe/recipes-support/hwdata/hwdata_0.376.bb
+++ b/meta-openembedded/meta-oe/recipes-support/hwdata/hwdata_0.377.bb
@@ -5,7 +5,7 @@
 LICENSE = "GPL-2.0-or-later | XFree86-1.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=1556547711e8246992b999edd9445a57"
 
-SRCREV = "e27f08bda517100746000dacdd882b6a7e7ce19a"
+SRCREV = "7c46440af001d0bc8230b6f009b73a25b614e032"
 SRC_URI = "git://github.com/vcrhonek/${BPN}.git;branch=master;protocol=https"
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-support/libbytesize/libbytesize_2.10.bb b/meta-openembedded/meta-oe/recipes-support/libbytesize/libbytesize_2.10.bb
index 28e40f6..daa01bf 100644
--- a/meta-openembedded/meta-oe/recipes-support/libbytesize/libbytesize_2.10.bb
+++ b/meta-openembedded/meta-oe/recipes-support/libbytesize/libbytesize_2.10.bb
@@ -7,7 +7,6 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=c07cb499d259452f324bb90c3067d85c"
 
 S = "${WORKDIR}/git"
-B = "${S}"
 
 SRCREV = "6e83cc6f6dff4f126fc79284e0c3c1c50123380d"
 SRC_URI = "git://github.com/storaged-project/libbytesize;branch=main;protocol=https"
diff --git a/meta-openembedded/meta-oe/recipes-support/libharu/libharu/0001-Install-static-lib-into-var-libdir-rather-than-hardc.patch b/meta-openembedded/meta-oe/recipes-support/libharu/libharu/0001-Install-static-lib-into-var-libdir-rather-than-hardc.patch
deleted file mode 100644
index 0947de1..0000000
--- a/meta-openembedded/meta-oe/recipes-support/libharu/libharu/0001-Install-static-lib-into-var-libdir-rather-than-hardc.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 9341ac4f6ae38efe95dfd188105a9ea30941ccf6 Mon Sep 17 00:00:00 2001
-From: Lei Maohui <leimaohui@cn.fujitsu.com>
-Date: Wed, 18 Nov 2020 23:09:51 +0900
-Subject: [PATCH] Install static lib into var-libdir rather than hardcod lib.
-
-Lei Maohui <leimaohui@cn.fujitsu.com>
-
-Upstream-Status: Pending
----
- src/CMakeLists.txt | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index 249916c..fb06ea3 100644
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -75,8 +75,8 @@ if(LIBHPDF_STATIC)
-   target_link_libraries(${LIBHPDF_NAME_STATIC} ${ADDITIONAL_LIBRARIES})
-   install(
-     TARGETS ${LIBHPDF_NAME_STATIC}
--    ARCHIVE DESTINATION lib
--    LIBRARY DESTINATION lib
-+    ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
-+    LIBRARY DESTINATION ${LIB_INSTALL_DIR}
-     RUNTIME DESTINATION bin
-   )
-   if(WIN32 AND NOT CYGWIN)
--- 
-2.25.1
-
diff --git a/meta-openembedded/meta-oe/recipes-support/libharu/libharu/libharu-RELEASE_2_3_0_cmake.patch b/meta-openembedded/meta-oe/recipes-support/libharu/libharu/libharu-RELEASE_2_3_0_cmake.patch
deleted file mode 100644
index 05f78ed..0000000
--- a/meta-openembedded/meta-oe/recipes-support/libharu/libharu/libharu-RELEASE_2_3_0_cmake.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-Backport from Fedora Project.
-https://src.fedoraproject.org/rpms/libharu
-
-Fix the install destination of some files.
-
-Upstream-Status: Inappropriate
-
-Signed-off-by: Zheng Ruoqin <zhengrq.fnst@cn.fujitsu.com>
-
-diff -urp libharu-RELEASE_2_3_0/CMakeLists.txt libharu-RELEASE_2_3_0_cmake/CMakeLists.txt
---- libharu-RELEASE_2_3_0/CMakeLists.txt	2013-10-30 20:11:59.000000000 +0700
-+++ libharu-RELEASE_2_3_0_cmake/CMakeLists.txt	2017-06-01 15:56:06.533552795 +0700
-@@ -25,7 +25,7 @@ endif(MSVC)
- 
- # information about libharu
- set(LIBHPDF_MAJOR 2)
--set(LIBHPDF_MINOR 2)
-+set(LIBHPDF_MINOR 3)
- set(LIBHPDF_PATCH 0)
- set(LIBHPDF_VERSION ${LIBHPDF_MAJOR}.${LIBHPDF_MINOR}.${LIBHPDF_PATCH})
- set(LIBHPDF_DESCRIPTION "libHaru is a free, cross platform, open source library for generating PDF files.")
-@@ -210,9 +210,9 @@ set(
- install(FILES ${haru_HDRS} DESTINATION include)
- 
- # install various files
--install(FILES README CHANGES INSTALL DESTINATION .)
-+install(FILES README CHANGES INSTALL DESTINATION ${SHARE_INSTALL_PREFIX}/libharu)
- if(NOT DEVPAK)
--  install(DIRECTORY if DESTINATION .)
-+  install(DIRECTORY if DESTINATION ${SHARE_INSTALL_PREFIX}/libharu)
- endif(NOT DEVPAK)
- if(DEVPAK)
-   install(FILES ${CMAKE_BINARY_DIR}/libharu.DevPackage DESTINATION .)
-diff -urp libharu-RELEASE_2_3_0/src/CMakeLists.txt libharu-RELEASE_2_3_0_cmake/src/CMakeLists.txt
---- libharu-RELEASE_2_3_0/src/CMakeLists.txt	2013-10-30 20:11:59.000000000 +0700
-+++ libharu-RELEASE_2_3_0_cmake/src/CMakeLists.txt	2017-06-01 16:08:45.425105746 +0700
-@@ -90,11 +90,13 @@ if(LIBHPDF_SHARED)
-   target_link_libraries(${LIBHPDF_NAME} ${ADDITIONAL_LIBRARIES})
-   if(WIN32 AND NOT CYGWIN)
-   	set_target_properties(${LIBHPDF_NAME} PROPERTIES DEFINE_SYMBOL HPDF_DLL_MAKE)
-+  else(WIN32 AND NOT CYGWIN)
-+  	set_target_properties(${LIBHPDF_NAME} PROPERTIES SOVERSION ${LIBHPDF_VERSION})
-   endif(WIN32 AND NOT CYGWIN)
-   install(
-     TARGETS ${LIBHPDF_NAME}
--    ARCHIVE DESTINATION lib
--    LIBRARY DESTINATION lib
-+    ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
-+    LIBRARY DESTINATION ${LIB_INSTALL_DIR}
-     RUNTIME DESTINATION bin
-   )
- endif(LIBHPDF_SHARED)
diff --git a/meta-openembedded/meta-oe/recipes-support/libharu/libharu_2.3.0.bb b/meta-openembedded/meta-oe/recipes-support/libharu/libharu_2.3.0.bb
deleted file mode 100644
index 7477c5f..0000000
--- a/meta-openembedded/meta-oe/recipes-support/libharu/libharu_2.3.0.bb
+++ /dev/null
@@ -1,24 +0,0 @@
-SUMMARY = "free PDF library"
-HOMEPAGE = "http://libharu.org"
-DESCRIPTION = "libHaru is a library for generating PDF files. \
-               It is free, open source, written in ANSI C and cross platform. "
-
-LICENSE = "Zlib"
-LIC_FILES_CHKSUM = "file://README;md5=3ee6bc1f64d9cc7907f44840c8e50cb1"
-
-SRC_URI = "git://github.com/libharu/libharu.git;branch=2_3;protocol=https \
-           file://libharu-RELEASE_2_3_0_cmake.patch \
-           file://0001-Install-static-lib-into-var-libdir-rather-than-hardc.patch \
-	   "
-
-SRCREV = "4ae1d5f4c84459f130bf1b1ef4c5c330af8eca5d"
-
-S = "${WORKDIR}/git"
-
-inherit cmake
-DEPENDS += "libpng zlib"
-
-do_install:append() {
-     mkdir -p ${D}/${datadir}/libharu
-     mv ${D}/libharu ${D}/${datadir}
-}
diff --git a/meta-openembedded/meta-oe/recipes-support/libharu/libharu_2.4.4.bb b/meta-openembedded/meta-oe/recipes-support/libharu/libharu_2.4.4.bb
new file mode 100644
index 0000000..02dc499
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/libharu/libharu_2.4.4.bb
@@ -0,0 +1,16 @@
+SUMMARY = "free PDF library"
+HOMEPAGE = "http://libharu.org"
+DESCRIPTION = "libHaru is a library for generating PDF files. \
+               It is free, open source, written in ANSI C and cross platform. "
+
+LICENSE = "Zlib"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=924546dab2bef90e370d7c0c090ddcf0"
+
+DEPENDS += "libpng zlib"
+
+SRC_URI = "git://github.com/libharu/libharu.git;branch=master;protocol=https"
+SRCREV = "0c598becaadaef8e3d12b883f9fc2864a118c12d"
+
+S = "${WORKDIR}/git"
+
+inherit cmake
diff --git a/meta-openembedded/meta-oe/recipes-support/libmxml/libmxml_3.3.1.bb b/meta-openembedded/meta-oe/recipes-support/libmxml/libmxml_3.3.1.bb
index 2f6b1f2..38e270c 100644
--- a/meta-openembedded/meta-oe/recipes-support/libmxml/libmxml_3.3.1.bb
+++ b/meta-openembedded/meta-oe/recipes-support/libmxml/libmxml_3.3.1.bb
@@ -8,14 +8,12 @@
 SRCREV = "fd47c7d115191c8a6bce2c781ffee41e179530f2"
 S = "${WORKDIR}/git"
 
-inherit autotools
+# Package does not support out of tree builds.
+inherit autotools-brokensep
 
 PACKAGECONFIG ??= "threads"
 PACKAGECONFIG[threads] = "--enable-threads,--disable-threads"
 
-# Package does not support out of tree builds.
-B = "${S}"
-
 # MXML uses autotools but it explicitly states it does not support autoheader.
 EXTRA_AUTORECONF = "--exclude=autopoint,autoheader"
 
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/files/0001-configure.ac-check-egrep.patch b/meta-openembedded/meta-oe/recipes-support/lvm2/files/0001-configure.ac-check-egrep.patch
new file mode 100644
index 0000000..474c2f8
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/lvm2/files/0001-configure.ac-check-egrep.patch
@@ -0,0 +1,33 @@
+configure.ac: check egrep
+
+The macro AC_HEADER_STDC which requires AC_PROG_EGREP has been removed
+from configure.ac, then it fails to substitute '@EGREP@':
+
+|     [GEN] command-lines-input.h
+| /bin/bash: line 2: @EGREP@: command not found
+|     [GEN] command-count.h
+
+Call AC_PROG_EGREP to fix the error.
+
+Upstream-Status: Submitted [https://gitlab.com/lvmteam/lvm2/-/merge_requests/4]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/configure.ac b/configure.ac
+index 2e52498f9..d9462e22c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -78,6 +78,7 @@ AC_PROG_LN_S
+ AC_PROG_MAKE_SET
+ AC_PROG_MKDIR_P
+ AC_PROG_RANLIB
++AC_PROG_EGREP
+ AC_CHECK_TOOL([READELF], [readelf])
+ AC_CHECK_TOOL(AR, ar)
+ AC_PATH_TOOL(CFLOW_CMD, cflow)
+-- 
+2.34.1
+
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/files/0002-Guard-use-of-mallinfo-with-__GLIBC__.patch b/meta-openembedded/meta-oe/recipes-support/lvm2/files/0002-Guard-use-of-mallinfo-with-__GLIBC__.patch
deleted file mode 100644
index 1fbaf0c..0000000
--- a/meta-openembedded/meta-oe/recipes-support/lvm2/files/0002-Guard-use-of-mallinfo-with-__GLIBC__.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 3ae9c0b607ec33fb07f32a41e9d28cc9068dd39a Mon Sep 17 00:00:00 2001
-From: Dengke Du <dengke.du@windriver.com>
-Date: Tue, 25 Oct 2016 11:52:44 +0000
-Subject: [PATCH] Guard use of mallinfo() with __GLIBC__
-
-This API is glibc-only
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-Signed-off-by: Dengke Du <dengke.du@windriver.com>
-
----
-Upstream-Status: Pending
-
- lib/mm/memlock.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-Index: LVM2.2.02.177/lib/mm/memlock.c
-===================================================================
---- LVM2.2.02.177.orig/lib/mm/memlock.c
-+++ LVM2.2.02.177/lib/mm/memlock.c
-@@ -151,7 +151,7 @@ static void _touch_memory(void *mem, siz
- 
- static void _allocate_memory(void)
- {
--#ifndef VALGRIND_POOL
-+#if !defined(VALGRIND_POOL) && defined(__GLIBC__)
- 	void *stack_mem;
- 	struct rlimit limit;
- 	int i, area = 0, missing = _size_malloc_tmp, max_areas = 32, hblks;
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/files/0004-tweak-MODPROBE_CMD-for-cross-compile.patch b/meta-openembedded/meta-oe/recipes-support/lvm2/files/0004-tweak-MODPROBE_CMD-for-cross-compile.patch
index 517b9a5..ed9972a 100644
--- a/meta-openembedded/meta-oe/recipes-support/lvm2/files/0004-tweak-MODPROBE_CMD-for-cross-compile.patch
+++ b/meta-openembedded/meta-oe/recipes-support/lvm2/files/0004-tweak-MODPROBE_CMD-for-cross-compile.patch
@@ -21,18 +21,18 @@
  1 file changed, 2 deletions(-)
 
 diff --git a/configure.ac b/configure.ac
-index e427708..aa374ea 100644
+index b43d8b9be..efe3062c1 100644
 --- a/configure.ac
 +++ b/configure.ac
-@@ -1791,8 +1791,6 @@ if test "$BUILD_DMFILEMAPD" = yes; then
- fi
+@@ -1646,8 +1646,6 @@ AS_IF([test "$BUILD_DMFILEMAPD" = "yes"], [
+ ])
  
  ################################################################################
 -AC_PATH_TOOL(MODPROBE_CMD, modprobe, [], [$PATH_SBIN])
 -
- if test -n "$MODPROBE_CMD"; then
+ AS_IF([test -n "$MODPROBE_CMD"], [
  	AC_DEFINE_UNQUOTED([MODPROBE_CMD], ["$MODPROBE_CMD"], [The path to 'modprobe', if available.])
- fi
+ ])
 -- 
 2.7.4
 
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/libdevmapper_2.03.16.bb b/meta-openembedded/meta-oe/recipes-support/lvm2/libdevmapper_2.03.22.bb
similarity index 100%
rename from meta-openembedded/meta-oe/recipes-support/lvm2/libdevmapper_2.03.16.bb
rename to meta-openembedded/meta-oe/recipes-support/lvm2/libdevmapper_2.03.22.bb
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2.inc b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2.inc
index 277e76f..c96989b 100644
--- a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2.inc
+++ b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2.inc
@@ -10,15 +10,15 @@
 SRC_URI = "git://sourceware.org/git/lvm2.git;branch=main \
            file://lvm.conf \
            file://0001-implement-libc-specific-reopen_stream.patch \
-           file://0002-Guard-use-of-mallinfo-with-__GLIBC__.patch \
            file://0004-tweak-MODPROBE_CMD-for-cross-compile.patch \
            file://0001-Avoid-bashisms-in-init-scripts.patch \
            file://0005-do-not-build-manual.patch \
            file://0006-start-lvm2-monitor.service-after-tmp.mount.patch \
            file://reproducible-build.patch \
+           file://0001-configure.ac-check-egrep.patch \
            "
 
-SRCREV = "6d1e894a867681af7a811ed63bc435f3aa55fec8"
+SRCREV = "016e469caf856f1eb8dde39df0d1aa2e74225aed"
 S = "${WORKDIR}/git"
 
 UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>\d+(\_\d+)+)"
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/0001-fix-command-bin-findmnt-bin-lsblk-bin-sort-not-found.patch b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/0001-fix-command-bin-findmnt-bin-lsblk-bin-sort-not-found.patch
index 34e0620..c0cf836 100644
--- a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/0001-fix-command-bin-findmnt-bin-lsblk-bin-sort-not-found.patch
+++ b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/0001-fix-command-bin-findmnt-bin-lsblk-bin-sort-not-found.patch
@@ -15,10 +15,10 @@
  2 files changed, 7 insertions(+), 3 deletions(-)
 
 diff --git a/configure.ac b/configure.ac
-index 4811d4a3d..137b31a82 100644
+index 991a0cf85..e59c82472 100644
 --- a/configure.ac
 +++ b/configure.ac
-@@ -1611,6 +1611,8 @@ fi
+@@ -1660,6 +1660,8 @@ AS_IF([test -n "$MODPROBE_CMD"], [
  
  SYSCONFDIR="$(eval echo $(eval echo $sysconfdir))"
  
@@ -27,10 +27,10 @@
  SBINDIR="$(eval echo $(eval echo $sbindir))"
  LVM_PATH="$SBINDIR/lvm"
  AC_DEFINE_UNQUOTED(LVM_PATH, ["$LVM_PATH"], [Path to lvm binary.])
-@@ -1829,6 +1831,7 @@ AC_SUBST(SACKPT_CFLAGS)
- AC_SUBST(SACKPT_LIBS)
- AC_SUBST(SALCK_CFLAGS)
- AC_SUBST(SALCK_LIBS)
+@@ -1886,6 +1888,7 @@ AC_SUBST(PYTHON2DIR)
+ AC_SUBST(PYTHON3)
+ AC_SUBST(PYTHON3DIR)
+ AC_SUBST(RT_LIBS)
 +AC_SUBST(BINDIR)
  AC_SUBST(SBINDIR)
  AC_SUBST(SELINUX_LIBS)
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/0001-lvmdbusd-create-dirs-for-lock-file.patch b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/0001-lvmdbusd-create-dirs-for-lock-file.patch
new file mode 100644
index 0000000..f6b2935
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/0001-lvmdbusd-create-dirs-for-lock-file.patch
@@ -0,0 +1,29 @@
+lvmdbusd: create dirs for lock file
+
+Create leading dirs for lvmdbusd lock file, otherwise it fails to start:
+
+| systemd[1]: Starting LVM2 D-Bus service...
+| lvmdbusd[1602]: [1602]: Error during creation of lock file(/var/lock/lvm/lvmdbusd): errno(2), exiting!
+
+Upstream-Status: Submitted [https://gitlab.com/lvmteam/lvm2/-/merge_requests/7]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ daemons/lvmdbusd/utils.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/daemons/lvmdbusd/utils.py b/daemons/lvmdbusd/utils.py
+index d479175f6..830648659 100644
+--- a/daemons/lvmdbusd/utils.py
++++ b/daemons/lvmdbusd/utils.py
+@@ -778,6 +778,7 @@ class LockFile(object):
+ 
+ 	def __enter__(self):
+ 		try:
++			os.makedirs(os.path.dirname(self.lock_file))
+ 			self.fd = os.open(self.lock_file, os.O_CREAT | os.O_RDWR, stat.S_IRUSR | stat.S_IWUSR)
+ 
+ 			# Get and set the close on exec and lock the file
+-- 
+2.34.1
+
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/tweak-for-lvmdbusd.patch b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/tweak-for-lvmdbusd.patch
new file mode 100644
index 0000000..3b85a17
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2/tweak-for-lvmdbusd.patch
@@ -0,0 +1,55 @@
+Not check python modules pyudev and dbus during configure that they are runtime
+dependencies. Deal with them in the package config setting in the recipe.
+
+Remove $(DESTDIR) from install destination that it is not suitable for oe. And
+no generate python cache files too.
+
+Upstream-Status: Pending [oe specific]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ configure.ac                 | 4 ++--
+ daemons/lvmdbusd/Makefile.in | 6 ++----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index ee088b3f5..b94ef4e56 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1262,8 +1262,8 @@ AS_IF([test "$BUILD_LVMDBUSD" = "yes"], [
+ 	AS_IF([test "$PYTHON3_BINDINGS" = "yes"], [PYTHON_BINDINGS="yes"])
+ 
+ 	# To get this macro, install autoconf-archive package then run autoreconf
+-	AX_PYTHON_MODULE([pyudev], [Required], python3)
+-	AX_PYTHON_MODULE([dbus], [Required], python3)
++	# AX_PYTHON_MODULE([pyudev], [Required], python3)
++	# AX_PYTHON_MODULE([dbus], [Required], python3)
+ ])
+ 
+ ################################################################################
+diff --git a/daemons/lvmdbusd/Makefile.in b/daemons/lvmdbusd/Makefile.in
+index 9c2629279..a79daabf7 100644
+--- a/daemons/lvmdbusd/Makefile.in
++++ b/daemons/lvmdbusd/Makefile.in
+@@ -16,7 +16,7 @@ top_srcdir = @top_srcdir@
+ top_builddir = @top_builddir@
+ 
+ lvmdbuspydir = $(python3dir)/lvmdbusd
+-lvmdbusdir = $(DESTDIR)$(lvmdbuspydir)
++lvmdbusdir = $(lvmdbuspydir)
+ 
+ LVMDBUS_SRCDIR_FILES = \
+ 	automatedproperties.py \
+@@ -55,11 +55,9 @@ install_lvmdbusd: $(LVMDBUSD)
+ 	@echo "    [INSTALL] $<"
+ 	$(Q) $(INSTALL_DIR) $(sbindir)
+ 	$(Q) $(INSTALL_SCRIPT) $(LVMDBUSD) $(sbindir)
+-	$(Q) $(INSTALL_DIR) $(lvmdbusdir) $(lvmdbusdir)/__pycache__
++	$(Q) $(INSTALL_DIR) $(lvmdbusdir)
+ 	$(Q) (cd $(srcdir); $(INSTALL_DATA) $(LVMDBUS_SRCDIR_FILES) $(lvmdbusdir))
+ 	$(Q) $(INSTALL_DATA) $(LVMDBUS_BUILDDIR_FILES) $(lvmdbusdir)
+-	$(Q) PYTHON=$(PYTHON3) $(PYCOMPILE) --destdir "$(DESTDIR)" --basedir "$(lvmdbuspydir)" $(LVMDBUS_SRCDIR_FILES) $(LVMDBUS_BUILDDIR_FILES)
+-	$(Q) $(CHMOD) 444 $(lvmdbusdir)/__pycache__/*.py[co]
+ 
+ install_lvm2: install_lvmdbusd
+ 
diff --git a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2_2.03.16.bb b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2_2.03.22.bb
similarity index 78%
rename from meta-openembedded/meta-oe/recipes-support/lvm2/lvm2_2.03.16.bb
rename to meta-openembedded/meta-oe/recipes-support/lvm2/lvm2_2.03.22.bb
index 6a6cdc7..c675d3d 100644
--- a/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2_2.03.16.bb
+++ b/meta-openembedded/meta-oe/recipes-support/lvm2/lvm2_2.03.22.bb
@@ -2,11 +2,13 @@
 
 SRC_URI += " \
             file://0001-fix-command-bin-findmnt-bin-lsblk-bin-sort-not-found.patch \
+            file://tweak-for-lvmdbusd.patch \
+            file://0001-lvmdbusd-create-dirs-for-lock-file.patch \
            "
 
 DEPENDS += "autoconf-archive-native"
 
-inherit multilib_script
+inherit multilib_script python3native
 
 MULTILIB_SCRIPTS = "${PN}:${sysconfdir}/lvm/lvm.conf"
 
@@ -28,13 +30,22 @@
             rm -rf ${D}${sysconfdir}/rc.d
         fi
     fi
+
+    # following files only exist when package config `dbus` enabled
+    sed -i -e '1s,#!.*python.*,#!${USRBINPATH}/env python3,' \
+        ${D}${sbindir}/lvmdbusd \
+        ${D}${PYTHON_SITEPACKAGES_DIR}/lvmdbusd/lvmdb.py \
+        ${D}${PYTHON_SITEPACKAGES_DIR}/lvmdbusd/lvm_shell_proxy.py \
+    || true
 }
 
 PACKAGE_BEFORE_PN = "${PN}-scripts ${PN}-udevrules"
 
 SYSTEMD_PACKAGES = "${PN}"
 SYSTEMD_SERVICE:${PN} = "${@bb.utils.contains('PACKAGECONFIG', 'dmeventd', 'lvm2-monitor.service dm-event.socket dm-event.service', '', d)} \
-                         blk-availability.service"
+                         ${@bb.utils.contains('PACKAGECONFIG', 'dbus', 'lvm2-lvmdbusd.service', '', d)} \
+                         blk-availability.service \
+                         "
 SYSTEMD_AUTO_ENABLE = "disable"
 
 TARGET_CC_ARCH += "${LDFLAGS}"
@@ -45,6 +56,8 @@
 LVM2_PACKAGECONFIG:append:class-target = " \
     udev \
 "
+
+PACKAGECONFIG[dbus] = "--enable-dbus-service,--disable-dbus-service,,python3-dbus python3-pyudev"
 PACKAGECONFIG[udev] = "--enable-udev_sync --enable-udev_rules --with-udevdir=${nonarch_base_libdir}/udev/rules.d,--disable-udev_sync --disable-udev_rules,udev,${PN}-udevrules"
 
 PACKAGES =+ "libdevmapper"
@@ -57,6 +70,8 @@
 FILES:${PN} += " \
     ${libdir}/device-mapper/*.so \
     ${systemd_system_unitdir}/lvm2-pvscan@.service \
+    ${PYTHON_SITEPACKAGES_DIR}/lvmdbusd \
+    ${datadir}/dbus-1/system-services/com.redhat.lvmdbus1.service \
 "
 
 FILES:${PN}-scripts = " \
diff --git a/meta-openembedded/meta-oe/recipes-support/pkcs11-provider/pkcs11-provider_git.bb b/meta-openembedded/meta-oe/recipes-support/pkcs11-provider/pkcs11-provider_git.bb
new file mode 100644
index 0000000..19412a5
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/pkcs11-provider/pkcs11-provider_git.bb
@@ -0,0 +1,28 @@
+SUMMARY = "An OpenSSL provider that allows direct interfacing with pkcs11 drivers"
+DESCRIPTION = "\
+This is an Openssl 3.x provider to access Hardware or Software Tokens using \
+the PKCS#11 Cryptographic Token Interface\
+\
+This code targets version 3.1 of the interface but should be backwards \
+compatible to previous versions as well.\
+"
+HOMEPAGE = "https://github.com/latchset/pkcs11-provider"
+SECTION = "libs"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://COPYING;md5=b53b787444a60266932bd270d1cf2d45"
+DEPENDS = "\
+    autoconf-archive \
+    openssl \
+    p11-kit \
+"
+
+SRCREV = "e2abc4a7ae33159f2fb21b9d87a05ea9e79ef584"
+PV = "0.2+git"
+
+SRC_URI = "git://github.com/latchset/${BPN}.git;branch=main;protocol=https"
+
+S = "${WORKDIR}/git"
+
+inherit autotools pkgconfig
+
+FILES:${PN} += "${libdir}/ossl-modules/pkcs11.so"
diff --git a/meta-openembedded/meta-oe/recipes-support/poco/poco/0001-Fix-data-race-when-create-POSIX-thread.patch b/meta-openembedded/meta-oe/recipes-support/poco/poco/0001-Fix-data-race-when-create-POSIX-thread.patch
deleted file mode 100644
index 1a7f4dc..0000000
--- a/meta-openembedded/meta-oe/recipes-support/poco/poco/0001-Fix-data-race-when-create-POSIX-thread.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 03b68fc924b24e12c87512d790d37fc6ddc352ac Mon Sep 17 00:00:00 2001
-From: Dawid Drozd <drozddawid@gmail.com>
-Date: Sat, 11 Feb 2023 14:48:39 +0400
-Subject: [PATCH] Fix data race when create POSIX thread
-
-When creating thread using pthread_create() `_pData->thread` will be set.
-It could lead to data race as in runnableEntry() we refer to that variable.
-
-Instead use pthread_self().
-getName() is already under mutex.
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-Upstream-Status: Backport [https://github.com/pocoproject/poco/pull/3942/commits/9c8a79b994a367f626c5551e0f38c27d0d8431f1]
----
- Foundation/src/Thread_POSIX.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/Foundation/src/Thread_POSIX.cpp b/Foundation/src/Thread_POSIX.cpp
-index ceab76e82..3e52cd31f 100644
---- a/Foundation/src/Thread_POSIX.cpp
-+++ b/Foundation/src/Thread_POSIX.cpp
-@@ -351,7 +351,7 @@ void* ThreadImpl::runnableEntry(void* pThread)
- #endif
- 
- 	ThreadImpl* pThreadImpl = reinterpret_cast<ThreadImpl*>(pThread);
--	setThreadName(pThreadImpl->_pData->thread, reinterpret_cast<Thread*>(pThread)->getName());
-+	setThreadName(pthread_self(), reinterpret_cast<Thread*>(pThread)->getName());
- 	AutoPtr<ThreadData> pData = pThreadImpl->_pData;
- 	try
- 	{
--- 
-2.42.0
-
diff --git a/meta-openembedded/meta-oe/recipes-support/poco/poco/0001-cppignore.lnx-Ignore-PKCS12-and-testLaunch-test.patch b/meta-openembedded/meta-oe/recipes-support/poco/poco/0001-cppignore.lnx-Ignore-PKCS12-and-testLaunch-test.patch
index 25934d6..f70e8bc 100644
--- a/meta-openembedded/meta-oe/recipes-support/poco/poco/0001-cppignore.lnx-Ignore-PKCS12-and-testLaunch-test.patch
+++ b/meta-openembedded/meta-oe/recipes-support/poco/poco/0001-cppignore.lnx-Ignore-PKCS12-and-testLaunch-test.patch
@@ -1,4 +1,4 @@
-From ac0f06e20bdfaca74c8ab786be8ff8fc96b5a689 Mon Sep 17 00:00:00 2001
+From 879ddb725823c78c9510cfd39786adb16f3726c8 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Sat, 16 Sep 2023 19:52:56 -0700
 Subject: [PATCH] cppignore.lnx: Ignore PKCS12 and testLaunch test
@@ -42,22 +42,25 @@
 
 Upstream-Status: Inappropriate [OE specific]
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Signed-off-by: Patrick Wicki <patrick.wicki@siemens.com>
 ---
- cppignore.lnx | 8 ++++++++
- 1 file changed, 8 insertions(+)
+ cppignore.lnx | 9 +++++++++
+ 1 file changed, 9 insertions(+)
 
+diff --git a/cppignore.lnx b/cppignore.lnx
+index 2c2376526..65df4af08 100644
 --- a/cppignore.lnx
 +++ b/cppignore.lnx
-@@ -26,3 +26,12 @@ N7CppUnit10TestCallerI9TimerTestEE.testS
- N7CppUnit10TestCallerI9TimerTestEE.testScheduleIntervalClock
- N7CppUnit10TestCallerI9TimerTestEE.testScheduleIntervalTimestamp
- N7CppUnit10TestCallerI9TimerTestEE.testTimer
-+N7CppUnit10TestCallerI11ProcessTestEE.testLaunch
-+N7CppUnit10TestCallerI11ProcessTestEE.testLaunchRedirectIn
-+N7CppUnit10TestCallerI11ProcessTestEE.testLaunchRedirectOut
-+N7CppUnit10TestCallerI11ProcessTestEE.testLaunchEnv
-+N7CppUnit10TestCallerI7EVPTestEE.testRSAEVPKeyFromPKCS12
-+N7CppUnit10TestCallerI19PKCS12ContainerTestEE.testFullPKCS12
-+N7CppUnit10TestCallerI19PKCS12ContainerTestEE.testCertsOnlyPKCS12
-+N7CppUnit10TestCallerI19PKCS12ContainerTestEE.testPEMReadWrite
-+N7CppUnit10TestCallerI11MongoDBTestEE.testArray
+@@ -28,3 +28,12 @@ CppUnit::TestCaller<HTTPSClientSessionTest>.testProxy
+ CppUnit::TestCaller<HTTPSStreamFactoryTest>.testProxy
+ CppUnit::TestCaller<DNSTest>.testHostByAddress
+ CppUnit::TestCaller<DNSTest>.testHostByName
++CppUnit::TestCaller<ProcessTest>.testLaunch
++CppUnit::TestCaller<ProcessTest>.testLaunchRedirectIn
++CppUnit::TestCaller<ProcessTest>.testLaunchRedirectOut
++CppUnit::TestCaller<ProcessTest>.testLaunchEnv
++CppUnit::TestCaller<EVPTest>.testRSAEVPKeyFromPKCS12
++CppUnit::TestCaller<PKCS12ContainerTest>.testFullPKCS12
++CppUnit::TestCaller<PKCS12ContainerTest>.testCertsOnlyPKCS12
++CppUnit::TestCaller<PKCS12ContainerTest>.testPEMReadWrite
++CppUnit::TestCaller<MongoDBTest>.testArray
diff --git a/meta-openembedded/meta-oe/recipes-support/poco/poco/0002-fix-build-Install-cmake-files-with-resolved-ENABLE_J.patch b/meta-openembedded/meta-oe/recipes-support/poco/poco/0002-fix-build-Install-cmake-files-with-resolved-ENABLE_J.patch
new file mode 100644
index 0000000..427cb97
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/poco/poco/0002-fix-build-Install-cmake-files-with-resolved-ENABLE_J.patch
@@ -0,0 +1,32 @@
+From e54478c936493c0ed87e875f04127bd13642de44 Mon Sep 17 00:00:00 2001
+From: tyler92 <tyler92@inbox.ru>
+Date: Tue, 21 Nov 2023 05:07:24 +0300
+Subject: [PATCH] fix(build): Install cmake files with resolved ENABLE_JSON and
+ ENABLE_XML (#4227)
+
+Upstream-Status: Backport [https://github.com/pocoproject/poco/pull/4227]
+Signed-off-by: Adrian Freihofer <adrian.freihofer@siemens.com>
+
+---
+ Util/cmake/PocoUtilConfig.cmake | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Util/cmake/PocoUtilConfig.cmake b/Util/cmake/PocoUtilConfig.cmake
+index 90c1eab1c..8186435e1 100644
+--- a/Util/cmake/PocoUtilConfig.cmake
++++ b/Util/cmake/PocoUtilConfig.cmake
+@@ -1,9 +1,9 @@
+ include(CMakeFindDependencyMacro)
+ find_dependency(PocoFoundation)
+-if(ENABLE_XML)
++if(@ENABLE_XML@)
+ 	find_dependency(PocoXML)
+ endif()
+-if(ENABLE_JSON)
++if(@ENABLE_JSON@)
+ 	find_dependency(PocoJSON)
+ endif()
+ include("${CMAKE_CURRENT_LIST_DIR}/PocoUtilTargets.cmake")
+-- 
+2.43.0
+
diff --git a/meta-openembedded/meta-oe/recipes-support/poco/poco_1.12.4.bb b/meta-openembedded/meta-oe/recipes-support/poco/poco_1.12.5p2.bb
similarity index 97%
rename from meta-openembedded/meta-oe/recipes-support/poco/poco_1.12.4.bb
rename to meta-openembedded/meta-oe/recipes-support/poco/poco_1.12.5p2.bb
index 12532e4..a0bb0b5 100644
--- a/meta-openembedded/meta-oe/recipes-support/poco/poco_1.12.4.bb
+++ b/meta-openembedded/meta-oe/recipes-support/poco/poco_1.12.5p2.bb
@@ -11,10 +11,10 @@
 SRC_URI = "git://github.com/pocoproject/poco.git;branch=master;protocol=https \
            file://0001-Use-std-atomic-int-instead-of-std-atomic-bool.patch \
            file://0001-cppignore.lnx-Ignore-PKCS12-and-testLaunch-test.patch \
-           file://0001-Fix-data-race-when-create-POSIX-thread.patch \
            file://run-ptest \
+           file://0002-fix-build-Install-cmake-files-with-resolved-ENABLE_J.patch \
            "
-SRCREV = "1211613642269b7d53bea58b02de7fcd25ece3b9"
+SRCREV = "1d6fb3e1383e559cacbada5e3f861c0dafaf5d30"
 
 UPSTREAM_CHECK_GITTAGREGEX = "poco-(?P<pver>\d+(\.\d+)+)"
 
diff --git a/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-crates.inc b/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-crates.inc
index f7992b9..52a8180 100644
--- a/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-crates.inc
+++ b/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-crates.inc
@@ -3,304 +3,262 @@
 # from Cargo.lock
 SRC_URI += " \
     crate://crates.io/adler/1.0.2 \
-    crate://crates.io/aho-corasick/1.0.1 \
-    crate://crates.io/anyhow/1.0.70 \
+    crate://crates.io/aho-corasick/1.1.2 \
+    crate://crates.io/anstyle/1.0.4 \
+    crate://crates.io/anyhow/1.0.75 \
     crate://crates.io/atty/0.2.14 \
     crate://crates.io/autocfg/1.1.0 \
-    crate://crates.io/base64/0.20.0 \
+    crate://crates.io/base64/0.21.5 \
     crate://crates.io/bitflags/1.3.2 \
-    crate://crates.io/bytemuck/1.13.1 \
-    crate://crates.io/byteorder/1.4.3 \
+    crate://crates.io/bitflags/2.4.1 \
+    crate://crates.io/bytemuck/1.14.0 \
+    crate://crates.io/byteorder/1.5.0 \
     crate://crates.io/cassowary/0.3.0 \
-    crate://crates.io/cc/1.0.79 \
     crate://crates.io/cfg-if/1.0.0 \
-    crate://crates.io/clap/3.2.23 \
-    crate://crates.io/clap_lex/0.2.4 \
-    crate://crates.io/console/0.15.5 \
+    crate://crates.io/clap/4.4.11 \
+    crate://crates.io/clap_builder/4.4.11 \
+    crate://crates.io/clap_lex/0.6.0 \
+    crate://crates.io/console/0.15.7 \
+    crate://crates.io/crc32c/0.6.4 \
     crate://crates.io/crc32fast/1.3.2 \
-    crate://crates.io/data-encoding/2.3.3 \
+    crate://crates.io/data-encoding/2.5.0 \
     crate://crates.io/difflib/0.4.0 \
     crate://crates.io/downcast/0.11.0 \
     crate://crates.io/duct/0.13.6 \
-    crate://crates.io/either/1.8.1 \
+    crate://crates.io/either/1.9.0 \
     crate://crates.io/encode_unicode/0.3.6 \
-    crate://crates.io/env_logger/0.7.1 \
-    crate://crates.io/errno/0.3.1 \
-    crate://crates.io/errno-dragonfly/0.1.2 \
+    crate://crates.io/env_logger/0.8.4 \
+    crate://crates.io/errno/0.3.8 \
     crate://crates.io/exitcode/1.1.2 \
-    crate://crates.io/fastrand/1.9.0 \
+    crate://crates.io/fastrand/2.0.1 \
     crate://crates.io/fixedbitset/0.4.2 \
-    crate://crates.io/flate2/1.0.25 \
+    crate://crates.io/flate2/1.0.28 \
     crate://crates.io/float-cmp/0.9.0 \
     crate://crates.io/fragile/2.0.0 \
-    crate://crates.io/futures/0.3.28 \
-    crate://crates.io/futures-channel/0.3.28 \
-    crate://crates.io/futures-core/0.3.28 \
-    crate://crates.io/futures-executor/0.3.28 \
-    crate://crates.io/futures-io/0.3.28 \
-    crate://crates.io/futures-macro/0.3.28 \
-    crate://crates.io/futures-sink/0.3.28 \
-    crate://crates.io/futures-task/0.3.28 \
-    crate://crates.io/futures-util/0.3.28 \
-    crate://crates.io/getrandom/0.1.16 \
-    crate://crates.io/getrandom/0.2.9 \
-    crate://crates.io/hashbrown/0.12.3 \
+    crate://crates.io/getrandom/0.2.11 \
     crate://crates.io/hermit-abi/0.1.19 \
-    crate://crates.io/hermit-abi/0.2.6 \
-    crate://crates.io/hermit-abi/0.3.1 \
-    crate://crates.io/indexmap/1.9.3 \
-    crate://crates.io/indicatif/0.17.3 \
+    crate://crates.io/hermit-abi/0.3.3 \
+    crate://crates.io/indicatif/0.17.7 \
     crate://crates.io/instant/0.1.12 \
-    crate://crates.io/io-lifetimes/1.0.10 \
     crate://crates.io/iovec/0.1.4 \
     crate://crates.io/itertools/0.10.5 \
-    crate://crates.io/jobserver/0.1.26 \
-    crate://crates.io/json/0.12.4 \
     crate://crates.io/lazy_static/1.4.0 \
-    crate://crates.io/libc/0.2.142 \
-    crate://crates.io/linux-raw-sys/0.3.4 \
-    crate://crates.io/log/0.4.17 \
-    crate://crates.io/memchr/2.5.0 \
+    crate://crates.io/libc/0.2.150 \
+    crate://crates.io/linux-raw-sys/0.4.12 \
+    crate://crates.io/log/0.4.20 \
+    crate://crates.io/memchr/2.6.4 \
     crate://crates.io/minimal-lexical/0.2.1 \
-    crate://crates.io/miniz_oxide/0.6.2 \
+    crate://crates.io/miniz_oxide/0.7.1 \
     crate://crates.io/mockall/0.11.4 \
     crate://crates.io/mockall_derive/0.11.4 \
     crate://crates.io/nom/7.1.3 \
     crate://crates.io/normalize-line-endings/0.3.0 \
-    crate://crates.io/num-derive/0.3.3 \
-    crate://crates.io/num-traits/0.2.15 \
-    crate://crates.io/num_cpus/1.15.0 \
+    crate://crates.io/num-derive/0.4.1 \
+    crate://crates.io/num-traits/0.2.17 \
+    crate://crates.io/num_cpus/1.16.0 \
     crate://crates.io/number_prefix/0.4.0 \
     crate://crates.io/numtoa/0.1.0 \
-    crate://crates.io/once_cell/1.17.1 \
+    crate://crates.io/once_cell/1.19.0 \
     crate://crates.io/os_pipe/1.1.4 \
-    crate://crates.io/os_str_bytes/6.5.0 \
-    crate://crates.io/pin-project-lite/0.2.9 \
-    crate://crates.io/pin-utils/0.1.0 \
-    crate://crates.io/pkg-config/0.3.26 \
-    crate://crates.io/portable-atomic/0.3.19 \
+    crate://crates.io/portable-atomic/1.6.0 \
     crate://crates.io/ppv-lite86/0.2.17 \
     crate://crates.io/predicates/2.1.5 \
     crate://crates.io/predicates-core/1.0.6 \
     crate://crates.io/predicates-tree/1.0.9 \
-    crate://crates.io/proc-macro2/1.0.56 \
-    crate://crates.io/quick-xml/0.23.1 \
-    crate://crates.io/quickcheck/0.9.2 \
-    crate://crates.io/quickcheck_macros/0.9.1 \
-    crate://crates.io/quote/1.0.26 \
-    crate://crates.io/rand/0.7.3 \
+    crate://crates.io/proc-macro2/1.0.70 \
+    crate://crates.io/quick-xml/0.29.0 \
+    crate://crates.io/quickcheck/1.0.3 \
+    crate://crates.io/quickcheck_macros/1.0.0 \
+    crate://crates.io/quote/1.0.33 \
     crate://crates.io/rand/0.8.5 \
-    crate://crates.io/rand_chacha/0.2.2 \
     crate://crates.io/rand_chacha/0.3.1 \
-    crate://crates.io/rand_core/0.5.1 \
     crate://crates.io/rand_core/0.6.4 \
-    crate://crates.io/rand_hc/0.2.0 \
-    crate://crates.io/rangemap/1.3.0 \
+    crate://crates.io/rangemap/1.4.0 \
     crate://crates.io/redox_syscall/0.2.16 \
-    crate://crates.io/redox_syscall/0.3.5 \
-    crate://crates.io/redox_termios/0.1.2 \
-    crate://crates.io/regex/1.8.1 \
-    crate://crates.io/regex-syntax/0.7.1 \
+    crate://crates.io/redox_syscall/0.4.1 \
+    crate://crates.io/redox_termios/0.1.3 \
+    crate://crates.io/regex/1.10.2 \
+    crate://crates.io/regex-automata/0.4.3 \
+    crate://crates.io/regex-syntax/0.8.2 \
     crate://crates.io/retain_mut/0.1.7 \
-    crate://crates.io/roaring/0.10.1 \
+    crate://crates.io/roaring/0.10.2 \
     crate://crates.io/rustc_version/0.4.0 \
-    crate://crates.io/rustix/0.37.14 \
+    crate://crates.io/rustix/0.38.27 \
     crate://crates.io/safemem/0.3.3 \
-    crate://crates.io/semver/1.0.17 \
+    crate://crates.io/semver/1.0.20 \
     crate://crates.io/shared_child/1.0.0 \
-    crate://crates.io/slab/0.4.8 \
     crate://crates.io/strsim/0.10.0 \
     crate://crates.io/syn/1.0.109 \
-    crate://crates.io/syn/2.0.15 \
-    crate://crates.io/tempfile/3.5.0 \
-    crate://crates.io/termcolor/1.2.0 \
+    crate://crates.io/syn/2.0.39 \
+    crate://crates.io/tempfile/3.8.1 \
     crate://crates.io/termion/1.5.6 \
     crate://crates.io/termtree/0.4.1 \
-    crate://crates.io/textwrap/0.16.0 \
-    crate://crates.io/thiserror/1.0.40 \
-    crate://crates.io/thiserror-impl/1.0.40 \
+    crate://crates.io/thiserror/1.0.50 \
+    crate://crates.io/thiserror-impl/1.0.50 \
     crate://crates.io/threadpool/1.8.1 \
-    crate://crates.io/tui/0.16.0 \
-    crate://crates.io/unicode-ident/1.0.8 \
+    crate://crates.io/tui/0.19.0 \
+    crate://crates.io/unicode-ident/1.0.12 \
     crate://crates.io/unicode-segmentation/1.10.1 \
-    crate://crates.io/unicode-width/0.1.10 \
-    crate://crates.io/wasi/0.9.0+wasi-snapshot-preview1 \
+    crate://crates.io/unicode-width/0.1.11 \
     crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \
     crate://crates.io/winapi/0.3.9 \
     crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
-    crate://crates.io/winapi-util/0.1.5 \
     crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
-    crate://crates.io/windows-sys/0.42.0 \
     crate://crates.io/windows-sys/0.45.0 \
     crate://crates.io/windows-sys/0.48.0 \
+    crate://crates.io/windows-sys/0.52.0 \
     crate://crates.io/windows-targets/0.42.2 \
-    crate://crates.io/windows-targets/0.48.0 \
+    crate://crates.io/windows-targets/0.48.5 \
+    crate://crates.io/windows-targets/0.52.0 \
     crate://crates.io/windows_aarch64_gnullvm/0.42.2 \
-    crate://crates.io/windows_aarch64_gnullvm/0.48.0 \
+    crate://crates.io/windows_aarch64_gnullvm/0.48.5 \
+    crate://crates.io/windows_aarch64_gnullvm/0.52.0 \
     crate://crates.io/windows_aarch64_msvc/0.42.2 \
-    crate://crates.io/windows_aarch64_msvc/0.48.0 \
+    crate://crates.io/windows_aarch64_msvc/0.48.5 \
+    crate://crates.io/windows_aarch64_msvc/0.52.0 \
     crate://crates.io/windows_i686_gnu/0.42.2 \
-    crate://crates.io/windows_i686_gnu/0.48.0 \
+    crate://crates.io/windows_i686_gnu/0.48.5 \
+    crate://crates.io/windows_i686_gnu/0.52.0 \
     crate://crates.io/windows_i686_msvc/0.42.2 \
-    crate://crates.io/windows_i686_msvc/0.48.0 \
+    crate://crates.io/windows_i686_msvc/0.48.5 \
+    crate://crates.io/windows_i686_msvc/0.52.0 \
     crate://crates.io/windows_x86_64_gnu/0.42.2 \
-    crate://crates.io/windows_x86_64_gnu/0.48.0 \
+    crate://crates.io/windows_x86_64_gnu/0.48.5 \
+    crate://crates.io/windows_x86_64_gnu/0.52.0 \
     crate://crates.io/windows_x86_64_gnullvm/0.42.2 \
-    crate://crates.io/windows_x86_64_gnullvm/0.48.0 \
+    crate://crates.io/windows_x86_64_gnullvm/0.48.5 \
+    crate://crates.io/windows_x86_64_gnullvm/0.52.0 \
     crate://crates.io/windows_x86_64_msvc/0.42.2 \
-    crate://crates.io/windows_x86_64_msvc/0.48.0 \
-    crate://crates.io/zstd/0.11.2+zstd.1.5.2 \
-    crate://crates.io/zstd-safe/5.0.2+zstd.1.5.2 \
-    crate://crates.io/zstd-sys/2.0.8+zstd.1.5.5 \
+    crate://crates.io/windows_x86_64_msvc/0.48.5 \
+    crate://crates.io/windows_x86_64_msvc/0.52.0 \
 "
 
 SRC_URI[adler-1.0.2.sha256sum] = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-SRC_URI[aho-corasick-1.0.1.sha256sum] = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
-SRC_URI[anyhow-1.0.70.sha256sum] = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
+SRC_URI[aho-corasick-1.1.2.sha256sum] = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+SRC_URI[anstyle-1.0.4.sha256sum] = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+SRC_URI[anyhow-1.0.75.sha256sum] = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
 SRC_URI[atty-0.2.14.sha256sum] = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
 SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-SRC_URI[base64-0.20.0.sha256sum] = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5"
+SRC_URI[base64-0.21.5.sha256sum] = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
 SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-SRC_URI[bytemuck-1.13.1.sha256sum] = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
-SRC_URI[byteorder-1.4.3.sha256sum] = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+SRC_URI[bitflags-2.4.1.sha256sum] = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+SRC_URI[bytemuck-1.14.0.sha256sum] = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
+SRC_URI[byteorder-1.5.0.sha256sum] = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 SRC_URI[cassowary-0.3.0.sha256sum] = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
-SRC_URI[cc-1.0.79.sha256sum] = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
 SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-SRC_URI[clap-3.2.23.sha256sum] = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
-SRC_URI[clap_lex-0.2.4.sha256sum] = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
-SRC_URI[console-0.15.5.sha256sum] = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60"
+SRC_URI[clap-4.4.11.sha256sum] = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2"
+SRC_URI[clap_builder-4.4.11.sha256sum] = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb"
+SRC_URI[clap_lex-0.6.0.sha256sum] = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+SRC_URI[console-0.15.7.sha256sum] = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
+SRC_URI[crc32c-0.6.4.sha256sum] = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74"
 SRC_URI[crc32fast-1.3.2.sha256sum] = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
-SRC_URI[data-encoding-2.3.3.sha256sum] = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb"
+SRC_URI[data-encoding-2.5.0.sha256sum] = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
 SRC_URI[difflib-0.4.0.sha256sum] = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
 SRC_URI[downcast-0.11.0.sha256sum] = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
 SRC_URI[duct-0.13.6.sha256sum] = "37ae3fc31835f74c2a7ceda3aeede378b0ae2e74c8f1c36559fcc9ae2a4e7d3e"
-SRC_URI[either-1.8.1.sha256sum] = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+SRC_URI[either-1.9.0.sha256sum] = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
 SRC_URI[encode_unicode-0.3.6.sha256sum] = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
-SRC_URI[env_logger-0.7.1.sha256sum] = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
-SRC_URI[errno-0.3.1.sha256sum] = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
-SRC_URI[errno-dragonfly-0.1.2.sha256sum] = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+SRC_URI[env_logger-0.8.4.sha256sum] = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3"
+SRC_URI[errno-0.3.8.sha256sum] = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
 SRC_URI[exitcode-1.1.2.sha256sum] = "de853764b47027c2e862a995c34978ffa63c1501f2e15f987ba11bd4f9bba193"
-SRC_URI[fastrand-1.9.0.sha256sum] = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+SRC_URI[fastrand-2.0.1.sha256sum] = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
 SRC_URI[fixedbitset-0.4.2.sha256sum] = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
-SRC_URI[flate2-1.0.25.sha256sum] = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
+SRC_URI[flate2-1.0.28.sha256sum] = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
 SRC_URI[float-cmp-0.9.0.sha256sum] = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
 SRC_URI[fragile-2.0.0.sha256sum] = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
-SRC_URI[futures-0.3.28.sha256sum] = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
-SRC_URI[futures-channel-0.3.28.sha256sum] = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
-SRC_URI[futures-core-0.3.28.sha256sum] = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
-SRC_URI[futures-executor-0.3.28.sha256sum] = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
-SRC_URI[futures-io-0.3.28.sha256sum] = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
-SRC_URI[futures-macro-0.3.28.sha256sum] = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
-SRC_URI[futures-sink-0.3.28.sha256sum] = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
-SRC_URI[futures-task-0.3.28.sha256sum] = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
-SRC_URI[futures-util-0.3.28.sha256sum] = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
-SRC_URI[getrandom-0.1.16.sha256sum] = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
-SRC_URI[getrandom-0.2.9.sha256sum] = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
-SRC_URI[hashbrown-0.12.3.sha256sum] = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+SRC_URI[getrandom-0.2.11.sha256sum] = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
 SRC_URI[hermit-abi-0.1.19.sha256sum] = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
-SRC_URI[hermit-abi-0.2.6.sha256sum] = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
-SRC_URI[hermit-abi-0.3.1.sha256sum] = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
-SRC_URI[indexmap-1.9.3.sha256sum] = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
-SRC_URI[indicatif-0.17.3.sha256sum] = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729"
+SRC_URI[hermit-abi-0.3.3.sha256sum] = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+SRC_URI[indicatif-0.17.7.sha256sum] = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25"
 SRC_URI[instant-0.1.12.sha256sum] = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-SRC_URI[io-lifetimes-1.0.10.sha256sum] = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
 SRC_URI[iovec-0.1.4.sha256sum] = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
 SRC_URI[itertools-0.10.5.sha256sum] = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
-SRC_URI[jobserver-0.1.26.sha256sum] = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
-SRC_URI[json-0.12.4.sha256sum] = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd"
 SRC_URI[lazy_static-1.4.0.sha256sum] = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-SRC_URI[libc-0.2.142.sha256sum] = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
-SRC_URI[linux-raw-sys-0.3.4.sha256sum] = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf"
-SRC_URI[log-0.4.17.sha256sum] = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
-SRC_URI[memchr-2.5.0.sha256sum] = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+SRC_URI[libc-0.2.150.sha256sum] = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
+SRC_URI[linux-raw-sys-0.4.12.sha256sum] = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
+SRC_URI[log-0.4.20.sha256sum] = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+SRC_URI[memchr-2.6.4.sha256sum] = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
 SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-SRC_URI[miniz_oxide-0.6.2.sha256sum] = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+SRC_URI[miniz_oxide-0.7.1.sha256sum] = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
 SRC_URI[mockall-0.11.4.sha256sum] = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96"
 SRC_URI[mockall_derive-0.11.4.sha256sum] = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb"
 SRC_URI[nom-7.1.3.sha256sum] = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
 SRC_URI[normalize-line-endings-0.3.0.sha256sum] = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
-SRC_URI[num-derive-0.3.3.sha256sum] = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
-SRC_URI[num-traits-0.2.15.sha256sum] = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
-SRC_URI[num_cpus-1.15.0.sha256sum] = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+SRC_URI[num-derive-0.4.1.sha256sum] = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712"
+SRC_URI[num-traits-0.2.17.sha256sum] = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+SRC_URI[num_cpus-1.16.0.sha256sum] = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
 SRC_URI[number_prefix-0.4.0.sha256sum] = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
 SRC_URI[numtoa-0.1.0.sha256sum] = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
-SRC_URI[once_cell-1.17.1.sha256sum] = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+SRC_URI[once_cell-1.19.0.sha256sum] = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 SRC_URI[os_pipe-1.1.4.sha256sum] = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177"
-SRC_URI[os_str_bytes-6.5.0.sha256sum] = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
-SRC_URI[pin-project-lite-0.2.9.sha256sum] = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
-SRC_URI[pin-utils-0.1.0.sha256sum] = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-SRC_URI[pkg-config-0.3.26.sha256sum] = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
-SRC_URI[portable-atomic-0.3.19.sha256sum] = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b"
+SRC_URI[portable-atomic-1.6.0.sha256sum] = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
 SRC_URI[ppv-lite86-0.2.17.sha256sum] = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 SRC_URI[predicates-2.1.5.sha256sum] = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd"
 SRC_URI[predicates-core-1.0.6.sha256sum] = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
 SRC_URI[predicates-tree-1.0.9.sha256sum] = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf"
-SRC_URI[proc-macro2-1.0.56.sha256sum] = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
-SRC_URI[quick-xml-0.23.1.sha256sum] = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea"
-SRC_URI[quickcheck-0.9.2.sha256sum] = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f"
-SRC_URI[quickcheck_macros-0.9.1.sha256sum] = "608c156fd8e97febc07dc9c2e2c80bf74cfc6ef26893eae3daf8bc2bc94a4b7f"
-SRC_URI[quote-1.0.26.sha256sum] = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
-SRC_URI[rand-0.7.3.sha256sum] = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+SRC_URI[proc-macro2-1.0.70.sha256sum] = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
+SRC_URI[quick-xml-0.29.0.sha256sum] = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51"
+SRC_URI[quickcheck-1.0.3.sha256sum] = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6"
+SRC_URI[quickcheck_macros-1.0.0.sha256sum] = "b22a693222d716a9587786f37ac3f6b4faedb5b80c23914e7303ff5a1d8016e9"
+SRC_URI[quote-1.0.33.sha256sum] = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
 SRC_URI[rand-0.8.5.sha256sum] = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-SRC_URI[rand_chacha-0.2.2.sha256sum] = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
 SRC_URI[rand_chacha-0.3.1.sha256sum] = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-SRC_URI[rand_core-0.5.1.sha256sum] = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
 SRC_URI[rand_core-0.6.4.sha256sum] = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-SRC_URI[rand_hc-0.2.0.sha256sum] = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-SRC_URI[rangemap-1.3.0.sha256sum] = "8b9283c6b06096b47afc7109834fdedab891175bb5241ee5d4f7d2546549f263"
+SRC_URI[rangemap-1.4.0.sha256sum] = "977b1e897f9d764566891689e642653e5ed90c6895106acd005eb4c1d0203991"
 SRC_URI[redox_syscall-0.2.16.sha256sum] = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-SRC_URI[redox_syscall-0.3.5.sha256sum] = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-SRC_URI[redox_termios-0.1.2.sha256sum] = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f"
-SRC_URI[regex-1.8.1.sha256sum] = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
-SRC_URI[regex-syntax-0.7.1.sha256sum] = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
+SRC_URI[redox_syscall-0.4.1.sha256sum] = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+SRC_URI[redox_termios-0.1.3.sha256sum] = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb"
+SRC_URI[regex-1.10.2.sha256sum] = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+SRC_URI[regex-automata-0.4.3.sha256sum] = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+SRC_URI[regex-syntax-0.8.2.sha256sum] = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
 SRC_URI[retain_mut-0.1.7.sha256sum] = "8c31b5c4033f8fdde8700e4657be2c497e7288f01515be52168c631e2e4d4086"
-SRC_URI[roaring-0.10.1.sha256sum] = "ef0fb5e826a8bde011ecae6a8539dd333884335c57ff0f003fbe27c25bbe8f71"
+SRC_URI[roaring-0.10.2.sha256sum] = "6106b5cf8587f5834158895e9715a3c6c9716c8aefab57f1f7680917191c7873"
 SRC_URI[rustc_version-0.4.0.sha256sum] = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
-SRC_URI[rustix-0.37.14.sha256sum] = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f"
+SRC_URI[rustix-0.38.27.sha256sum] = "bfeae074e687625746172d639330f1de242a178bf3189b51e35a7a21573513ac"
 SRC_URI[safemem-0.3.3.sha256sum] = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
-SRC_URI[semver-1.0.17.sha256sum] = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
+SRC_URI[semver-1.0.20.sha256sum] = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
 SRC_URI[shared_child-1.0.0.sha256sum] = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef"
-SRC_URI[slab-0.4.8.sha256sum] = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
 SRC_URI[strsim-0.10.0.sha256sum] = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
 SRC_URI[syn-1.0.109.sha256sum] = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-SRC_URI[syn-2.0.15.sha256sum] = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
-SRC_URI[tempfile-3.5.0.sha256sum] = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
-SRC_URI[termcolor-1.2.0.sha256sum] = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+SRC_URI[syn-2.0.39.sha256sum] = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
+SRC_URI[tempfile-3.8.1.sha256sum] = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
 SRC_URI[termion-1.5.6.sha256sum] = "077185e2eac69c3f8379a4298e1e07cd36beb962290d4a51199acf0fdc10607e"
 SRC_URI[termtree-0.4.1.sha256sum] = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
-SRC_URI[textwrap-0.16.0.sha256sum] = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
-SRC_URI[thiserror-1.0.40.sha256sum] = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
-SRC_URI[thiserror-impl-1.0.40.sha256sum] = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+SRC_URI[thiserror-1.0.50.sha256sum] = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
+SRC_URI[thiserror-impl-1.0.50.sha256sum] = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
 SRC_URI[threadpool-1.8.1.sha256sum] = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
-SRC_URI[tui-0.16.0.sha256sum] = "39c8ce4e27049eed97cfa363a5048b09d995e209994634a0efc26a14ab6c0c23"
-SRC_URI[unicode-ident-1.0.8.sha256sum] = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+SRC_URI[tui-0.19.0.sha256sum] = "ccdd26cbd674007e649a272da4475fb666d3aa0ad0531da7136db6fab0e5bad1"
+SRC_URI[unicode-ident-1.0.12.sha256sum] = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 SRC_URI[unicode-segmentation-1.10.1.sha256sum] = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
-SRC_URI[unicode-width-0.1.10.sha256sum] = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
-SRC_URI[wasi-0.9.0+wasi-snapshot-preview1.sha256sum] = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+SRC_URI[unicode-width-0.1.11.sha256sum] = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
 SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
 SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-SRC_URI[winapi-util-0.1.5.sha256sum] = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
 SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-SRC_URI[windows-sys-0.42.0.sha256sum] = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
 SRC_URI[windows-sys-0.45.0.sha256sum] = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
 SRC_URI[windows-sys-0.48.0.sha256sum] = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+SRC_URI[windows-sys-0.52.0.sha256sum] = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
 SRC_URI[windows-targets-0.42.2.sha256sum] = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-SRC_URI[windows-targets-0.48.0.sha256sum] = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+SRC_URI[windows-targets-0.48.5.sha256sum] = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+SRC_URI[windows-targets-0.52.0.sha256sum] = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
 SRC_URI[windows_aarch64_gnullvm-0.42.2.sha256sum] = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-SRC_URI[windows_aarch64_gnullvm-0.48.0.sha256sum] = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+SRC_URI[windows_aarch64_gnullvm-0.48.5.sha256sum] = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+SRC_URI[windows_aarch64_gnullvm-0.52.0.sha256sum] = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
 SRC_URI[windows_aarch64_msvc-0.42.2.sha256sum] = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-SRC_URI[windows_aarch64_msvc-0.48.0.sha256sum] = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+SRC_URI[windows_aarch64_msvc-0.48.5.sha256sum] = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+SRC_URI[windows_aarch64_msvc-0.52.0.sha256sum] = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
 SRC_URI[windows_i686_gnu-0.42.2.sha256sum] = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-SRC_URI[windows_i686_gnu-0.48.0.sha256sum] = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+SRC_URI[windows_i686_gnu-0.48.5.sha256sum] = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+SRC_URI[windows_i686_gnu-0.52.0.sha256sum] = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
 SRC_URI[windows_i686_msvc-0.42.2.sha256sum] = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-SRC_URI[windows_i686_msvc-0.48.0.sha256sum] = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+SRC_URI[windows_i686_msvc-0.48.5.sha256sum] = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+SRC_URI[windows_i686_msvc-0.52.0.sha256sum] = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
 SRC_URI[windows_x86_64_gnu-0.42.2.sha256sum] = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-SRC_URI[windows_x86_64_gnu-0.48.0.sha256sum] = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+SRC_URI[windows_x86_64_gnu-0.48.5.sha256sum] = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+SRC_URI[windows_x86_64_gnu-0.52.0.sha256sum] = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
 SRC_URI[windows_x86_64_gnullvm-0.42.2.sha256sum] = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-SRC_URI[windows_x86_64_gnullvm-0.48.0.sha256sum] = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+SRC_URI[windows_x86_64_gnullvm-0.48.5.sha256sum] = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+SRC_URI[windows_x86_64_gnullvm-0.52.0.sha256sum] = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
 SRC_URI[windows_x86_64_msvc-0.42.2.sha256sum] = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-SRC_URI[windows_x86_64_msvc-0.48.0.sha256sum] = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
-SRC_URI[zstd-0.11.2+zstd.1.5.2.sha256sum] = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4"
-SRC_URI[zstd-safe-5.0.2+zstd.1.5.2.sha256sum] = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
-SRC_URI[zstd-sys-2.0.8+zstd.1.5.5.sha256sum] = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c"
+SRC_URI[windows_x86_64_msvc-0.48.5.sha256sum] = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+SRC_URI[windows_x86_64_msvc-0.52.0.sha256sum] = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
diff --git a/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-git-crates.inc b/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-git-crates.inc
index 46e826c..ceea67c 100644
--- a/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-git-crates.inc
+++ b/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools-git-crates.inc
@@ -1,10 +1,6 @@
 SRC_URI += "\
-    git://github.com/zowens/crc32c;protocol=https;nobranch=1;name=crc32c;destsuffix=crc32c;type=git-dependency \
     git://github.com/jthornber/rio;protocol=https;nobranch=1;name=rio;destsuffix=rio;type=git-dependency \
 "
 
-SRCREV_FORMAT .= "_crc32c"
-SRCREV_crc32c = "3779fe88fea034922f808586b2564fbcab31efdc"
-
 SRCREV_FORMAT .= "_rio"
 SRCREV_rio = "2979a720f671e836302c01546f9cc9f7988610c8"
diff --git a/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools_1.0.4.bb b/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools_1.0.9.bb
similarity index 95%
rename from meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools_1.0.4.bb
rename to meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools_1.0.9.bb
index e79f62f..b643ad6 100644
--- a/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools_1.0.4.bb
+++ b/meta-openembedded/meta-oe/recipes-support/thin-provisioning-tools/thin-provisioning-tools_1.0.9.bb
@@ -12,7 +12,7 @@
     "
 SRC_URI:append:libc-musl = " file://0001-Replace-LFS-functions.patch"
 
-SRCREV = "3baa3fa3a3e4f714e6170a4152b186f0fa1d76e1"
+SRCREV = "1d60839b0a920df6476712b80f933854fb32e160"
 UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>\d+(\.\d+)+)"
 
 inherit cargo cargo-update-recipe-crates
diff --git a/meta-openembedded/meta-oe/recipes-support/webkitgtk/webkitgtk3_2.42.2.bb b/meta-openembedded/meta-oe/recipes-support/webkitgtk/webkitgtk3_2.42.3.bb
similarity index 98%
rename from meta-openembedded/meta-oe/recipes-support/webkitgtk/webkitgtk3_2.42.2.bb
rename to meta-openembedded/meta-oe/recipes-support/webkitgtk/webkitgtk3_2.42.3.bb
index ac75afb..6149a7a 100644
--- a/meta-openembedded/meta-oe/recipes-support/webkitgtk/webkitgtk3_2.42.2.bb
+++ b/meta-openembedded/meta-oe/recipes-support/webkitgtk/webkitgtk3_2.42.3.bb
@@ -15,7 +15,7 @@
            file://0d3344e17d258106617b0e6d783d073b188a2548.patch \
            file://no-musttail-arm.patch \
            "
-SRC_URI[sha256sum] = "5720aa3e8627f1b9f63252187d4df0f8233ae71d697b1796ebfbe5ca750bd118"
+SRC_URI[sha256sum] = "0a1a4630045628b3a6fe95da72dc47852cff20d66be1ac6fd0d669c88c13d8e2"
 
 inherit cmake pkgconfig gobject-introspection perlnative features_check upstream-version-is-even gi-docgen
 
diff --git a/meta-openembedded/meta-oe/recipes-support/zchunk/zchunk_1.3.2.bb b/meta-openembedded/meta-oe/recipes-support/zchunk/zchunk_1.4.0.bb
similarity index 92%
rename from meta-openembedded/meta-oe/recipes-support/zchunk/zchunk_1.3.2.bb
rename to meta-openembedded/meta-oe/recipes-support/zchunk/zchunk_1.4.0.bb
index 27ebd63..0c8a9c7 100644
--- a/meta-openembedded/meta-oe/recipes-support/zchunk/zchunk_1.3.2.bb
+++ b/meta-openembedded/meta-oe/recipes-support/zchunk/zchunk_1.4.0.bb
@@ -5,7 +5,7 @@
 
 SRC_URI = "git://github.com/zchunk/zchunk.git;protocol=https;branch=main"
 
-SRCREV = "bdd6d6fc150d53d89658bebbfa73a7bfd9a89cb4"
+SRCREV = "4dd91d31157ede4a1b092721d944ae2fdd161cd9"
 S = "${WORKDIR}/git"
 
 DEPENDS = "zstd"
diff --git a/meta-openembedded/meta-python/conf/include/ptest-packagelists-meta-python.inc b/meta-openembedded/meta-python/conf/include/ptest-packagelists-meta-python.inc
index 3272d98..2c75d51 100644
--- a/meta-openembedded/meta-python/conf/include/ptest-packagelists-meta-python.inc
+++ b/meta-openembedded/meta-python/conf/include/ptest-packagelists-meta-python.inc
@@ -27,6 +27,8 @@
     python3-polyline \
     python3-precise-runner \
     python3-prettytable \
+    python3-pydantic \
+    python3-pydantic-core \
     python3-pylint \
     python3-ptyprocess \
     python3-py-cpuinfo \
@@ -54,6 +56,7 @@
 
 PTESTS_SLOW_META_PYTHON = "\
     python3-lz4 \
+    python3-yappi \
 "
 
 PTESTS_PROBLEMS_META_PYTHON ="\
@@ -82,6 +85,5 @@
     python3-whoosh \
     python3-ujson \
     python3-xlrd \
-    python3-yappi \
     python3-yarl \
 "
diff --git a/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb b/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
index 3b9a0f0..7b7d7be 100644
--- a/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
+++ b/meta-openembedded/meta-python/recipes-core/packagegroups/packagegroup-meta-python.bb
@@ -321,7 +321,6 @@
     python3-pyflakes \
     python3-pyhamcrest \
     python3-pyiface \
-    python3-pyinotify \
     python3-pyjks \
     python3-pyjwt \
     python3-pykickstart \
@@ -392,7 +391,6 @@
     python3-serpent \
     python3-service-identity \
     python3-setuptools-declarative-requirements \
-    python3-setuptools-scm-git-archive \
     python3-sh \
     python3-sijax \
     python3-simpleeval \
@@ -439,7 +437,6 @@
     python3-typeguard \
     python3-tzlocal \
     python3-u-msgpack-python \
-    python3-uinput \
     python3-ujson \
     python3-unidiff \
     python3-uritemplate \
diff --git a/meta-openembedded/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch b/meta-openembedded/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch
deleted file mode 100644
index d1ac2c6..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/gyp/gyp/0001-Fix-for-Python-3.10-compatibility.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From bfe579283e5fcab60172818bfe4e6e1d40c2bed0 Mon Sep 17 00:00:00 2001
-From: Kurt Kiefer <kurt.kiefer@arthrex.com>
-Date: Mon, 18 Oct 2021 11:21:14 -0700
-Subject: [PATCH] Fix for Python 3.10 compatibility
-
-The collections.abc module replaces collections for Python 3.10
-
-Signed-off-by: Kurt Kiefer <kurt.kiefer@arthrex.com>
----
-Upstream-Status: Pending
-
- pylib/gyp/common.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/pylib/gyp/common.py b/pylib/gyp/common.py
-index b268d229..4f9cb0ec 100644
---- a/pylib/gyp/common.py
-+++ b/pylib/gyp/common.py
-@@ -4,7 +4,7 @@
- 
- from __future__ import with_statement
- 
--import collections
-+import collections.abc
- import errno
- import filecmp
- import os.path
-@@ -494,7 +494,7 @@ def uniquer(seq, idfun=None):
- 
- 
- # Based on http://code.activestate.com/recipes/576694/.
--class OrderedSet(collections.MutableSet):
-+class OrderedSet(collections.abc.MutableSet):
-   def __init__(self, iterable=None):
-     self.end = end = []
-     end += [None, end, end]         # sentinel node for doubly linked list
diff --git a/meta-openembedded/meta-python/recipes-devtools/gyp/gyp_git.bb b/meta-openembedded/meta-python/recipes-devtools/gyp/gyp_git.bb
index 38906de..0f94a44 100644
--- a/meta-openembedded/meta-python/recipes-devtools/gyp/gyp_git.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/gyp/gyp_git.bb
@@ -5,9 +5,8 @@
 SECTION = "devel"
 
 SRC_URI = "git://chromium.googlesource.com/external/gyp;protocol=https;branch=master \
-           file://0001-Fix-for-Python-3.10-compatibility.patch \
            "
-SRCREV = "caa60026e223fc501e8b337fd5086ece4028b1c6"
+SRCREV = "a03d7413becefc8d55c8aa3df58b55b9bd0e9052"
 
 S = "${WORKDIR}/git"
 PV = "0.1+git${SRCPV}"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-django.inc b/meta-openembedded/meta-python/recipes-devtools/python/python-django.inc
index e030ff4..11d5e63 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python-django.inc
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python-django.inc
@@ -28,7 +28,6 @@
     ${PYTHON_PN}-threading \
     ${PYTHON_PN}-unixadmin \
     ${PYTHON_PN}-xml \
-    ${PYTHON_PN}-distutils \
 "
 
 CVE_PRODUCT = "django"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_4.6.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_4.7.0.bb
similarity index 73%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_4.6.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_4.7.0.bb
index b9256ca..84aace4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_4.6.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-aiohue_4.7.0.bb
@@ -4,9 +4,9 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=dab31a1d28183826937f4b152143a33f"
 
-SRC_URI[sha256sum] = "069af6bb0a7d34d566538af57cc10fb691ee04f844204e4f67d95a57f0b91a46"
+SRC_URI[sha256sum] = "3ca727b463e55bbe7c69b67f5503ffcd7d213c9644c4e458e3556ee6ea33855b"
 
-inherit pypi setuptools3
+inherit pypi python_setuptools_build_meta
 
 RDEPENDS:${PN} += " \
 	${PYTHON_PN}-aiohttp \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-alembic_1.12.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-alembic_1.12.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb
index 107546d..2a9ac2c 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-alembic_1.12.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-alembic_1.13.1.bb
@@ -4,7 +4,7 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"
+SRC_URI[sha256sum] = "4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"
 
 PYPI_PACKAGE = "alembic"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb
new file mode 100644
index 0000000..79cbb66
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-annotated-types_0.6.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Reusable constraint types to use with typing.Annotated"
+DESCRIPTION = ""
+HOMEPAGE = ""
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=c6afb13fdc220497ee5cded1e717ed67"
+
+SRC_URI[sha256sum] = "563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"
+
+S = "${WORKDIR}/annotated_types-${PV}"
+PYPI_PACKAGE = "annotated_types"
+
+inherit pypi python_hatchling
+
+RDEPENDS:${PN} = "python3-typing-extensions"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ansi2html_1.8.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb
similarity index 75%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-ansi2html_1.8.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb
index 8dcd7b0..e419fdc 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ansi2html_1.8.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ansi2html_1.9.1.bb
@@ -5,13 +5,12 @@
 
 PYPI_PACKAGE = "ansi2html"
 
-SRC_URI[sha256sum] = "38b82a298482a1fa2613f0f9c9beb3db72a8f832eeac58eb2e47bf32cd37f6d5"
+SRC_URI[sha256sum] = "5c6837a13ecc1903aab7a545353312049dfedfe5105362ad3a8d9d207871ec71"
 
 inherit pypi python_setuptools_build_meta
 
 DEPENDS += " \
 	${PYTHON_PN}-setuptools-scm-native \
-	${PYTHON_PN}-setuptools-scm-git-archive-native \
 "
 
 RDEPENDS:${PN} = " \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-apiflask_2.0.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-apiflask_2.1.0.bb
similarity index 83%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-apiflask_2.0.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-apiflask_2.1.0.bb
index 88afdda..5bffa22 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-apiflask_2.0.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-apiflask_2.1.0.bb
@@ -7,7 +7,7 @@
 
 PYPI_PACKAGE = "APIFlask"
 
-SRC_URI[sha256sum] = "c1ab81640a1ab252888e2cc7ae556272a169b449c582abae309a8fe295f9337d"
+SRC_URI[sha256sum] = "e7616d902d446eb9e1c67d1d8a34691b437f9da4fe7a3b4d49c91ba88c85ee2a"
 
 RDEPENDS:${PN} += "\
     python3-flask \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-apispec_6.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-apispec_6.3.1.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-apispec_6.3.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-apispec_6.3.1.bb
index fcdcd7a..6b9f704 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-apispec_6.3.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-apispec_6.3.1.bb
@@ -5,6 +5,6 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "6cb08d92ce73ff0b3bf46cb2ea5c00d57289b0f279fb0256a3df468182ba5344"
+SRC_URI[sha256sum] = "b38e4479916d43f2b1e88ce15fc2fae93adf2e8d55cb59ec74ac66a827941483"
 
 RDEPENDS:${PN} += "python3-packaging"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_3.1.6.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_3.2.1.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_3.1.6.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_3.2.1.bb
index 28dd9f9..e6b9af0 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_3.1.6.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-argcomplete_3.2.1.bb
@@ -3,7 +3,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=2ee41112a44fe7014dce33e26468ba93"
 
-SRC_URI[sha256sum] = "3b1f07d133332547a53c79437527c00be48cca3807b1d4ca5cab1b26313386a6"
+SRC_URI[sha256sum] = "437f67fb9b058da5a090df505ef9be0297c4883993f3f56cb186ff087778cfb4"
 
 PYPI_PACKAGE = "argcomplete"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-argh_0.30.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-argh_0.30.5.bb
similarity index 90%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-argh_0.30.4.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-argh_0.30.5.bb
index 82cfa3b..78e6149 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-argh_0.30.4.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-argh_0.30.5.bb
@@ -15,7 +15,7 @@
                     file://README.rst;beginline=261;endline=275;md5=39ec83a704aed9f33618c5d04e478a08 \
                     "
 
-SRC_URI[sha256sum] = "9fca8e69c4dad4f8d2a7bdfbdd80b0754462b53510a03e1b5cf2b43a87e6e960"
+SRC_URI[sha256sum] = "b37dfd617a09d19a4a7bcaed0e060b288bc7ac8dfdc0facf886a49a25ff33728"
 
 inherit pypi python_flit_core
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_3.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_3.0.2.bb
similarity index 87%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_3.0.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_3.0.2.bb
index db3ef43..23501ce 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_3.0.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-astroid_3.0.2.bb
@@ -4,7 +4,7 @@
 LICENSE = "LGPL-2.1-only"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=a70cf540abf41acb644ac3b621b2fad1"
 
-SRC_URI[sha256sum] = "86b0bb7d7da0be1a7c4aedb7974e391b32d4ed89e33de6ed6902b4b15c97577e"
+SRC_URI[sha256sum] = "4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91"
 
 inherit pypi python_setuptools_build_meta
 
@@ -21,7 +21,6 @@
 "
 
 RDEPENDS:${PN}:class-target += "\
-    ${PYTHON_PN}-distutils \
     ${PYTHON_PN}-lazy-object-proxy \
     ${PYTHON_PN}-logging \
     ${PYTHON_PN}-six \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.5.bb
similarity index 65%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.5.bb
index 08dc77b..a7820c5 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-asyncinotify_4.0.5.bb
@@ -1,9 +1,9 @@
 SUMMARY = "A simple optionally-async python inotify library, focused on simplicity of use and operation, and leveraging modern Python features"
 HOMEPAGE = "https://gitlab.com/Taywee/asyncinotify"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=6ec941a1cd6616454970d03cb9c9e8f8"
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f75d2927d3c1ed2414ef72048f5ad640"
 
-SRC_URI[sha256sum] = "bcac19425b1b418bbbc4d31193ea3c39e24343cd7ddff2074ae7b599f1a04829"
+SRC_URI[sha256sum] = "95840eec6804797f9e8ee6d65a9d2a1159e77c5395a468dcfa4f44338ed1f8b6"
 
 inherit pypi python_setuptools_build_meta
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-bandit_1.7.5.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-bandit_1.7.6.bb
similarity index 84%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-bandit_1.7.5.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-bandit_1.7.6.bb
index ede7f92..3cf927e 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-bandit_1.7.5.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-bandit_1.7.6.bb
@@ -2,7 +2,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=34400b68072d710fecd0a2940a0d1658"
 
-SRC_URI[sha256sum] = "bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"
+SRC_URI[sha256sum] = "72ce7bc9741374d96fb2f1c9a8960829885f1243ffde743de70a19cee353e8f3"
 
 DEPENDS = "python3-pbr-native python3-git python3-pbr python3-pyyaml python3-six python3-stevedore"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.8.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.9.1.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.8.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.9.1.bb
index acacdab..0d7107a 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.8.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-bitarray_2.9.1.bb
@@ -4,7 +4,7 @@
 LICENSE = "PSF-2.0"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=2ad702cdcd49e8d2ac01d7e7d0810d2d"
 
-SRC_URI[sha256sum] = "e15587b2bdf18d32eb3ba25f5f5a51bedd0dc06b3112a4c53dab5e7753bc6588"
+SRC_URI[sha256sum] = "912efbeed6d8b155c8e8c37464f79d75b1de58936c0f29ffb599ce95af5563f2"
 
 inherit setuptools3 pypi
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-bitstring_4.1.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb
similarity index 83%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-bitstring_4.1.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb
index 8831d84..6fc2cf4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-bitstring_4.1.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-bitstring_4.1.4.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=661f450e2c0aef39b4b15597333444a7"
 
-SRC_URI[sha256sum] = "1b47c84644a961ba8503db2bba8a5965ab53e81474becdf0a18383b5b5f3f795"
+SRC_URI[sha256sum] = "94f3f1c45383ebe8fd4a359424ffeb75c2f290760ae8fcac421b44f89ac85213"
 
 PYPI_PACKAGE = "bitstring"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cantools_39.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cantools_39.4.1.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cantools_39.3.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cantools_39.4.1.bb
index 0b590d2..e26405d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cantools_39.3.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cantools_39.4.1.bb
@@ -3,12 +3,14 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=d9aa4ec07de78abae21c490c9ffe61bd"
 
-SRC_URI[sha256sum] = "2c3d081922591bc1611c9f1ff52d6c8af1d03314f8c724cc114d856cc555cc28"
+SRC_URI[sha256sum] = "98c4d007a6d9803c6433c743c0240e73de930530f8255e1e21d2e20e8991a30b"
 
 PYPI_PACKAGE = "cantools"
 
 inherit pypi python_poetry_core
 
+DEPENDS += "python3-setuptools-scm-native"
+
 RDEPENDS:${PN} += "\
     ${PYTHON_PN}-can \
     ${PYTHON_PN}-bitstruct \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.28.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.0.bb
similarity index 89%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.28.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.0.bb
index 468aa24..8ec87fa 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.28.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cassandra-driver_3.29.0.bb
@@ -8,7 +8,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=2ee41112a44fe7014dce33e26468ba93"
 SRCNAME = "cassandra-driver"
 
-SRC_URI[sha256sum] = "64ff130d19f994b80997c14343a8306be52a0e7ab92520a534eed944c88d70df"
+SRC_URI[sha256sum] = "0a34f9534356e5fd33af8cdda109d5e945b6335cb50399b267c46368c4e93c98"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch
new file mode 100644
index 0000000..4edb5da
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-click-spinner/0001-Update-Versioneer-to-0.22.patch
@@ -0,0 +1,2489 @@
+From 739f9da6bf0d2d9f0de624aee2ec71c65f62c275 Mon Sep 17 00:00:00 2001
+From: Hugo van Kemenade <hugovk@users.noreply.github.com>
+Date: Tue, 10 May 2022 18:17:50 +0300
+Subject: [PATCH] Update Versioneer to 0.22
+
+Upstream-Status: Backport [https://github.com/click-contrib/click-spinner/commit/5622ab0a0b4296dc8f10863f268ed98dccf4b642]
+
+Signed-off-by: Ny Antra Ranaivoarison <nyantra.ranaivoarison@smile.fr>
+---
+ click_spinner/__init__.py |    5 +-
+ click_spinner/_version.py |  665 +++++++++++++++++++++-
+ versioneer.py             | 1128 ++++++++++++++++++++++++-------------
+ 3 files changed, 1400 insertions(+), 398 deletions(-)
+
+diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py
+index aeec089..8e9f4f9 100644
+--- a/click_spinner/__init__.py
++++ b/click_spinner/__init__.py
+@@ -77,6 +77,5 @@ def spinner(beep=False, disable=False, force=False, stream=sys.stdout):
+     return Spinner(beep, disable, force, stream)
+ 
+ 
+-from ._version import get_versions
+-__version__ = get_versions()['version']
+-del get_versions
++from . import _version
++__version__ = _version.get_versions()['version']
+diff --git a/click_spinner/_version.py b/click_spinner/_version.py
+index 5ae340e..d44565d 100644
+--- a/click_spinner/_version.py
++++ b/click_spinner/_version.py
+@@ -1,21 +1,658 @@
+ 
+-# This file was generated by 'versioneer.py' (0.16) from
+-# revision-control system data, or from the parent directory name of an
+-# unpacked source archive. Distribution tarballs contain a pre-generated copy
+-# of this file.
++# This file helps to compute a version number in source trees obtained from
++# git-archive tarball (such as those provided by githubs download-from-tag
++# feature). Distribution tarballs (built by setup.py sdist) and build
++# directories (produced by setup.py build) will contain a much shorter file
++# that just contains the computed version number.
+ 
+-import json
++# This file is released into the public domain. Generated by
++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer)
++
++"""Git implementation of _version.py."""
++
++import errno
++import os
++import re
++import subprocess
+ import sys
++from typing import Callable, Dict
++import functools
++
++
++def get_keywords():
++    """Get the keywords needed to look up the version information."""
++    # these strings will be replaced by git during git-archive.
++    # setup.py/versioneer.py will grep for the variable names, so they must
++    # each be defined on a line of their own. _version.py will just call
++    # get_keywords().
++    git_refnames = "$Format:%d$"
++    git_full = "$Format:%H$"
++    git_date = "$Format:%ci$"
++    keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
++    return keywords
++
++
++class VersioneerConfig:
++    """Container for Versioneer configuration parameters."""
++
++
++def get_config():
++    """Create, populate and return the VersioneerConfig() object."""
++    # these strings are filled in when 'setup.py versioneer' creates
++    # _version.py
++    cfg = VersioneerConfig()
++    cfg.VCS = "git"
++    cfg.style = "pep440"
++    cfg.tag_prefix = "v"
++    cfg.parentdir_prefix = "click-spinner-"
++    cfg.versionfile_source = "click_spinner/_version.py"
++    cfg.verbose = False
++    return cfg
++
++
++class NotThisMethod(Exception):
++    """Exception raised if a method is not valid for the current scenario."""
++
++
++LONG_VERSION_PY: Dict[str, str] = {}
++HANDLERS: Dict[str, Dict[str, Callable]] = {}
++
++
++def register_vcs_handler(vcs, method):  # decorator
++    """Create decorator to mark a method as the handler of a VCS."""
++    def decorate(f):
++        """Store f in HANDLERS[vcs][method]."""
++        if vcs not in HANDLERS:
++            HANDLERS[vcs] = {}
++        HANDLERS[vcs][method] = f
++        return f
++    return decorate
++
++
++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
++                env=None):
++    """Call the given command(s)."""
++    assert isinstance(commands, list)
++    process = None
++
++    popen_kwargs = {}
++    if sys.platform == "win32":
++        # This hides the console window if pythonw.exe is used
++        startupinfo = subprocess.STARTUPINFO()
++        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
++        popen_kwargs["startupinfo"] = startupinfo
++
++    for command in commands:
++        try:
++            dispcmd = str([command] + args)
++            # remember shell=False, so use git.cmd on windows, not just git
++            process = subprocess.Popen([command] + args, cwd=cwd, env=env,
++                                       stdout=subprocess.PIPE,
++                                       stderr=(subprocess.PIPE if hide_stderr
++                                               else None), **popen_kwargs)
++            break
++        except OSError:
++            e = sys.exc_info()[1]
++            if e.errno == errno.ENOENT:
++                continue
++            if verbose:
++                print("unable to run %s" % dispcmd)
++                print(e)
++            return None, None
++    else:
++        if verbose:
++            print("unable to find command, tried %s" % (commands,))
++        return None, None
++    stdout = process.communicate()[0].strip().decode()
++    if process.returncode != 0:
++        if verbose:
++            print("unable to run %s (error)" % dispcmd)
++            print("stdout was %s" % stdout)
++        return None, process.returncode
++    return stdout, process.returncode
++
++
++def versions_from_parentdir(parentdir_prefix, root, verbose):
++    """Try to determine the version from the parent directory name.
++
++    Source tarballs conventionally unpack into a directory that includes both
++    the project name and a version string. We will also support searching up
++    two directory levels for an appropriately named parent directory
++    """
++    rootdirs = []
++
++    for _ in range(3):
++        dirname = os.path.basename(root)
++        if dirname.startswith(parentdir_prefix):
++            return {"version": dirname[len(parentdir_prefix):],
++                    "full-revisionid": None,
++                    "dirty": False, "error": None, "date": None}
++        rootdirs.append(root)
++        root = os.path.dirname(root)  # up a level
++
++    if verbose:
++        print("Tried directories %s but none started with prefix %s" %
++              (str(rootdirs), parentdir_prefix))
++    raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
++
++
++@register_vcs_handler("git", "get_keywords")
++def git_get_keywords(versionfile_abs):
++    """Extract version information from the given file."""
++    # the code embedded in _version.py can just fetch the value of these
++    # keywords. When used from setup.py, we don't want to import _version.py,
++    # so we do it with a regexp instead. This function is not used from
++    # _version.py.
++    keywords = {}
++    try:
++        with open(versionfile_abs, "r") as fobj:
++            for line in fobj:
++                if line.strip().startswith("git_refnames ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["refnames"] = mo.group(1)
++                if line.strip().startswith("git_full ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["full"] = mo.group(1)
++                if line.strip().startswith("git_date ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["date"] = mo.group(1)
++    except OSError:
++        pass
++    return keywords
++
++
++@register_vcs_handler("git", "keywords")
++def git_versions_from_keywords(keywords, tag_prefix, verbose):
++    """Get version information from git keywords."""
++    if "refnames" not in keywords:
++        raise NotThisMethod("Short version file found")
++    date = keywords.get("date")
++    if date is not None:
++        # Use only the last line.  Previous lines may contain GPG signature
++        # information.
++        date = date.splitlines()[-1]
++
++        # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant
++        # datestamp. However we prefer "%ci" (which expands to an "ISO-8601
++        # -like" string, which we must then edit to make compliant), because
++        # it's been around since git-1.5.3, and it's too difficult to
++        # discover which version we're using, or to work around using an
++        # older one.
++        date = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++    refnames = keywords["refnames"].strip()
++    if refnames.startswith("$Format"):
++        if verbose:
++            print("keywords are unexpanded, not using")
++        raise NotThisMethod("unexpanded keywords, not a git-archive tarball")
++    refs = {r.strip() for r in refnames.strip("()").split(",")}
++    # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
++    # just "foo-1.0". If we see a "tag: " prefix, prefer those.
++    TAG = "tag: "
++    tags = {r[len(TAG):] for r in refs if r.startswith(TAG)}
++    if not tags:
++        # Either we're using git < 1.8.3, or there really are no tags. We use
++        # a heuristic: assume all version tags have a digit. The old git %d
++        # expansion behaves like git log --decorate=short and strips out the
++        # refs/heads/ and refs/tags/ prefixes that would let us distinguish
++        # between branches and tags. By ignoring refnames without digits, we
++        # filter out many common branch names like "release" and
++        # "stabilization", as well as "HEAD" and "master".
++        tags = {r for r in refs if re.search(r'\d', r)}
++        if verbose:
++            print("discarding '%s', no digits" % ",".join(refs - tags))
++    if verbose:
++        print("likely tags: %s" % ",".join(sorted(tags)))
++    for ref in sorted(tags):
++        # sorting will prefer e.g. "2.0" over "2.0rc1"
++        if ref.startswith(tag_prefix):
++            r = ref[len(tag_prefix):]
++            # Filter out refs that exactly match prefix or that don't start
++            # with a number once the prefix is stripped (mostly a concern
++            # when prefix is '')
++            if not re.match(r'\d', r):
++                continue
++            if verbose:
++                print("picking %s" % r)
++            return {"version": r,
++                    "full-revisionid": keywords["full"].strip(),
++                    "dirty": False, "error": None,
++                    "date": date}
++    # no suitable tags, so version is "0+unknown", but full hex is still there
++    if verbose:
++        print("no suitable tags, using unknown + full revision id")
++    return {"version": "0+unknown",
++            "full-revisionid": keywords["full"].strip(),
++            "dirty": False, "error": "no suitable tags", "date": None}
++
++
++@register_vcs_handler("git", "pieces_from_vcs")
++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
++    """Get version from 'git describe' in the root of the source tree.
++
++    This only gets called if the git-archive 'subst' keywords were *not*
++    expanded, and _version.py hasn't already been rewritten with a short
++    version string, meaning we're inside a checked out source tree.
++    """
++    GITS = ["git"]
++    if sys.platform == "win32":
++        GITS = ["git.cmd", "git.exe"]
++
++    # GIT_DIR can interfere with correct operation of Versioneer.
++    # It may be intended to be passed to the Versioneer-versioned project,
++    # but that should not change where we get our version from.
++    env = os.environ.copy()
++    env.pop("GIT_DIR", None)
++    runner = functools.partial(runner, env=env)
++
++    _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
++                   hide_stderr=True)
++    if rc != 0:
++        if verbose:
++            print("Directory %s not under git control" % root)
++        raise NotThisMethod("'git rev-parse --git-dir' returned error")
++
++    MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else []
++
++    # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
++    # if there isn't one, this yields HEX[-dirty] (no NUM)
++    describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
++                                     "--always", "--long", *MATCH_ARGS],
++                              cwd=root)
++    # --long was added in git-1.5.5
++    if describe_out is None:
++        raise NotThisMethod("'git describe' failed")
++    describe_out = describe_out.strip()
++    full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root)
++    if full_out is None:
++        raise NotThisMethod("'git rev-parse' failed")
++    full_out = full_out.strip()
++
++    pieces = {}
++    pieces["long"] = full_out
++    pieces["short"] = full_out[:7]  # maybe improved later
++    pieces["error"] = None
++
++    branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"],
++                             cwd=root)
++    # --abbrev-ref was added in git-1.6.3
++    if rc != 0 or branch_name is None:
++        raise NotThisMethod("'git rev-parse --abbrev-ref' returned error")
++    branch_name = branch_name.strip()
++
++    if branch_name == "HEAD":
++        # If we aren't exactly on a branch, pick a branch which represents
++        # the current commit. If all else fails, we are on a branchless
++        # commit.
++        branches, rc = runner(GITS, ["branch", "--contains"], cwd=root)
++        # --contains was added in git-1.5.4
++        if rc != 0 or branches is None:
++            raise NotThisMethod("'git branch --contains' returned error")
++        branches = branches.split("\n")
++
++        # Remove the first line if we're running detached
++        if "(" in branches[0]:
++            branches.pop(0)
++
++        # Strip off the leading "* " from the list of branches.
++        branches = [branch[2:] for branch in branches]
++        if "master" in branches:
++            branch_name = "master"
++        elif not branches:
++            branch_name = None
++        else:
++            # Pick the first branch that is returned. Good or bad.
++            branch_name = branches[0]
++
++    pieces["branch"] = branch_name
++
++    # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
++    # TAG might have hyphens.
++    git_describe = describe_out
++
++    # look for -dirty suffix
++    dirty = git_describe.endswith("-dirty")
++    pieces["dirty"] = dirty
++    if dirty:
++        git_describe = git_describe[:git_describe.rindex("-dirty")]
++
++    # now we have TAG-NUM-gHEX or HEX
++
++    if "-" in git_describe:
++        # TAG-NUM-gHEX
++        mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
++        if not mo:
++            # unparsable. Maybe git-describe is misbehaving?
++            pieces["error"] = ("unable to parse git-describe output: '%s'"
++                               % describe_out)
++            return pieces
++
++        # tag
++        full_tag = mo.group(1)
++        if not full_tag.startswith(tag_prefix):
++            if verbose:
++                fmt = "tag '%s' doesn't start with prefix '%s'"
++                print(fmt % (full_tag, tag_prefix))
++            pieces["error"] = ("tag '%s' doesn't start with prefix '%s'"
++                               % (full_tag, tag_prefix))
++            return pieces
++        pieces["closest-tag"] = full_tag[len(tag_prefix):]
++
++        # distance: number of commits since tag
++        pieces["distance"] = int(mo.group(2))
++
++        # commit: short hex revision ID
++        pieces["short"] = mo.group(3)
++
++    else:
++        # HEX: no tags
++        pieces["closest-tag"] = None
++        count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root)
++        pieces["distance"] = int(count_out)  # total number of commits
+ 
+-version_json = '''
+-{
+- "dirty": false,
+- "error": null,
+- "full-revisionid": "7cadb31e3e257c64a47a67255547f0a746e1a465",
+- "version": "0.1.10"
+-}
+-'''  # END VERSION_JSON
++    # commit date: see ISO-8601 comment in git_versions_from_keywords()
++    date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip()
++    # Use only the last line.  Previous lines may contain GPG signature
++    # information.
++    date = date.splitlines()[-1]
++    pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++
++    return pieces
++
++
++def plus_or_dot(pieces):
++    """Return a + if we don't already have one, else return a ."""
++    if "+" in pieces.get("closest-tag", ""):
++        return "."
++    return "+"
++
++
++def render_pep440(pieces):
++    """Build up version string, with post-release "local version identifier".
++
++    Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you
++    get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty
++
++    Exceptions:
++    1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty]
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            rendered += plus_or_dot(pieces)
++            rendered += "%d.g%s" % (pieces["distance"], pieces["short"])
++            if pieces["dirty"]:
++                rendered += ".dirty"
++    else:
++        # exception #1
++        rendered = "0+untagged.%d.g%s" % (pieces["distance"],
++                                          pieces["short"])
++        if pieces["dirty"]:
++            rendered += ".dirty"
++    return rendered
++
++
++def render_pep440_branch(pieces):
++    """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] .
++
++    The ".dev0" means not master branch. Note that .dev0 sorts backwards
++    (a feature branch will appear "older" than the master branch).
++
++    Exceptions:
++    1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty]
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            if pieces["branch"] != "master":
++                rendered += ".dev0"
++            rendered += plus_or_dot(pieces)
++            rendered += "%d.g%s" % (pieces["distance"], pieces["short"])
++            if pieces["dirty"]:
++                rendered += ".dirty"
++    else:
++        # exception #1
++        rendered = "0"
++        if pieces["branch"] != "master":
++            rendered += ".dev0"
++        rendered += "+untagged.%d.g%s" % (pieces["distance"],
++                                          pieces["short"])
++        if pieces["dirty"]:
++            rendered += ".dirty"
++    return rendered
++
++
++def pep440_split_post(ver):
++    """Split pep440 version string at the post-release segment.
++
++    Returns the release segments before the post-release and the
++    post-release version number (or -1 if no post-release segment is present).
++    """
++    vc = str.split(ver, ".post")
++    return vc[0], int(vc[1] or 0) if len(vc) == 2 else None
++
++
++def render_pep440_pre(pieces):
++    """TAG[.postN.devDISTANCE] -- No -dirty.
++
++    Exceptions:
++    1: no tags. 0.post0.devDISTANCE
++    """
++    if pieces["closest-tag"]:
++        if pieces["distance"]:
++            # update the post release segment
++            tag_version, post_version = pep440_split_post(pieces["closest-tag"])
++            rendered = tag_version
++            if post_version is not None:
++                rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"])
++            else:
++                rendered += ".post0.dev%d" % (pieces["distance"])
++        else:
++            # no commits, use the tag as the version
++            rendered = pieces["closest-tag"]
++    else:
++        # exception #1
++        rendered = "0.post0.dev%d" % pieces["distance"]
++    return rendered
++
++
++def render_pep440_post(pieces):
++    """TAG[.postDISTANCE[.dev0]+gHEX] .
++
++    The ".dev0" means dirty. Note that .dev0 sorts backwards
++    (a dirty tree will appear "older" than the corresponding clean one),
++    but you shouldn't be releasing software with -dirty anyways.
++
++    Exceptions:
++    1: no tags. 0.postDISTANCE[.dev0]
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            rendered += ".post%d" % pieces["distance"]
++            if pieces["dirty"]:
++                rendered += ".dev0"
++            rendered += plus_or_dot(pieces)
++            rendered += "g%s" % pieces["short"]
++    else:
++        # exception #1
++        rendered = "0.post%d" % pieces["distance"]
++        if pieces["dirty"]:
++            rendered += ".dev0"
++        rendered += "+g%s" % pieces["short"]
++    return rendered
++
++
++def render_pep440_post_branch(pieces):
++    """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] .
++
++    The ".dev0" means not master branch.
++
++    Exceptions:
++    1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty]
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            rendered += ".post%d" % pieces["distance"]
++            if pieces["branch"] != "master":
++                rendered += ".dev0"
++            rendered += plus_or_dot(pieces)
++            rendered += "g%s" % pieces["short"]
++            if pieces["dirty"]:
++                rendered += ".dirty"
++    else:
++        # exception #1
++        rendered = "0.post%d" % pieces["distance"]
++        if pieces["branch"] != "master":
++            rendered += ".dev0"
++        rendered += "+g%s" % pieces["short"]
++        if pieces["dirty"]:
++            rendered += ".dirty"
++    return rendered
++
++
++def render_pep440_old(pieces):
++    """TAG[.postDISTANCE[.dev0]] .
++
++    The ".dev0" means dirty.
++
++    Exceptions:
++    1: no tags. 0.postDISTANCE[.dev0]
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            rendered += ".post%d" % pieces["distance"]
++            if pieces["dirty"]:
++                rendered += ".dev0"
++    else:
++        # exception #1
++        rendered = "0.post%d" % pieces["distance"]
++        if pieces["dirty"]:
++            rendered += ".dev0"
++    return rendered
++
++
++def render_git_describe(pieces):
++    """TAG[-DISTANCE-gHEX][-dirty].
++
++    Like 'git describe --tags --dirty --always'.
++
++    Exceptions:
++    1: no tags. HEX[-dirty]  (note: no 'g' prefix)
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"]:
++            rendered += "-%d-g%s" % (pieces["distance"], pieces["short"])
++    else:
++        # exception #1
++        rendered = pieces["short"]
++    if pieces["dirty"]:
++        rendered += "-dirty"
++    return rendered
++
++
++def render_git_describe_long(pieces):
++    """TAG-DISTANCE-gHEX[-dirty].
++
++    Like 'git describe --tags --dirty --always -long'.
++    The distance/hash is unconditional.
++
++    Exceptions:
++    1: no tags. HEX[-dirty]  (note: no 'g' prefix)
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        rendered += "-%d-g%s" % (pieces["distance"], pieces["short"])
++    else:
++        # exception #1
++        rendered = pieces["short"]
++    if pieces["dirty"]:
++        rendered += "-dirty"
++    return rendered
++
++
++def render(pieces, style):
++    """Render the given version pieces into the requested style."""
++    if pieces["error"]:
++        return {"version": "unknown",
++                "full-revisionid": pieces.get("long"),
++                "dirty": None,
++                "error": pieces["error"],
++                "date": None}
++
++    if not style or style == "default":
++        style = "pep440"  # the default
++
++    if style == "pep440":
++        rendered = render_pep440(pieces)
++    elif style == "pep440-branch":
++        rendered = render_pep440_branch(pieces)
++    elif style == "pep440-pre":
++        rendered = render_pep440_pre(pieces)
++    elif style == "pep440-post":
++        rendered = render_pep440_post(pieces)
++    elif style == "pep440-post-branch":
++        rendered = render_pep440_post_branch(pieces)
++    elif style == "pep440-old":
++        rendered = render_pep440_old(pieces)
++    elif style == "git-describe":
++        rendered = render_git_describe(pieces)
++    elif style == "git-describe-long":
++        rendered = render_git_describe_long(pieces)
++    else:
++        raise ValueError("unknown style '%s'" % style)
++
++    return {"version": rendered, "full-revisionid": pieces["long"],
++            "dirty": pieces["dirty"], "error": None,
++            "date": pieces.get("date")}
+ 
+ 
+ def get_versions():
+-    return json.loads(version_json)
++    """Get version information or return default if unable to do so."""
++    # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have
++    # __file__, we can work backwards from there to the root. Some
++    # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which
++    # case we can only use expanded keywords.
++
++    cfg = get_config()
++    verbose = cfg.verbose
++
++    try:
++        return git_versions_from_keywords(get_keywords(), cfg.tag_prefix,
++                                          verbose)
++    except NotThisMethod:
++        pass
++
++    try:
++        root = os.path.realpath(__file__)
++        # versionfile_source is the relative path from the top of the source
++        # tree (where the .git directory might live) to this file. Invert
++        # this to find the root from __file__.
++        for _ in cfg.versionfile_source.split('/'):
++            root = os.path.dirname(root)
++    except NameError:
++        return {"version": "0+unknown", "full-revisionid": None,
++                "dirty": None,
++                "error": "unable to find root of source tree",
++                "date": None}
++
++    try:
++        pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose)
++        return render(pieces, cfg.style)
++    except NotThisMethod:
++        pass
++
++    try:
++        if cfg.parentdir_prefix:
++            return versions_from_parentdir(cfg.parentdir_prefix, root, verbose)
++    except NotThisMethod:
++        pass
++
++    return {"version": "0+unknown", "full-revisionid": None,
++            "dirty": None,
++            "error": "unable to compute version", "date": None}
+diff --git a/versioneer.py b/versioneer.py
+index 7ed2a21..a142bf5 100644
+--- a/versioneer.py
++++ b/versioneer.py
+@@ -1,5 +1,5 @@
+ 
+-# Version: 0.16
++# Version: 0.22
+ 
+ """The Versioneer - like a rocketeer, but for versions.
+ 
+@@ -7,18 +7,14 @@ The Versioneer
+ ==============
+ 
+ * like a rocketeer, but for versions!
+-* https://github.com/warner/python-versioneer
++* https://github.com/python-versioneer/python-versioneer
+ * Brian Warner
+ * License: Public Domain
+-* Compatible With: python2.6, 2.7, 3.3, 3.4, 3.5, and pypy
+-* [![Latest Version]
+-(https://pypip.in/version/versioneer/badge.svg?style=flat)
+-](https://pypi.python.org/pypi/versioneer/)
+-* [![Build Status]
+-(https://travis-ci.org/warner/python-versioneer.png?branch=master)
+-](https://travis-ci.org/warner/python-versioneer)
+-
+-This is a tool for managing a recorded version number in distutils-based
++* Compatible with: Python 3.6, 3.7, 3.8, 3.9, 3.10 and pypy3
++* [![Latest Version][pypi-image]][pypi-url]
++* [![Build Status][travis-image]][travis-url]
++
++This is a tool for managing a recorded version number in distutils/setuptools-based
+ python projects. The goal is to remove the tedious and error-prone "update
+ the embedded version string" step from your release process. Making a new
+ release should be as easy as recording a new tag in your version-control
+@@ -27,9 +23,10 @@ system, and maybe making new tarballs.
+ 
+ ## Quick Install
+ 
+-* `pip install versioneer` to somewhere to your $PATH
+-* add a `[versioneer]` section to your setup.cfg (see below)
++* `pip install versioneer` to somewhere in your $PATH
++* add a `[versioneer]` section to your setup.cfg (see [Install](INSTALL.md))
+ * run `versioneer install` in your source tree, commit the results
++* Verify version information with `python setup.py version`
+ 
+ ## Version Identifiers
+ 
+@@ -61,7 +58,7 @@ version 1.3). Many VCS systems can report a description that captures this,
+ for example `git describe --tags --dirty --always` reports things like
+ "0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the
+ 0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has
+-uncommitted changes.
++uncommitted changes).
+ 
+ The version identifier is used for multiple purposes:
+ 
+@@ -88,127 +85,7 @@ the generated version data.
+ 
+ ## Installation
+ 
+-First, decide on values for the following configuration variables:
+-
+-* `VCS`: the version control system you use. Currently accepts "git".
+-
+-* `style`: the style of version string to be produced. See "Styles" below for
+-  details. Defaults to "pep440", which looks like
+-  `TAG[+DISTANCE.gSHORTHASH[.dirty]]`.
+-
+-* `versionfile_source`:
+-
+-  A project-relative pathname into which the generated version strings should
+-  be written. This is usually a `_version.py` next to your project's main
+-  `__init__.py` file, so it can be imported at runtime. If your project uses
+-  `src/myproject/__init__.py`, this should be `src/myproject/_version.py`.
+-  This file should be checked in to your VCS as usual: the copy created below
+-  by `setup.py setup_versioneer` will include code that parses expanded VCS
+-  keywords in generated tarballs. The 'build' and 'sdist' commands will
+-  replace it with a copy that has just the calculated version string.
+-
+-  This must be set even if your project does not have any modules (and will
+-  therefore never import `_version.py`), since "setup.py sdist" -based trees
+-  still need somewhere to record the pre-calculated version strings. Anywhere
+-  in the source tree should do. If there is a `__init__.py` next to your
+-  `_version.py`, the `setup.py setup_versioneer` command (described below)
+-  will append some `__version__`-setting assignments, if they aren't already
+-  present.
+-
+-* `versionfile_build`:
+-
+-  Like `versionfile_source`, but relative to the build directory instead of
+-  the source directory. These will differ when your setup.py uses
+-  'package_dir='. If you have `package_dir={'myproject': 'src/myproject'}`,
+-  then you will probably have `versionfile_build='myproject/_version.py'` and
+-  `versionfile_source='src/myproject/_version.py'`.
+-
+-  If this is set to None, then `setup.py build` will not attempt to rewrite
+-  any `_version.py` in the built tree. If your project does not have any
+-  libraries (e.g. if it only builds a script), then you should use
+-  `versionfile_build = None`. To actually use the computed version string,
+-  your `setup.py` will need to override `distutils.command.build_scripts`
+-  with a subclass that explicitly inserts a copy of
+-  `versioneer.get_version()` into your script file. See
+-  `test/demoapp-script-only/setup.py` for an example.
+-
+-* `tag_prefix`:
+-
+-  a string, like 'PROJECTNAME-', which appears at the start of all VCS tags.
+-  If your tags look like 'myproject-1.2.0', then you should use
+-  tag_prefix='myproject-'. If you use unprefixed tags like '1.2.0', this
+-  should be an empty string, using either `tag_prefix=` or `tag_prefix=''`.
+-
+-* `parentdir_prefix`:
+-
+-  a optional string, frequently the same as tag_prefix, which appears at the
+-  start of all unpacked tarball filenames. If your tarball unpacks into
+-  'myproject-1.2.0', this should be 'myproject-'. To disable this feature,
+-  just omit the field from your `setup.cfg`.
+-
+-This tool provides one script, named `versioneer`. That script has one mode,
+-"install", which writes a copy of `versioneer.py` into the current directory
+-and runs `versioneer.py setup` to finish the installation.
+-
+-To versioneer-enable your project:
+-
+-* 1: Modify your `setup.cfg`, adding a section named `[versioneer]` and
+-  populating it with the configuration values you decided earlier (note that
+-  the option names are not case-sensitive):
+-
+-  ````
+-  [versioneer]
+-  VCS = git
+-  style = pep440
+-  versionfile_source = src/myproject/_version.py
+-  versionfile_build = myproject/_version.py
+-  tag_prefix =
+-  parentdir_prefix = myproject-
+-  ````
+-
+-* 2: Run `versioneer install`. This will do the following:
+-
+-  * copy `versioneer.py` into the top of your source tree
+-  * create `_version.py` in the right place (`versionfile_source`)
+-  * modify your `__init__.py` (if one exists next to `_version.py`) to define
+-    `__version__` (by calling a function from `_version.py`)
+-  * modify your `MANIFEST.in` to include both `versioneer.py` and the
+-    generated `_version.py` in sdist tarballs
+-
+-  `versioneer install` will complain about any problems it finds with your
+-  `setup.py` or `setup.cfg`. Run it multiple times until you have fixed all
+-  the problems.
+-
+-* 3: add a `import versioneer` to your setup.py, and add the following
+-  arguments to the setup() call:
+-
+-        version=versioneer.get_version(),
+-        cmdclass=versioneer.get_cmdclass(),
+-
+-* 4: commit these changes to your VCS. To make sure you won't forget,
+-  `versioneer install` will mark everything it touched for addition using
+-  `git add`. Don't forget to add `setup.py` and `setup.cfg` too.
+-
+-## Post-Installation Usage
+-
+-Once established, all uses of your tree from a VCS checkout should get the
+-current version string. All generated tarballs should include an embedded
+-version string (so users who unpack them will not need a VCS tool installed).
+-
+-If you distribute your project through PyPI, then the release process should
+-boil down to two steps:
+-
+-* 1: git tag 1.0
+-* 2: python setup.py register sdist upload
+-
+-If you distribute it through github (i.e. users use github to generate
+-tarballs with `git archive`), the process is:
+-
+-* 1: git tag 1.0
+-* 2: git push; git push --tags
+-
+-Versioneer will report "0+untagged.NUMCOMMITS.gHASH" until your tree has at
+-least one tag in its history.
++See [INSTALL.md](./INSTALL.md) for detailed installation instructions.
+ 
+ ## Version-String Flavors
+ 
+@@ -229,6 +106,10 @@ information:
+ * `['full-revisionid']`: detailed revision identifier. For Git, this is the
+   full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac".
+ 
++* `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the
++  commit date in ISO 8601 format. This will be None if the date is not
++  available.
++
+ * `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that
+   this is only accurate if run in a VCS checkout, otherwise it is likely to
+   be False or None
+@@ -267,8 +148,8 @@ that this commit is two revisions ("+2") beyond the "0.11" tag. For released
+ software (exactly equal to a known tag), the identifier will only contain the
+ stripped tag, e.g. "0.11".
+ 
+-Other styles are available. See details.md in the Versioneer source tree for
+-descriptions.
++Other styles are available. See [details.md](details.md) in the Versioneer
++source tree for descriptions.
+ 
+ ## Debugging
+ 
+@@ -278,51 +159,83 @@ version`, which will run the version-lookup code in a verbose mode, and will
+ display the full contents of `get_versions()` (including the `error` string,
+ which may help identify what went wrong).
+ 
+-## Updating Versioneer
++## Known Limitations
+ 
+-To upgrade your project to a new release of Versioneer, do the following:
++Some situations are known to cause problems for Versioneer. This details the
++most significant ones. More can be found on Github
++[issues page](https://github.com/python-versioneer/python-versioneer/issues).
+ 
+-* install the new Versioneer (`pip install -U versioneer` or equivalent)
+-* edit `setup.cfg`, if necessary, to include any new configuration settings
+-  indicated by the release notes
+-* re-run `versioneer install` in your source tree, to replace
+-  `SRC/_version.py`
+-* commit any changed files
++### Subprojects
++
++Versioneer has limited support for source trees in which `setup.py` is not in
++the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are
++two common reasons why `setup.py` might not be in the root:
++
++* Source trees which contain multiple subprojects, such as
++  [Buildbot](https://github.com/buildbot/buildbot), which contains both
++  "master" and "slave" subprojects, each with their own `setup.py`,
++  `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI
++  distributions (and upload multiple independently-installable tarballs).
++* Source trees whose main purpose is to contain a C library, but which also
++  provide bindings to Python (and perhaps other languages) in subdirectories.
++
++Versioneer will look for `.git` in parent directories, and most operations
++should get the right version string. However `pip` and `setuptools` have bugs
++and implementation details which frequently cause `pip install .` from a
++subproject directory to fail to find a correct version string (so it usually
++defaults to `0+unknown`).
+ 
+-### Upgrading to 0.16
++`pip install --editable .` should work correctly. `setup.py install` might
++work too.
+ 
+-Nothing special.
++Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in
++some later version.
+ 
+-### Upgrading to 0.15
++[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking
++this issue. The discussion in
++[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the
++issue from the Versioneer side in more detail.
++[pip PR#3176](https://github.com/pypa/pip/pull/3176) and
++[pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve
++pip to let Versioneer work correctly.
+ 
+-Starting with this version, Versioneer is configured with a `[versioneer]`
+-section in your `setup.cfg` file. Earlier versions required the `setup.py` to
+-set attributes on the `versioneer` module immediately after import. The new
+-version will refuse to run (raising an exception during import) until you
+-have provided the necessary `setup.cfg` section.
++Versioneer-0.16 and earlier only looked for a `.git` directory next to the
++`setup.cfg`, so subprojects were completely unsupported with those releases.
+ 
+-In addition, the Versioneer package provides an executable named
+-`versioneer`, and the installation process is driven by running `versioneer
+-install`. In 0.14 and earlier, the executable was named
+-`versioneer-installer` and was run without an argument.
++### Editable installs with setuptools <= 18.5
+ 
+-### Upgrading to 0.14
++`setup.py develop` and `pip install --editable .` allow you to install a
++project into a virtualenv once, then continue editing the source code (and
++test) without re-installing after every change.
+ 
+-0.14 changes the format of the version string. 0.13 and earlier used
+-hyphen-separated strings like "0.11-2-g1076c97-dirty". 0.14 and beyond use a
+-plus-separated "local version" section strings, with dot-separated
+-components, like "0.11+2.g1076c97". PEP440-strict tools did not like the old
+-format, but should be ok with the new one.
++"Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a
++convenient way to specify executable scripts that should be installed along
++with the python package.
+ 
+-### Upgrading from 0.11 to 0.12
++These both work as expected when using modern setuptools. When using
++setuptools-18.5 or earlier, however, certain operations will cause
++`pkg_resources.DistributionNotFound` errors when running the entrypoint
++script, which must be resolved by re-installing the package. This happens
++when the install happens with one version, then the egg_info data is
++regenerated while a different version is checked out. Many setup.py commands
++cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into
++a different virtualenv), so this can be surprising.
+ 
+-Nothing special.
++[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes
++this one, but upgrading to a newer version of setuptools should probably
++resolve it.
+ 
+-### Upgrading from 0.10 to 0.11
+ 
+-You must add a `versioneer.VCS = "git"` to your `setup.py` before re-running
+-`setup.py setup_versioneer`. This will enable the use of additional
+-version-control systems (SVN, etc) in the future.
++## Updating Versioneer
++
++To upgrade your project to a new release of Versioneer, do the following:
++
++* install the new Versioneer (`pip install -U versioneer` or equivalent)
++* edit `setup.cfg`, if necessary, to include any new configuration settings
++  indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details.
++* re-run `versioneer install` in your source tree, to replace
++  `SRC/_version.py`
++* commit any changed files
+ 
+ ## Future Directions
+ 
+@@ -337,6 +250,14 @@ installation by editing setup.py . Alternatively, it might go the other
+ direction and include code from all supported VCS systems, reducing the
+ number of intermediate scripts.
+ 
++## Similar projects
++
++* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time
++  dependency
++* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of
++  versioneer
++* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools
++  plugin
+ 
+ ## License
+ 
+@@ -346,19 +267,28 @@ Specifically, both are released under the Creative Commons "Public Domain
+ Dedication" license (CC0-1.0), as described in
+ https://creativecommons.org/publicdomain/zero/1.0/ .
+ 
++[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg
++[pypi-url]: https://pypi.python.org/pypi/versioneer/
++[travis-image]:
++https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg
++[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer
++
+ """
++# pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring
++# pylint:disable=missing-class-docstring,too-many-branches,too-many-statements
++# pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error
++# pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with
++# pylint:disable=attribute-defined-outside-init,too-many-arguments
+ 
+-from __future__ import print_function
+-try:
+-    import configparser
+-except ImportError:
+-    import ConfigParser as configparser
++import configparser
+ import errno
+ import json
+ import os
+ import re
+ import subprocess
+ import sys
++from typing import Callable, Dict
++import functools
+ 
+ 
+ class VersioneerConfig:
+@@ -393,10 +323,12 @@ def get_root():
+         # module-import table will cache the first one. So we can't use
+         # os.path.dirname(__file__), as that will find whichever
+         # versioneer.py was first imported, even in later projects.
+-        me = os.path.realpath(os.path.abspath(__file__))
+-        if os.path.splitext(me)[0] != os.path.splitext(versioneer_py)[0]:
++        my_path = os.path.realpath(os.path.abspath(__file__))
++        me_dir = os.path.normcase(os.path.splitext(my_path)[0])
++        vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0])
++        if me_dir != vsr_dir:
+             print("Warning: build in %s is using versioneer.py from %s"
+-                  % (os.path.dirname(me), versioneer_py))
++                  % (os.path.dirname(my_path), versioneer_py))
+     except NameError:
+         pass
+     return root
+@@ -404,85 +336,94 @@ def get_root():
+ 
+ def get_config_from_root(root):
+     """Read the project setup.cfg file to determine Versioneer config."""
+-    # This might raise EnvironmentError (if setup.cfg is missing), or
++    # This might raise OSError (if setup.cfg is missing), or
+     # configparser.NoSectionError (if it lacks a [versioneer] section), or
+     # configparser.NoOptionError (if it lacks "VCS="). See the docstring at
+     # the top of versioneer.py for instructions on writing your setup.cfg .
+     setup_cfg = os.path.join(root, "setup.cfg")
+-    parser = configparser.SafeConfigParser()
+-    with open(setup_cfg, "r") as f:
+-        parser.readfp(f)
++    parser = configparser.ConfigParser()
++    with open(setup_cfg, "r") as cfg_file:
++        parser.read_file(cfg_file)
+     VCS = parser.get("versioneer", "VCS")  # mandatory
+ 
+-    def get(parser, name):
+-        if parser.has_option("versioneer", name):
+-            return parser.get("versioneer", name)
+-        return None
++    # Dict-like interface for non-mandatory entries
++    section = parser["versioneer"]
++
+     cfg = VersioneerConfig()
+     cfg.VCS = VCS
+-    cfg.style = get(parser, "style") or ""
+-    cfg.versionfile_source = get(parser, "versionfile_source")
+-    cfg.versionfile_build = get(parser, "versionfile_build")
+-    cfg.tag_prefix = get(parser, "tag_prefix")
++    cfg.style = section.get("style", "")
++    cfg.versionfile_source = section.get("versionfile_source")
++    cfg.versionfile_build = section.get("versionfile_build")
++    cfg.tag_prefix = section.get("tag_prefix")
+     if cfg.tag_prefix in ("''", '""'):
+         cfg.tag_prefix = ""
+-    cfg.parentdir_prefix = get(parser, "parentdir_prefix")
+-    cfg.verbose = get(parser, "verbose")
++    cfg.parentdir_prefix = section.get("parentdir_prefix")
++    cfg.verbose = section.get("verbose")
+     return cfg
+ 
+ 
+ class NotThisMethod(Exception):
+     """Exception raised if a method is not valid for the current scenario."""
+ 
++
+ # these dictionaries contain VCS-specific tools
+-LONG_VERSION_PY = {}
+-HANDLERS = {}
++LONG_VERSION_PY: Dict[str, str] = {}
++HANDLERS: Dict[str, Dict[str, Callable]] = {}
+ 
+ 
+ def register_vcs_handler(vcs, method):  # decorator
+-    """Decorator to mark a method as the handler for a particular VCS."""
++    """Create decorator to mark a method as the handler of a VCS."""
+     def decorate(f):
+         """Store f in HANDLERS[vcs][method]."""
+-        if vcs not in HANDLERS:
+-            HANDLERS[vcs] = {}
+-        HANDLERS[vcs][method] = f
++        HANDLERS.setdefault(vcs, {})[method] = f
+         return f
+     return decorate
+ 
+ 
+-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False):
++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
++                env=None):
+     """Call the given command(s)."""
+     assert isinstance(commands, list)
+-    p = None
+-    for c in commands:
++    process = None
++
++    popen_kwargs = {}
++    if sys.platform == "win32":
++        # This hides the console window if pythonw.exe is used
++        startupinfo = subprocess.STARTUPINFO()
++        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
++        popen_kwargs["startupinfo"] = startupinfo
++
++    for command in commands:
+         try:
+-            dispcmd = str([c] + args)
++            dispcmd = str([command] + args)
+             # remember shell=False, so use git.cmd on windows, not just git
+-            p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE,
+-                                 stderr=(subprocess.PIPE if hide_stderr
+-                                         else None))
++            process = subprocess.Popen([command] + args, cwd=cwd, env=env,
++                                       stdout=subprocess.PIPE,
++                                       stderr=(subprocess.PIPE if hide_stderr
++                                               else None), **popen_kwargs)
+             break
+-        except EnvironmentError:
++        except OSError:
+             e = sys.exc_info()[1]
+             if e.errno == errno.ENOENT:
+                 continue
+             if verbose:
+                 print("unable to run %s" % dispcmd)
+                 print(e)
+-            return None
++            return None, None
+     else:
+         if verbose:
+             print("unable to find command, tried %s" % (commands,))
+-        return None
+-    stdout = p.communicate()[0].strip()
+-    if sys.version_info[0] >= 3:
+-        stdout = stdout.decode()
+-    if p.returncode != 0:
++        return None, None
++    stdout = process.communicate()[0].strip().decode()
++    if process.returncode != 0:
+         if verbose:
+             print("unable to run %s (error)" % dispcmd)
+-        return None
+-    return stdout
+-LONG_VERSION_PY['git'] = '''
++            print("stdout was %s" % stdout)
++        return None, process.returncode
++    return stdout, process.returncode
++
++
++LONG_VERSION_PY['git'] = r'''
+ # This file helps to compute a version number in source trees obtained from
+ # git-archive tarball (such as those provided by githubs download-from-tag
+ # feature). Distribution tarballs (built by setup.py sdist) and build
+@@ -490,7 +431,7 @@ LONG_VERSION_PY['git'] = '''
+ # that just contains the computed version number.
+ 
+ # This file is released into the public domain. Generated by
+-# versioneer-0.16 (https://github.com/warner/python-versioneer)
++# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer)
+ 
+ """Git implementation of _version.py."""
+ 
+@@ -499,6 +440,8 @@ import os
+ import re
+ import subprocess
+ import sys
++from typing import Callable, Dict
++import functools
+ 
+ 
+ def get_keywords():
+@@ -509,7 +452,8 @@ def get_keywords():
+     # get_keywords().
+     git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s"
+     git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s"
+-    keywords = {"refnames": git_refnames, "full": git_full}
++    git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s"
++    keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
+     return keywords
+ 
+ 
+@@ -535,12 +479,12 @@ class NotThisMethod(Exception):
+     """Exception raised if a method is not valid for the current scenario."""
+ 
+ 
+-LONG_VERSION_PY = {}
+-HANDLERS = {}
++LONG_VERSION_PY: Dict[str, str] = {}
++HANDLERS: Dict[str, Dict[str, Callable]] = {}
+ 
+ 
+ def register_vcs_handler(vcs, method):  # decorator
+-    """Decorator to mark a method as the handler for a particular VCS."""
++    """Create decorator to mark a method as the handler of a VCS."""
+     def decorate(f):
+         """Store f in HANDLERS[vcs][method]."""
+         if vcs not in HANDLERS:
+@@ -550,55 +494,71 @@ def register_vcs_handler(vcs, method):  # decorator
+     return decorate
+ 
+ 
+-def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False):
++def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
++                env=None):
+     """Call the given command(s)."""
+     assert isinstance(commands, list)
+-    p = None
+-    for c in commands:
++    process = None
++
++    popen_kwargs = {}
++    if sys.platform == "win32":
++        # This hides the console window if pythonw.exe is used
++        startupinfo = subprocess.STARTUPINFO()
++        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
++        popen_kwargs["startupinfo"] = startupinfo
++
++    for command in commands:
+         try:
+-            dispcmd = str([c] + args)
++            dispcmd = str([command] + args)
+             # remember shell=False, so use git.cmd on windows, not just git
+-            p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE,
+-                                 stderr=(subprocess.PIPE if hide_stderr
+-                                         else None))
++            process = subprocess.Popen([command] + args, cwd=cwd, env=env,
++                                       stdout=subprocess.PIPE,
++                                       stderr=(subprocess.PIPE if hide_stderr
++                                               else None), **popen_kwargs)
+             break
+-        except EnvironmentError:
++        except OSError:
+             e = sys.exc_info()[1]
+             if e.errno == errno.ENOENT:
+                 continue
+             if verbose:
+                 print("unable to run %%s" %% dispcmd)
+                 print(e)
+-            return None
++            return None, None
+     else:
+         if verbose:
+             print("unable to find command, tried %%s" %% (commands,))
+-        return None
+-    stdout = p.communicate()[0].strip()
+-    if sys.version_info[0] >= 3:
+-        stdout = stdout.decode()
+-    if p.returncode != 0:
++        return None, None
++    stdout = process.communicate()[0].strip().decode()
++    if process.returncode != 0:
+         if verbose:
+             print("unable to run %%s (error)" %% dispcmd)
+-        return None
+-    return stdout
++            print("stdout was %%s" %% stdout)
++        return None, process.returncode
++    return stdout, process.returncode
+ 
+ 
+ def versions_from_parentdir(parentdir_prefix, root, verbose):
+     """Try to determine the version from the parent directory name.
+ 
+-    Source tarballs conventionally unpack into a directory that includes
+-    both the project name and a version string.
++    Source tarballs conventionally unpack into a directory that includes both
++    the project name and a version string. We will also support searching up
++    two directory levels for an appropriately named parent directory
+     """
+-    dirname = os.path.basename(root)
+-    if not dirname.startswith(parentdir_prefix):
+-        if verbose:
+-            print("guessing rootdir is '%%s', but '%%s' doesn't start with "
+-                  "prefix '%%s'" %% (root, dirname, parentdir_prefix))
+-        raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
+-    return {"version": dirname[len(parentdir_prefix):],
+-            "full-revisionid": None,
+-            "dirty": False, "error": None}
++    rootdirs = []
++
++    for _ in range(3):
++        dirname = os.path.basename(root)
++        if dirname.startswith(parentdir_prefix):
++            return {"version": dirname[len(parentdir_prefix):],
++                    "full-revisionid": None,
++                    "dirty": False, "error": None, "date": None}
++        rootdirs.append(root)
++        root = os.path.dirname(root)  # up a level
++
++    if verbose:
++        print("Tried directories %%s but none started with prefix %%s" %%
++              (str(rootdirs), parentdir_prefix))
++    raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
+ 
+ 
+ @register_vcs_handler("git", "get_keywords")
+@@ -610,18 +570,21 @@ def git_get_keywords(versionfile_abs):
+     # _version.py.
+     keywords = {}
+     try:
+-        f = open(versionfile_abs, "r")
+-        for line in f.readlines():
+-            if line.strip().startswith("git_refnames ="):
+-                mo = re.search(r'=\s*"(.*)"', line)
+-                if mo:
+-                    keywords["refnames"] = mo.group(1)
+-            if line.strip().startswith("git_full ="):
+-                mo = re.search(r'=\s*"(.*)"', line)
+-                if mo:
+-                    keywords["full"] = mo.group(1)
+-        f.close()
+-    except EnvironmentError:
++        with open(versionfile_abs, "r") as fobj:
++            for line in fobj:
++                if line.strip().startswith("git_refnames ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["refnames"] = mo.group(1)
++                if line.strip().startswith("git_full ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["full"] = mo.group(1)
++                if line.strip().startswith("git_date ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["date"] = mo.group(1)
++    except OSError:
+         pass
+     return keywords
+ 
+@@ -629,18 +592,31 @@ def git_get_keywords(versionfile_abs):
+ @register_vcs_handler("git", "keywords")
+ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+     """Get version information from git keywords."""
+-    if not keywords:
+-        raise NotThisMethod("no keywords at all, weird")
++    if "refnames" not in keywords:
++        raise NotThisMethod("Short version file found")
++    date = keywords.get("date")
++    if date is not None:
++        # Use only the last line.  Previous lines may contain GPG signature
++        # information.
++        date = date.splitlines()[-1]
++
++        # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant
++        # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601
++        # -like" string, which we must then edit to make compliant), because
++        # it's been around since git-1.5.3, and it's too difficult to
++        # discover which version we're using, or to work around using an
++        # older one.
++        date = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
+     refnames = keywords["refnames"].strip()
+     if refnames.startswith("$Format"):
+         if verbose:
+             print("keywords are unexpanded, not using")
+         raise NotThisMethod("unexpanded keywords, not a git-archive tarball")
+-    refs = set([r.strip() for r in refnames.strip("()").split(",")])
++    refs = {r.strip() for r in refnames.strip("()").split(",")}
+     # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
+     # just "foo-1.0". If we see a "tag: " prefix, prefer those.
+     TAG = "tag: "
+-    tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)])
++    tags = {r[len(TAG):] for r in refs if r.startswith(TAG)}
+     if not tags:
+         # Either we're using git < 1.8.3, or there really are no tags. We use
+         # a heuristic: assume all version tags have a digit. The old git %%d
+@@ -649,56 +625,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+         # between branches and tags. By ignoring refnames without digits, we
+         # filter out many common branch names like "release" and
+         # "stabilization", as well as "HEAD" and "master".
+-        tags = set([r for r in refs if re.search(r'\d', r)])
++        tags = {r for r in refs if re.search(r'\d', r)}
+         if verbose:
+-            print("discarding '%%s', no digits" %% ",".join(refs-tags))
++            print("discarding '%%s', no digits" %% ",".join(refs - tags))
+     if verbose:
+         print("likely tags: %%s" %% ",".join(sorted(tags)))
+     for ref in sorted(tags):
+         # sorting will prefer e.g. "2.0" over "2.0rc1"
+         if ref.startswith(tag_prefix):
+             r = ref[len(tag_prefix):]
++            # Filter out refs that exactly match prefix or that don't start
++            # with a number once the prefix is stripped (mostly a concern
++            # when prefix is '')
++            if not re.match(r'\d', r):
++                continue
+             if verbose:
+                 print("picking %%s" %% r)
+             return {"version": r,
+                     "full-revisionid": keywords["full"].strip(),
+-                    "dirty": False, "error": None
+-                    }
++                    "dirty": False, "error": None,
++                    "date": date}
+     # no suitable tags, so version is "0+unknown", but full hex is still there
+     if verbose:
+         print("no suitable tags, using unknown + full revision id")
+     return {"version": "0+unknown",
+             "full-revisionid": keywords["full"].strip(),
+-            "dirty": False, "error": "no suitable tags"}
++            "dirty": False, "error": "no suitable tags", "date": None}
+ 
+ 
+ @register_vcs_handler("git", "pieces_from_vcs")
+-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
+     """Get version from 'git describe' in the root of the source tree.
+ 
+     This only gets called if the git-archive 'subst' keywords were *not*
+     expanded, and _version.py hasn't already been rewritten with a short
+     version string, meaning we're inside a checked out source tree.
+     """
+-    if not os.path.exists(os.path.join(root, ".git")):
+-        if verbose:
+-            print("no .git in %%s" %% root)
+-        raise NotThisMethod("no .git directory")
+-
+     GITS = ["git"]
+     if sys.platform == "win32":
+         GITS = ["git.cmd", "git.exe"]
++
++    # GIT_DIR can interfere with correct operation of Versioneer.
++    # It may be intended to be passed to the Versioneer-versioned project,
++    # but that should not change where we get our version from.
++    env = os.environ.copy()
++    env.pop("GIT_DIR", None)
++    runner = functools.partial(runner, env=env)
++
++    _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
++                   hide_stderr=True)
++    if rc != 0:
++        if verbose:
++            print("Directory %%s not under git control" %% root)
++        raise NotThisMethod("'git rev-parse --git-dir' returned error")
++
++    MATCH_ARGS = ["--match", "%%s*" %% tag_prefix] if tag_prefix else []
++
+     # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
+     # if there isn't one, this yields HEX[-dirty] (no NUM)
+-    describe_out = run_command(GITS, ["describe", "--tags", "--dirty",
+-                                      "--always", "--long",
+-                                      "--match", "%%s*" %% tag_prefix],
+-                               cwd=root)
++    describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
++                                     "--always", "--long", *MATCH_ARGS],
++                              cwd=root)
+     # --long was added in git-1.5.5
+     if describe_out is None:
+         raise NotThisMethod("'git describe' failed")
+     describe_out = describe_out.strip()
+-    full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root)
++    full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root)
+     if full_out is None:
+         raise NotThisMethod("'git rev-parse' failed")
+     full_out = full_out.strip()
+@@ -708,6 +700,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+     pieces["short"] = full_out[:7]  # maybe improved later
+     pieces["error"] = None
+ 
++    branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"],
++                             cwd=root)
++    # --abbrev-ref was added in git-1.6.3
++    if rc != 0 or branch_name is None:
++        raise NotThisMethod("'git rev-parse --abbrev-ref' returned error")
++    branch_name = branch_name.strip()
++
++    if branch_name == "HEAD":
++        # If we aren't exactly on a branch, pick a branch which represents
++        # the current commit. If all else fails, we are on a branchless
++        # commit.
++        branches, rc = runner(GITS, ["branch", "--contains"], cwd=root)
++        # --contains was added in git-1.5.4
++        if rc != 0 or branches is None:
++            raise NotThisMethod("'git branch --contains' returned error")
++        branches = branches.split("\n")
++
++        # Remove the first line if we're running detached
++        if "(" in branches[0]:
++            branches.pop(0)
++
++        # Strip off the leading "* " from the list of branches.
++        branches = [branch[2:] for branch in branches]
++        if "master" in branches:
++            branch_name = "master"
++        elif not branches:
++            branch_name = None
++        else:
++            # Pick the first branch that is returned. Good or bad.
++            branch_name = branches[0]
++
++    pieces["branch"] = branch_name
++
+     # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
+     # TAG might have hyphens.
+     git_describe = describe_out
+@@ -724,7 +749,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+         # TAG-NUM-gHEX
+         mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
+         if not mo:
+-            # unparseable. Maybe git-describe is misbehaving?
++            # unparsable. Maybe git-describe is misbehaving?
+             pieces["error"] = ("unable to parse git-describe output: '%%s'"
+                                %% describe_out)
+             return pieces
+@@ -749,10 +774,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+     else:
+         # HEX: no tags
+         pieces["closest-tag"] = None
+-        count_out = run_command(GITS, ["rev-list", "HEAD", "--count"],
+-                                cwd=root)
++        count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root)
+         pieces["distance"] = int(count_out)  # total number of commits
+ 
++    # commit date: see ISO-8601 comment in git_versions_from_keywords()
++    date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip()
++    # Use only the last line.  Previous lines may contain GPG signature
++    # information.
++    date = date.splitlines()[-1]
++    pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++
+     return pieces
+ 
+ 
+@@ -788,19 +819,67 @@ def render_pep440(pieces):
+     return rendered
+ 
+ 
+-def render_pep440_pre(pieces):
+-    """TAG[.post.devDISTANCE] -- No -dirty.
++def render_pep440_branch(pieces):
++    """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] .
++
++    The ".dev0" means not master branch. Note that .dev0 sorts backwards
++    (a feature branch will appear "older" than the master branch).
+ 
+     Exceptions:
+-    1: no tags. 0.post.devDISTANCE
++    1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty]
+     """
+     if pieces["closest-tag"]:
+         rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            if pieces["branch"] != "master":
++                rendered += ".dev0"
++            rendered += plus_or_dot(pieces)
++            rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"])
++            if pieces["dirty"]:
++                rendered += ".dirty"
++    else:
++        # exception #1
++        rendered = "0"
++        if pieces["branch"] != "master":
++            rendered += ".dev0"
++        rendered += "+untagged.%%d.g%%s" %% (pieces["distance"],
++                                          pieces["short"])
++        if pieces["dirty"]:
++            rendered += ".dirty"
++    return rendered
++
++
++def pep440_split_post(ver):
++    """Split pep440 version string at the post-release segment.
++
++    Returns the release segments before the post-release and the
++    post-release version number (or -1 if no post-release segment is present).
++    """
++    vc = str.split(ver, ".post")
++    return vc[0], int(vc[1] or 0) if len(vc) == 2 else None
++
++
++def render_pep440_pre(pieces):
++    """TAG[.postN.devDISTANCE] -- No -dirty.
++
++    Exceptions:
++    1: no tags. 0.post0.devDISTANCE
++    """
++    if pieces["closest-tag"]:
+         if pieces["distance"]:
+-            rendered += ".post.dev%%d" %% pieces["distance"]
++            # update the post release segment
++            tag_version, post_version = pep440_split_post(pieces["closest-tag"])
++            rendered = tag_version
++            if post_version is not None:
++                rendered += ".post%%d.dev%%d" %% (post_version+1, pieces["distance"])
++            else:
++                rendered += ".post0.dev%%d" %% (pieces["distance"])
++        else:
++            # no commits, use the tag as the version
++            rendered = pieces["closest-tag"]
+     else:
+         # exception #1
+-        rendered = "0.post.dev%%d" %% pieces["distance"]
++        rendered = "0.post0.dev%%d" %% pieces["distance"]
+     return rendered
+ 
+ 
+@@ -831,12 +910,41 @@ def render_pep440_post(pieces):
+     return rendered
+ 
+ 
++def render_pep440_post_branch(pieces):
++    """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] .
++
++    The ".dev0" means not master branch.
++
++    Exceptions:
++    1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty]
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            rendered += ".post%%d" %% pieces["distance"]
++            if pieces["branch"] != "master":
++                rendered += ".dev0"
++            rendered += plus_or_dot(pieces)
++            rendered += "g%%s" %% pieces["short"]
++            if pieces["dirty"]:
++                rendered += ".dirty"
++    else:
++        # exception #1
++        rendered = "0.post%%d" %% pieces["distance"]
++        if pieces["branch"] != "master":
++            rendered += ".dev0"
++        rendered += "+g%%s" %% pieces["short"]
++        if pieces["dirty"]:
++            rendered += ".dirty"
++    return rendered
++
++
+ def render_pep440_old(pieces):
+     """TAG[.postDISTANCE[.dev0]] .
+ 
+     The ".dev0" means dirty.
+ 
+-    Eexceptions:
++    Exceptions:
+     1: no tags. 0.postDISTANCE[.dev0]
+     """
+     if pieces["closest-tag"]:
+@@ -899,17 +1007,22 @@ def render(pieces, style):
+         return {"version": "unknown",
+                 "full-revisionid": pieces.get("long"),
+                 "dirty": None,
+-                "error": pieces["error"]}
++                "error": pieces["error"],
++                "date": None}
+ 
+     if not style or style == "default":
+         style = "pep440"  # the default
+ 
+     if style == "pep440":
+         rendered = render_pep440(pieces)
++    elif style == "pep440-branch":
++        rendered = render_pep440_branch(pieces)
+     elif style == "pep440-pre":
+         rendered = render_pep440_pre(pieces)
+     elif style == "pep440-post":
+         rendered = render_pep440_post(pieces)
++    elif style == "pep440-post-branch":
++        rendered = render_pep440_post_branch(pieces)
+     elif style == "pep440-old":
+         rendered = render_pep440_old(pieces)
+     elif style == "git-describe":
+@@ -920,7 +1033,8 @@ def render(pieces, style):
+         raise ValueError("unknown style '%%s'" %% style)
+ 
+     return {"version": rendered, "full-revisionid": pieces["long"],
+-            "dirty": pieces["dirty"], "error": None}
++            "dirty": pieces["dirty"], "error": None,
++            "date": pieces.get("date")}
+ 
+ 
+ def get_versions():
+@@ -944,12 +1058,13 @@ def get_versions():
+         # versionfile_source is the relative path from the top of the source
+         # tree (where the .git directory might live) to this file. Invert
+         # this to find the root from __file__.
+-        for i in cfg.versionfile_source.split('/'):
++        for _ in cfg.versionfile_source.split('/'):
+             root = os.path.dirname(root)
+     except NameError:
+         return {"version": "0+unknown", "full-revisionid": None,
+                 "dirty": None,
+-                "error": "unable to find root of source tree"}
++                "error": "unable to find root of source tree",
++                "date": None}
+ 
+     try:
+         pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose)
+@@ -965,7 +1080,7 @@ def get_versions():
+ 
+     return {"version": "0+unknown", "full-revisionid": None,
+             "dirty": None,
+-            "error": "unable to compute version"}
++            "error": "unable to compute version", "date": None}
+ '''
+ 
+ 
+@@ -978,18 +1093,21 @@ def git_get_keywords(versionfile_abs):
+     # _version.py.
+     keywords = {}
+     try:
+-        f = open(versionfile_abs, "r")
+-        for line in f.readlines():
+-            if line.strip().startswith("git_refnames ="):
+-                mo = re.search(r'=\s*"(.*)"', line)
+-                if mo:
+-                    keywords["refnames"] = mo.group(1)
+-            if line.strip().startswith("git_full ="):
+-                mo = re.search(r'=\s*"(.*)"', line)
+-                if mo:
+-                    keywords["full"] = mo.group(1)
+-        f.close()
+-    except EnvironmentError:
++        with open(versionfile_abs, "r") as fobj:
++            for line in fobj:
++                if line.strip().startswith("git_refnames ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["refnames"] = mo.group(1)
++                if line.strip().startswith("git_full ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["full"] = mo.group(1)
++                if line.strip().startswith("git_date ="):
++                    mo = re.search(r'=\s*"(.*)"', line)
++                    if mo:
++                        keywords["date"] = mo.group(1)
++    except OSError:
+         pass
+     return keywords
+ 
+@@ -997,18 +1115,31 @@ def git_get_keywords(versionfile_abs):
+ @register_vcs_handler("git", "keywords")
+ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+     """Get version information from git keywords."""
+-    if not keywords:
+-        raise NotThisMethod("no keywords at all, weird")
++    if "refnames" not in keywords:
++        raise NotThisMethod("Short version file found")
++    date = keywords.get("date")
++    if date is not None:
++        # Use only the last line.  Previous lines may contain GPG signature
++        # information.
++        date = date.splitlines()[-1]
++
++        # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant
++        # datestamp. However we prefer "%ci" (which expands to an "ISO-8601
++        # -like" string, which we must then edit to make compliant), because
++        # it's been around since git-1.5.3, and it's too difficult to
++        # discover which version we're using, or to work around using an
++        # older one.
++        date = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
+     refnames = keywords["refnames"].strip()
+     if refnames.startswith("$Format"):
+         if verbose:
+             print("keywords are unexpanded, not using")
+         raise NotThisMethod("unexpanded keywords, not a git-archive tarball")
+-    refs = set([r.strip() for r in refnames.strip("()").split(",")])
++    refs = {r.strip() for r in refnames.strip("()").split(",")}
+     # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
+     # just "foo-1.0". If we see a "tag: " prefix, prefer those.
+     TAG = "tag: "
+-    tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)])
++    tags = {r[len(TAG):] for r in refs if r.startswith(TAG)}
+     if not tags:
+         # Either we're using git < 1.8.3, or there really are no tags. We use
+         # a heuristic: assume all version tags have a digit. The old git %d
+@@ -1017,56 +1148,72 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
+         # between branches and tags. By ignoring refnames without digits, we
+         # filter out many common branch names like "release" and
+         # "stabilization", as well as "HEAD" and "master".
+-        tags = set([r for r in refs if re.search(r'\d', r)])
++        tags = {r for r in refs if re.search(r'\d', r)}
+         if verbose:
+-            print("discarding '%s', no digits" % ",".join(refs-tags))
++            print("discarding '%s', no digits" % ",".join(refs - tags))
+     if verbose:
+         print("likely tags: %s" % ",".join(sorted(tags)))
+     for ref in sorted(tags):
+         # sorting will prefer e.g. "2.0" over "2.0rc1"
+         if ref.startswith(tag_prefix):
+             r = ref[len(tag_prefix):]
++            # Filter out refs that exactly match prefix or that don't start
++            # with a number once the prefix is stripped (mostly a concern
++            # when prefix is '')
++            if not re.match(r'\d', r):
++                continue
+             if verbose:
+                 print("picking %s" % r)
+             return {"version": r,
+                     "full-revisionid": keywords["full"].strip(),
+-                    "dirty": False, "error": None
+-                    }
++                    "dirty": False, "error": None,
++                    "date": date}
+     # no suitable tags, so version is "0+unknown", but full hex is still there
+     if verbose:
+         print("no suitable tags, using unknown + full revision id")
+     return {"version": "0+unknown",
+             "full-revisionid": keywords["full"].strip(),
+-            "dirty": False, "error": "no suitable tags"}
++            "dirty": False, "error": "no suitable tags", "date": None}
+ 
+ 
+ @register_vcs_handler("git", "pieces_from_vcs")
+-def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
++def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
+     """Get version from 'git describe' in the root of the source tree.
+ 
+     This only gets called if the git-archive 'subst' keywords were *not*
+     expanded, and _version.py hasn't already been rewritten with a short
+     version string, meaning we're inside a checked out source tree.
+     """
+-    if not os.path.exists(os.path.join(root, ".git")):
+-        if verbose:
+-            print("no .git in %s" % root)
+-        raise NotThisMethod("no .git directory")
+-
+     GITS = ["git"]
+     if sys.platform == "win32":
+         GITS = ["git.cmd", "git.exe"]
++
++    # GIT_DIR can interfere with correct operation of Versioneer.
++    # It may be intended to be passed to the Versioneer-versioned project,
++    # but that should not change where we get our version from.
++    env = os.environ.copy()
++    env.pop("GIT_DIR", None)
++    runner = functools.partial(runner, env=env)
++
++    _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
++                   hide_stderr=True)
++    if rc != 0:
++        if verbose:
++            print("Directory %s not under git control" % root)
++        raise NotThisMethod("'git rev-parse --git-dir' returned error")
++
++    MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else []
++
+     # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
+     # if there isn't one, this yields HEX[-dirty] (no NUM)
+-    describe_out = run_command(GITS, ["describe", "--tags", "--dirty",
+-                                      "--always", "--long",
+-                                      "--match", "%s*" % tag_prefix],
+-                               cwd=root)
++    describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
++                                     "--always", "--long", *MATCH_ARGS],
++                              cwd=root)
+     # --long was added in git-1.5.5
+     if describe_out is None:
+         raise NotThisMethod("'git describe' failed")
+     describe_out = describe_out.strip()
+-    full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root)
++    full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root)
+     if full_out is None:
+         raise NotThisMethod("'git rev-parse' failed")
+     full_out = full_out.strip()
+@@ -1076,6 +1223,39 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+     pieces["short"] = full_out[:7]  # maybe improved later
+     pieces["error"] = None
+ 
++    branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"],
++                             cwd=root)
++    # --abbrev-ref was added in git-1.6.3
++    if rc != 0 or branch_name is None:
++        raise NotThisMethod("'git rev-parse --abbrev-ref' returned error")
++    branch_name = branch_name.strip()
++
++    if branch_name == "HEAD":
++        # If we aren't exactly on a branch, pick a branch which represents
++        # the current commit. If all else fails, we are on a branchless
++        # commit.
++        branches, rc = runner(GITS, ["branch", "--contains"], cwd=root)
++        # --contains was added in git-1.5.4
++        if rc != 0 or branches is None:
++            raise NotThisMethod("'git branch --contains' returned error")
++        branches = branches.split("\n")
++
++        # Remove the first line if we're running detached
++        if "(" in branches[0]:
++            branches.pop(0)
++
++        # Strip off the leading "* " from the list of branches.
++        branches = [branch[2:] for branch in branches]
++        if "master" in branches:
++            branch_name = "master"
++        elif not branches:
++            branch_name = None
++        else:
++            # Pick the first branch that is returned. Good or bad.
++            branch_name = branches[0]
++
++    pieces["branch"] = branch_name
++
+     # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
+     # TAG might have hyphens.
+     git_describe = describe_out
+@@ -1092,7 +1272,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+         # TAG-NUM-gHEX
+         mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
+         if not mo:
+-            # unparseable. Maybe git-describe is misbehaving?
++            # unparsable. Maybe git-describe is misbehaving?
+             pieces["error"] = ("unable to parse git-describe output: '%s'"
+                                % describe_out)
+             return pieces
+@@ -1117,10 +1297,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
+     else:
+         # HEX: no tags
+         pieces["closest-tag"] = None
+-        count_out = run_command(GITS, ["rev-list", "HEAD", "--count"],
+-                                cwd=root)
++        count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root)
+         pieces["distance"] = int(count_out)  # total number of commits
+ 
++    # commit date: see ISO-8601 comment in git_versions_from_keywords()
++    date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip()
++    # Use only the last line.  Previous lines may contain GPG signature
++    # information.
++    date = date.splitlines()[-1]
++    pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
++
+     return pieces
+ 
+ 
+@@ -1128,7 +1314,7 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
+     """Git-specific installation logic for Versioneer.
+ 
+     For Git, this means creating/changing .gitattributes to mark _version.py
+-    for export-time keyword substitution.
++    for export-subst keyword substitution.
+     """
+     GITS = ["git"]
+     if sys.platform == "win32":
+@@ -1137,27 +1323,26 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
+     if ipy:
+         files.append(ipy)
+     try:
+-        me = __file__
+-        if me.endswith(".pyc") or me.endswith(".pyo"):
+-            me = os.path.splitext(me)[0] + ".py"
+-        versioneer_file = os.path.relpath(me)
++        my_path = __file__
++        if my_path.endswith(".pyc") or my_path.endswith(".pyo"):
++            my_path = os.path.splitext(my_path)[0] + ".py"
++        versioneer_file = os.path.relpath(my_path)
+     except NameError:
+         versioneer_file = "versioneer.py"
+     files.append(versioneer_file)
+     present = False
+     try:
+-        f = open(".gitattributes", "r")
+-        for line in f.readlines():
+-            if line.strip().startswith(versionfile_source):
+-                if "export-subst" in line.strip().split()[1:]:
+-                    present = True
+-        f.close()
+-    except EnvironmentError:
++        with open(".gitattributes", "r") as fobj:
++            for line in fobj:
++                if line.strip().startswith(versionfile_source):
++                    if "export-subst" in line.strip().split()[1:]:
++                        present = True
++                        break
++    except OSError:
+         pass
+     if not present:
+-        f = open(".gitattributes", "a+")
+-        f.write("%s export-subst\n" % versionfile_source)
+-        f.close()
++        with open(".gitattributes", "a+") as fobj:
++            fobj.write(f"{versionfile_source} export-subst\n")
+         files.append(".gitattributes")
+     run_command(GITS, ["add", "--"] + files)
+ 
+@@ -1165,27 +1350,34 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
+ def versions_from_parentdir(parentdir_prefix, root, verbose):
+     """Try to determine the version from the parent directory name.
+ 
+-    Source tarballs conventionally unpack into a directory that includes
+-    both the project name and a version string.
++    Source tarballs conventionally unpack into a directory that includes both
++    the project name and a version string. We will also support searching up
++    two directory levels for an appropriately named parent directory
+     """
+-    dirname = os.path.basename(root)
+-    if not dirname.startswith(parentdir_prefix):
+-        if verbose:
+-            print("guessing rootdir is '%s', but '%s' doesn't start with "
+-                  "prefix '%s'" % (root, dirname, parentdir_prefix))
+-        raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
+-    return {"version": dirname[len(parentdir_prefix):],
+-            "full-revisionid": None,
+-            "dirty": False, "error": None}
++    rootdirs = []
++
++    for _ in range(3):
++        dirname = os.path.basename(root)
++        if dirname.startswith(parentdir_prefix):
++            return {"version": dirname[len(parentdir_prefix):],
++                    "full-revisionid": None,
++                    "dirty": False, "error": None, "date": None}
++        rootdirs.append(root)
++        root = os.path.dirname(root)  # up a level
++
++    if verbose:
++        print("Tried directories %s but none started with prefix %s" %
++              (str(rootdirs), parentdir_prefix))
++    raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
++
+ 
+ SHORT_VERSION_PY = """
+-# This file was generated by 'versioneer.py' (0.16) from
++# This file was generated by 'versioneer.py' (0.22) from
+ # revision-control system data, or from the parent directory name of an
+ # unpacked source archive. Distribution tarballs contain a pre-generated copy
+ # of this file.
+ 
+ import json
+-import sys
+ 
+ version_json = '''
+ %s
+@@ -1202,10 +1394,13 @@ def versions_from_file(filename):
+     try:
+         with open(filename) as f:
+             contents = f.read()
+-    except EnvironmentError:
++    except OSError:
+         raise NotThisMethod("unable to read _version.py")
+     mo = re.search(r"version_json = '''\n(.*)'''  # END VERSION_JSON",
+                    contents, re.M | re.S)
++    if not mo:
++        mo = re.search(r"version_json = '''\r\n(.*)'''  # END VERSION_JSON",
++                       contents, re.M | re.S)
+     if not mo:
+         raise NotThisMethod("no version_json in _version.py")
+     return json.loads(mo.group(1))
+@@ -1254,19 +1449,67 @@ def render_pep440(pieces):
+     return rendered
+ 
+ 
+-def render_pep440_pre(pieces):
+-    """TAG[.post.devDISTANCE] -- No -dirty.
++def render_pep440_branch(pieces):
++    """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] .
++
++    The ".dev0" means not master branch. Note that .dev0 sorts backwards
++    (a feature branch will appear "older" than the master branch).
+ 
+     Exceptions:
+-    1: no tags. 0.post.devDISTANCE
++    1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty]
+     """
+     if pieces["closest-tag"]:
+         rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            if pieces["branch"] != "master":
++                rendered += ".dev0"
++            rendered += plus_or_dot(pieces)
++            rendered += "%d.g%s" % (pieces["distance"], pieces["short"])
++            if pieces["dirty"]:
++                rendered += ".dirty"
++    else:
++        # exception #1
++        rendered = "0"
++        if pieces["branch"] != "master":
++            rendered += ".dev0"
++        rendered += "+untagged.%d.g%s" % (pieces["distance"],
++                                          pieces["short"])
++        if pieces["dirty"]:
++            rendered += ".dirty"
++    return rendered
++
++
++def pep440_split_post(ver):
++    """Split pep440 version string at the post-release segment.
++
++    Returns the release segments before the post-release and the
++    post-release version number (or -1 if no post-release segment is present).
++    """
++    vc = str.split(ver, ".post")
++    return vc[0], int(vc[1] or 0) if len(vc) == 2 else None
++
++
++def render_pep440_pre(pieces):
++    """TAG[.postN.devDISTANCE] -- No -dirty.
++
++    Exceptions:
++    1: no tags. 0.post0.devDISTANCE
++    """
++    if pieces["closest-tag"]:
+         if pieces["distance"]:
+-            rendered += ".post.dev%d" % pieces["distance"]
++            # update the post release segment
++            tag_version, post_version = pep440_split_post(pieces["closest-tag"])
++            rendered = tag_version
++            if post_version is not None:
++                rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"])
++            else:
++                rendered += ".post0.dev%d" % (pieces["distance"])
++        else:
++            # no commits, use the tag as the version
++            rendered = pieces["closest-tag"]
+     else:
+         # exception #1
+-        rendered = "0.post.dev%d" % pieces["distance"]
++        rendered = "0.post0.dev%d" % pieces["distance"]
+     return rendered
+ 
+ 
+@@ -1297,12 +1540,41 @@ def render_pep440_post(pieces):
+     return rendered
+ 
+ 
++def render_pep440_post_branch(pieces):
++    """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] .
++
++    The ".dev0" means not master branch.
++
++    Exceptions:
++    1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty]
++    """
++    if pieces["closest-tag"]:
++        rendered = pieces["closest-tag"]
++        if pieces["distance"] or pieces["dirty"]:
++            rendered += ".post%d" % pieces["distance"]
++            if pieces["branch"] != "master":
++                rendered += ".dev0"
++            rendered += plus_or_dot(pieces)
++            rendered += "g%s" % pieces["short"]
++            if pieces["dirty"]:
++                rendered += ".dirty"
++    else:
++        # exception #1
++        rendered = "0.post%d" % pieces["distance"]
++        if pieces["branch"] != "master":
++            rendered += ".dev0"
++        rendered += "+g%s" % pieces["short"]
++        if pieces["dirty"]:
++            rendered += ".dirty"
++    return rendered
++
++
+ def render_pep440_old(pieces):
+     """TAG[.postDISTANCE[.dev0]] .
+ 
+     The ".dev0" means dirty.
+ 
+-    Eexceptions:
++    Exceptions:
+     1: no tags. 0.postDISTANCE[.dev0]
+     """
+     if pieces["closest-tag"]:
+@@ -1365,17 +1637,22 @@ def render(pieces, style):
+         return {"version": "unknown",
+                 "full-revisionid": pieces.get("long"),
+                 "dirty": None,
+-                "error": pieces["error"]}
++                "error": pieces["error"],
++                "date": None}
+ 
+     if not style or style == "default":
+         style = "pep440"  # the default
+ 
+     if style == "pep440":
+         rendered = render_pep440(pieces)
++    elif style == "pep440-branch":
++        rendered = render_pep440_branch(pieces)
+     elif style == "pep440-pre":
+         rendered = render_pep440_pre(pieces)
+     elif style == "pep440-post":
+         rendered = render_pep440_post(pieces)
++    elif style == "pep440-post-branch":
++        rendered = render_pep440_post_branch(pieces)
+     elif style == "pep440-old":
+         rendered = render_pep440_old(pieces)
+     elif style == "git-describe":
+@@ -1386,7 +1663,8 @@ def render(pieces, style):
+         raise ValueError("unknown style '%s'" % style)
+ 
+     return {"version": rendered, "full-revisionid": pieces["long"],
+-            "dirty": pieces["dirty"], "error": None}
++            "dirty": pieces["dirty"], "error": None,
++            "date": pieces.get("date")}
+ 
+ 
+ class VersioneerBadRootError(Exception):
+@@ -1465,7 +1743,8 @@ def get_versions(verbose=False):
+         print("unable to compute version")
+ 
+     return {"version": "0+unknown", "full-revisionid": None,
+-            "dirty": None, "error": "unable to compute version"}
++            "dirty": None, "error": "unable to compute version",
++            "date": None}
+ 
+ 
+ def get_version():
+@@ -1473,8 +1752,12 @@ def get_version():
+     return get_versions()["version"]
+ 
+ 
+-def get_cmdclass():
+-    """Get the custom setuptools/distutils subclasses used by Versioneer."""
++def get_cmdclass(cmdclass=None):
++    """Get the custom setuptools/distutils subclasses used by Versioneer.
++
++    If the package uses a different cmdclass (e.g. one from numpy), it
++    should be provide as an argument.
++    """
+     if "versioneer" in sys.modules:
+         del sys.modules["versioneer"]
+         # this fixes the "python setup.py develop" case (also 'install' and
+@@ -1488,12 +1771,15 @@ def get_cmdclass():
+         # parent is protected against the child's "import versioneer". By
+         # removing ourselves from sys.modules here, before the child build
+         # happens, we protect the child from the parent's versioneer too.
+-        # Also see https://github.com/warner/python-versioneer/issues/52
++        # Also see https://github.com/python-versioneer/python-versioneer/issues/52
+ 
+-    cmds = {}
++    cmds = {} if cmdclass is None else cmdclass.copy()
+ 
+     # we add "version" to both distutils and setuptools
+-    from distutils.core import Command
++    try:
++        from setuptools import Command
++    except ImportError:
++        from distutils.core import Command
+ 
+     class cmd_version(Command):
+         description = "report generated version string"
+@@ -1511,6 +1797,7 @@ def get_cmdclass():
+             print("Version: %s" % vers["version"])
+             print(" full-revisionid: %s" % vers.get("full-revisionid"))
+             print(" dirty: %s" % vers.get("dirty"))
++            print(" date: %s" % vers.get("date"))
+             if vers["error"]:
+                 print(" error: %s" % vers["error"])
+     cmds["version"] = cmd_version
+@@ -1524,9 +1811,16 @@ def get_cmdclass():
+     #  setuptools/bdist_egg -> distutils/install_lib -> build_py
+     #  setuptools/install -> bdist_egg ->..
+     #  setuptools/develop -> ?
++    #  pip install:
++    #   copies source tree to a tempdir before running egg_info/etc
++    #   if .git isn't copied too, 'git describe' will fail
++    #   then does setup.py bdist_wheel, or sometimes setup.py install
++    #  setup.py egg_info -> ?
+ 
+     # we override different "build_py" commands for both environments
+-    if "setuptools" in sys.modules:
++    if 'build_py' in cmds:
++        _build_py = cmds['build_py']
++    elif "setuptools" in sys.modules:
+         from setuptools.command.build_py import build_py as _build_py
+     else:
+         from distutils.command.build_py import build_py as _build_py
+@@ -1546,8 +1840,41 @@ def get_cmdclass():
+                 write_to_version_file(target_versionfile, versions)
+     cmds["build_py"] = cmd_build_py
+ 
++    if 'build_ext' in cmds:
++        _build_ext = cmds['build_ext']
++    elif "setuptools" in sys.modules:
++        from setuptools.command.build_ext import build_ext as _build_ext
++    else:
++        from distutils.command.build_ext import build_ext as _build_ext
++
++    class cmd_build_ext(_build_ext):
++        def run(self):
++            root = get_root()
++            cfg = get_config_from_root(root)
++            versions = get_versions()
++            _build_ext.run(self)
++            if self.inplace:
++                # build_ext --inplace will only build extensions in
++                # build/lib<..> dir with no _version.py to write to.
++                # As in place builds will already have a _version.py
++                # in the module dir, we do not need to write one.
++                return
++            # now locate _version.py in the new build/ directory and replace
++            # it with an updated value
++            target_versionfile = os.path.join(self.build_lib,
++                                              cfg.versionfile_build)
++            print("UPDATING %s" % target_versionfile)
++            write_to_version_file(target_versionfile, versions)
++    cmds["build_ext"] = cmd_build_ext
++
+     if "cx_Freeze" in sys.modules:  # cx_freeze enabled?
+         from cx_Freeze.dist import build_exe as _build_exe
++        # nczeczulin reports that py2exe won't like the pep440-style string
++        # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g.
++        # setup(console=[{
++        #   "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION
++        #   "product_version": versioneer.get_version(),
++        #   ...
+ 
+         class cmd_build_exe(_build_exe):
+             def run(self):
+@@ -1572,8 +1899,35 @@ def get_cmdclass():
+         cmds["build_exe"] = cmd_build_exe
+         del cmds["build_py"]
+ 
++    if 'py2exe' in sys.modules:  # py2exe enabled?
++        from py2exe.distutils_buildexe import py2exe as _py2exe
++
++        class cmd_py2exe(_py2exe):
++            def run(self):
++                root = get_root()
++                cfg = get_config_from_root(root)
++                versions = get_versions()
++                target_versionfile = cfg.versionfile_source
++                print("UPDATING %s" % target_versionfile)
++                write_to_version_file(target_versionfile, versions)
++
++                _py2exe.run(self)
++                os.unlink(target_versionfile)
++                with open(cfg.versionfile_source, "w") as f:
++                    LONG = LONG_VERSION_PY[cfg.VCS]
++                    f.write(LONG %
++                            {"DOLLAR": "$",
++                             "STYLE": cfg.style,
++                             "TAG_PREFIX": cfg.tag_prefix,
++                             "PARENTDIR_PREFIX": cfg.parentdir_prefix,
++                             "VERSIONFILE_SOURCE": cfg.versionfile_source,
++                             })
++        cmds["py2exe"] = cmd_py2exe
++
+     # we override different "sdist" commands for both environments
+-    if "setuptools" in sys.modules:
++    if 'sdist' in cmds:
++        _sdist = cmds['sdist']
++    elif "setuptools" in sys.modules:
+         from setuptools.command.sdist import sdist as _sdist
+     else:
+         from distutils.command.sdist import sdist as _sdist
+@@ -1640,21 +1994,26 @@ SAMPLE_CONFIG = """
+ 
+ """
+ 
+-INIT_PY_SNIPPET = """
++OLD_SNIPPET = """
+ from ._version import get_versions
+ __version__ = get_versions()['version']
+ del get_versions
+ """
+ 
++INIT_PY_SNIPPET = """
++from . import {0}
++__version__ = {0}.get_versions()['version']
++"""
++
+ 
+ def do_setup():
+-    """Main VCS-independent setup function for installing Versioneer."""
++    """Do main VCS-independent setup function for installing Versioneer."""
+     root = get_root()
+     try:
+         cfg = get_config_from_root(root)
+-    except (EnvironmentError, configparser.NoSectionError,
++    except (OSError, configparser.NoSectionError,
+             configparser.NoOptionError) as e:
+-        if isinstance(e, (EnvironmentError, configparser.NoSectionError)):
++        if isinstance(e, (OSError, configparser.NoSectionError)):
+             print("Adding sample versioneer config to setup.cfg",
+                   file=sys.stderr)
+             with open(os.path.join(root, "setup.cfg"), "a") as f:
+@@ -1678,12 +2037,18 @@ def do_setup():
+         try:
+             with open(ipy, "r") as f:
+                 old = f.read()
+-        except EnvironmentError:
++        except OSError:
+             old = ""
+-        if INIT_PY_SNIPPET not in old:
++        module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0]
++        snippet = INIT_PY_SNIPPET.format(module)
++        if OLD_SNIPPET in old:
++            print(" replacing boilerplate in %s" % ipy)
++            with open(ipy, "w") as f:
++                f.write(old.replace(OLD_SNIPPET, snippet))
++        elif snippet not in old:
+             print(" appending to %s" % ipy)
+             with open(ipy, "a") as f:
+-                f.write(INIT_PY_SNIPPET)
++                f.write(snippet)
+         else:
+             print(" %s unmodified" % ipy)
+     else:
+@@ -1702,7 +2067,7 @@ def do_setup():
+                 if line.startswith("include "):
+                     for include in line.split()[1:]:
+                         simple_includes.add(include)
+-    except EnvironmentError:
++    except OSError:
+         pass
+     # That doesn't cover everything MANIFEST.in can do
+     # (http://docs.python.org/2/distutils/sourcedist.html#commands), so
+@@ -1723,7 +2088,7 @@ def do_setup():
+         print(" versionfile_source already in MANIFEST.in")
+ 
+     # Make VCS-specific changes. For git, this means creating/changing
+-    # .gitattributes to mark _version.py for export-time keyword
++    # .gitattributes to mark _version.py for export-subst keyword
+     # substitution.
+     do_vcs_install(manifest_in, cfg.versionfile_source, ipy)
+     return 0
+@@ -1765,6 +2130,7 @@ def scan_setup_py():
+         errors += 1
+     return errors
+ 
++
+ if __name__ == "__main__":
+     cmd = sys.argv[1]
+     if cmd == "setup":
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb
index bd1136f..b3e1328 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-click-spinner_0.1.10.bb
@@ -3,6 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=8227180126797a0148f94f483f3e1489"
 
+SRC_URI += "file://0001-Update-Versioneer-to-0.22.patch"
 SRC_URI[md5sum] = "ab68ed404401421819c81cc6c0677a87"
 SRC_URI[sha256sum] = "87eacf9d7298973a25d7615ef57d4782aebf913a532bba4b28a37e366e975daf"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb
new file mode 100644
index 0000000..25c3795
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cloudpickle_3.0.0.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Pickler class to extend the standard pickle.Pickler functionality"
+DESCRIPTION = "cloudpickle makes it possible to serialize Python constructs \
+not supported by the default pickle module from the Python standard library.\
+\
+cloudpickle is especially useful for cluster computing where Python code is \
+shipped over the network to execute on remote hosts, possibly close to the \
+data."
+HOMEPAGE = "https://github.com/cloudpipe/cloudpickle"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE.cloudpickle;md5=b4d59aa5e2cc777722aac17841237931"
+
+inherit pypi python_flit_core
+
+SRC_URI += "https://raw.githubusercontent.com/cloudpipe/cloudpickle/v${PV}/LICENSE;downloadfilename=LICENSE.cloudpickle;name=license"
+
+SRC_URI[sha256sum] = "996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"
+SRC_URI[license.sha256sum] = "3029ea34173e9fdc233ad315dc6b100bd1ea71f529b1c1af97664a272fdc55f5"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cmake_3.27.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cmake_3.28.1.bb
similarity index 90%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cmake_3.27.7.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cmake_3.28.1.bb
index b613fd3..a6a7b6c 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cmake_3.27.7.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cmake_3.28.1.bb
@@ -11,7 +11,7 @@
 PYPI_ARCHIVE_NAME_PREFIX = "pypi-"
 
 inherit pypi python_setuptools_build_meta
-SRC_URI[sha256sum] = "9f4a7c7be2a25de5901f045618f41b833ea6c0f647115201d38e4fdf7e2815bc"
+SRC_URI[sha256sum] = "0d4051d101d151d8387156c463aa45c8cd0e164f870e0ac0c8c91d3ff08528e1"
 
 SRC_URI += " \
 	file://CMakeLists.txt \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_6.7.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_6.8.0.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_6.7.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_6.8.0.bb
index 69f4be1..6aefef6 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_6.7.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-colorlog_6.8.0.bb
@@ -7,6 +7,6 @@
 
 PYPI_PACKAGE = "colorlog"
 
-SRC_URI[sha256sum] = "bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5"
+SRC_URI[sha256sum] = "fbb6fdf9d5685f2517f388fb29bb27d54e8654dd31f58bc2a3b217e967a95ca6"
 
 RDEPENDS:${PN} += "python3-logging"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb
deleted file mode 100644
index 7f9b032..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-constantly_15.1.0.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-DESCRIPTION = "Symbolic constants in Python"
-HOMEPAGE = "https://github.com/twisted/constantly"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=e393e4ddd223e3a74982efa784f89fd7"
-
-SRC_URI[md5sum] = "f0762f083d83039758e53f8cf0086eef"
-SRC_URI[sha256sum] = "586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"
-
-inherit pypi setuptools3
-
-RDEPENDS:${PN} += "${PYTHON_PN}-json"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb
new file mode 100644
index 0000000..cb6ca0a
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-constantly_23.10.4.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "Symbolic constants in Python"
+HOMEPAGE = "https://github.com/twisted/constantly"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e393e4ddd223e3a74982efa784f89fd7"
+
+SRC_URI[sha256sum] = "aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"
+
+inherit pypi python_poetry_core 
+
+DEPENDS += "${PYTHON_PN}-versioneer-native"
+
+RDEPENDS:${PN} += "${PYTHON_PN}-json"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-coverage_7.3.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-coverage_7.3.4.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-coverage_7.3.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-coverage_7.3.4.bb
index 12496b0..42bc9fc 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-coverage_7.3.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-coverage_7.3.4.bb
@@ -3,7 +3,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2ee41112a44fe7014dce33e26468ba93"
 
-SRC_URI[sha256sum] = "be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"
+SRC_URI[sha256sum] = "020d56d2da5bc22a0e00a5b0d54597ee91ad72446fa4cf1b97c35022f6b6dbf0"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb
index 270f749..7817401 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cppy_1.2.1.bb
@@ -5,7 +5,7 @@
 
 SRC_URI[sha256sum] = "83b43bf17b1085ac15c5debdb42154f138b928234b21447358981f69d0d6fe1b"
 
-RDEPENDS:${PN} += "python3-setuptools python3-distutils"
+RDEPENDS:${PN} += "python3-setuptools"
 
 inherit pypi python_setuptools_build_meta
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-cycler_0.11.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb
similarity index 68%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-cycler_0.11.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb
index 59492e8..574083b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-cycler_0.11.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-cycler_0.12.1.bb
@@ -3,9 +3,9 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=7713fe42cd766b15c710e19392bfa811"
 
-SRC_URI[sha256sum] = "9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"
+SRC_URI[sha256sum] = "88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"
 
-inherit pypi setuptools3
+inherit pypi python_setuptools_build_meta
 
 RDEPENDS:${PN} += "\
     python3-core \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dbus-fast_2.15.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.0.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-dbus-fast_2.15.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.0.bb
index b3cb377..5698ae9 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-dbus-fast_2.15.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-dbus-fast_2.21.0.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=729e372b5ea0168438e4fd4a00a04947"
 
-SRC_URI[sha256sum] = "c98c7dfc3c589d6a5ded3427addfef1f9199525422f976e10d70a5c10558f5bf"
+SRC_URI[sha256sum] = "f582f6f16791ced6067dab325fae444edf7ce0704315b90c2a473090636a6fe0"
 
 PYPI_PACKAGE = "dbus_fast"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb
new file mode 100644
index 0000000..ea9303b
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-dirty-equals_0.7.1.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Doing dirty (but extremely useful) things with equals."
+DESCRIPTION = "dirty-equals is a python library that (mis)uses the \
+__eq__ method to make python code (generally unit tests) more \
+declarative and therefore easier to read and write.\
+\
+dirty-equals can be used in whatever context you like, but it comes \
+into its own when writing unit tests for applications where you're \
+commonly checking the response to API calls and the contents of a database."
+HOMEPAGE = "https://github.com/samuelcolvin/dirty-equals"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ab599c188b4a314d2856b3a55030c75c"
+
+SRC_URI[sha256sum] = "a580513f3285e93656a770a04e428f8bfc513848877bf278282dbfbb907fdbb4"
+
+S = "${WORKDIR}/dirty_equals-${PV}"
+
+inherit pypi python_hatchling
+
+PYPI_PACKAGE = "dirty_equals"
+
+RDEPENDS:${PN} += "python3-pytz"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-distlib_0.3.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-distlib_0.3.8.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-distlib_0.3.7.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-distlib_0.3.8.bb
index 1d9d53e..41a6647 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-distlib_0.3.7.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-distlib_0.3.8.bb
@@ -6,7 +6,7 @@
 LICENSE = "PSF-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f6a11430d5cd6e2cd3832ee94f22ddfc"
 
-SRC_URI[sha256sum] = "9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"
+SRC_URI[sha256sum] = "1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"
 
 BBCLASSEXTEND = "native nativesdk"
 inherit pypi python_setuptools_build_meta
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-distro_1.8.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-distro_1.8.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb
index f7616e4..a342432 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-distro_1.8.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-distro_1.9.0.bb
@@ -5,7 +5,7 @@
 
 PYPI_PACKAGE = "distro"
 
-SRC_URI[sha256sum] = "02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"
+SRC_URI[sha256sum] = "2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"
 
 inherit pypi python_setuptools_build_meta
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_4.2.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_4.2.7.bb
deleted file mode 100644
index 100db9b..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_4.2.7.bb
+++ /dev/null
@@ -1,9 +0,0 @@
-require python-django.inc
-inherit setuptools3
-
-SRC_URI[sha256sum] = "8e0f1c2c2786b5c0e39fe1afce24c926040fad47c8ea8ad30aaf1188df29fc41"
-
-RDEPENDS:${PN} += "\
-    ${PYTHON_PN}-sqlparse \
-    ${PYTHON_PN}-asgiref \
-"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-django_5.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_5.0.bb
new file mode 100644
index 0000000..bad4245
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-django_5.0.bb
@@ -0,0 +1,9 @@
+require python-django.inc
+inherit setuptools3
+
+SRC_URI[sha256sum] = "7d29e14dfbc19cb6a95a4bd669edbde11f5d4c6a71fdaa42c2d40b6846e807f7"
+
+RDEPENDS:${PN} += "\
+    ${PYTHON_PN}-sqlparse \
+    ${PYTHON_PN}-asgiref \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dominate/fix-ptests.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-dominate/fix-ptests.patch
deleted file mode 100644
index 81211d4..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-dominate/fix-ptests.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-Fixes test failures on musl
-
-Fixes errors
-ptestresult.python3-dominate.tests/test_dom_tag.py::test___get_thread_context
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-
-diff --git a/tests/test_dom_tag.py b/tests/test_dom_tag.py
-index 43ffecb..1126e54 100644
---- a/tests/test_dom_tag.py
-+++ b/tests/test_dom_tag.py
-@@ -18,6 +18,7 @@ def test___get_thread_context(monkeypatch):
-     monkeypatch.setattr(sut, 'threading', threading)
- 
-     assert sut._get_thread_context() in [
-+        1692341442, # Python >= 3.9, 32-bit
-         -6805948436281256182, # Python >= 3.9
-         3713141171098444831, # Python < 3.9
-     ]
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-dominate_2.8.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-dominate_2.8.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb
index 6b0489e..3bd9d87 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-dominate_2.8.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-dominate_2.9.1.bb
@@ -2,13 +2,12 @@
 LICENSE = "LGPL-3.0-only"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b52f2d57d10c4f7ee67a7eb9615d5d24"
 
-SRC_URI[sha256sum] = "4c90c3befaf88e612b71f4b39af7bcbef8977acfa855cec957225a8fbf504007"
+SRC_URI[sha256sum] = "558284687d9b8aae1904e3d6051ad132dd4a8c0cf551b37ea4e7e42a31d19dc4"
 
-inherit pypi setuptools3 ptest
+inherit pypi ptest python_setuptools_build_meta
 
 SRC_URI += " \
 	file://run-ptest \
-	file://fix-ptests.patch \
 "
 
 RDEPENDS:${PN}-ptest += " \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-engineio_4.8.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-engineio_4.8.1.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-engineio_4.8.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-engineio_4.8.1.bb
index 1cc79f1..f88a3ac 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-engineio_4.8.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-engineio_4.8.1.bb
@@ -17,4 +17,4 @@
 	python3-asyncio \
 "
 
-SRC_URI[sha256sum] = "2a32585d8fecd0118264fe0c39788670456ca9aa466d7c026d995cfff68af164"
+SRC_URI[sha256sum] = "fadc39c66348f96476d8dc2d7aaee7ea0a39d96e333217f5321300677b980121"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-keyfile_0.6.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-eth-keyfile_0.6.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb
index 55ab1a7..2afc288 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-keyfile_0.6.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-keyfile_0.7.0.bb
@@ -2,9 +2,9 @@
 HOMEPAGE = "https://github.com/ethereum/eth-keyfile"
 SECTION = "devel/python"
 LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=2beaef1b1764f4d6b46084c885b4bcad"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=6749008d847c14b9718949c2e24d5c0a"
 
-SRC_URI[sha256sum] = "471be6e5386fce7b22556b3d4bde5558dbce46d2674f00848027cb0a20abdc8c"
+SRC_URI[sha256sum] = "6bdb8110c3a50439deb68a04c93c9d5ddd5402353bfae1bf4cfca1d6dff14fcf"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-rlp_0.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-rlp_1.0.0.bb
similarity index 62%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-eth-rlp_0.3.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-eth-rlp_1.0.0.bb
index d19a657..5cd0d05 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-rlp_0.3.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-eth-rlp_1.0.0.bb
@@ -2,9 +2,9 @@
 HOMEPAGE = "https://github.com/ethereum/eth-rlp"
 SECTION = "devel/python"
 LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=287820ad3553117aa2f92bf84c219324"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7bdfe69b1ffbde073ca6e96f5c53f7"
 
-SRC_URI[sha256sum] = "f3263b548df718855d9a8dbd754473f383c0efc82914b0b849572ce3e06e71a6"
+SRC_URI[sha256sum] = "a988d713a36452e7c6da71186798343f687eaf3aeb7f99266750dd9e1f754c7b"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-eventlet_0.33.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-eventlet_0.34.2.bb
similarity index 74%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-eventlet_0.33.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-eventlet_0.34.2.bb
index c125666..86524da 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-eventlet_0.33.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-eventlet_0.34.2.bb
@@ -4,13 +4,12 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=56472ad6de4caf50e05332a34b66e778"
 
-SRC_URI[sha256sum] = "722803e7eadff295347539da363d68ae155b8b26ae6a634474d0a920be73cfda"
+SRC_URI[sha256sum] = "2115c7c6742e6893bf1347f82915572f8895c911cb5abaad4d3596a7daa847cc"
 
 inherit pypi setuptools3
 
 RDEPENDS:${PN} += " \
 	${PYTHON_PN}-dnspython \
 	${PYTHON_PN}-six \
-	${PYTHON_PN}-distutils \
 	${PYTHON_PN}-greenlet \
 "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb
new file mode 100644
index 0000000..6183c31
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-expandvars_0.12.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Expand system variables Unix style"
+HOMEPAGE = "https://github.com/sayanarijit/expandvars"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8b2e744064bd184728ac09dbfb52aaf4"
+
+SRC_URI[sha256sum] = "7d1adfa55728cf4b5d812ece3d087703faea953e0c0a1a78415de9df5024d844"
+
+inherit pypi python_hatchling python_setuptools_build_meta
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-fastnumbers_5.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-fastnumbers_5.0.1.bb
deleted file mode 100644
index 7494c45..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-fastnumbers_5.0.1.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-SUMMARY = "Super-fast and clean conversions to numbers."
-SECTION = "devel/python"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=58db8ac9e152dd9b700f4d39ff40a31a"
-
-PYPI_PACKAGE = "fastnumbers"
-
-SRC_URI[sha256sum] = "9e4fd92cdf263a8e0865af19c40ae9df45a9bc0eb5e22fefea871140e7e0262f"
-
-inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb
new file mode 100644
index 0000000..01aa8b3
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-fastnumbers_5.1.0.bb
@@ -0,0 +1,10 @@
+SUMMARY = "Super-fast and clean conversions to numbers."
+SECTION = "devel/python"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d32431d1b650010945da4e078011c8fa"
+
+PYPI_PACKAGE = "fastnumbers"
+
+SRC_URI[sha256sum] = "e092d33f8b95c3171a2fb34e579efe0c54b0290dd7f96ffaa2762437601d90a7"
+
+inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.5.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.5.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb
index d5438f1..cc07c92 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.5.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-jwt-extended_4.6.0.bb
@@ -7,7 +7,7 @@
 
 PYPI_PACKAGE = "Flask-JWT-Extended"
 
-SRC_URI[sha256sum] = "061ef3d25ed5743babe4964ab38f36d870e6d2fd8a126bab5d77ddef8a01932b"
+SRC_URI[sha256sum] = "9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2"
 
 RDEPENDS:${PN} += "\
     python3-werkzeug \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-restx_1.2.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-flask-restx_1.2.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb
index 573c2db..9c2a1e9 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-restx_1.2.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-restx_1.3.0.bb
@@ -2,7 +2,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=c96dd911c6d9e32868b6bc667a38a3e2"
 
-SRC_URI[sha256sum] = "9a5338b108c57fbed1d24d5d53fe98442b2be7ffa2ff3291305af7a613ce6fc0"
+SRC_URI[sha256sum] = "4f3d3fa7b6191fcc715b18c201a12cd875176f92ba4acc61626ccfd571ee1728"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb
deleted file mode 100644
index 3aa6303..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_2.5.1.bb
+++ /dev/null
@@ -1,11 +0,0 @@
-DESCRIPTION = "Adds SQLAlchemy support to your Flask application."
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
-
-SRC_URI[sha256sum] = "2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"
-
-PYPI_PACKAGE = "Flask-SQLAlchemy"
-
-inherit pypi setuptools3
-
-RDEPENDS:${PN} = "${PYTHON_PN}-sqlalchemy ${PYTHON_PN}-flask"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb
new file mode 100644
index 0000000..56f63bf
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-sqlalchemy_3.1.1.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "Adds SQLAlchemy support to your Flask application."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=ffeffa59c90c9c4a033c7574f8f3fb75"
+
+SRC_URI[sha256sum] = "e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312"
+
+PYPI_PACKAGE = "flask_sqlalchemy"
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask-SQLAlchemy"
+UPSTREAM_CHECK_REGEX = "/Flask-SQLAlchemy/(?P<pver>(\d+[\.\-_]*)+)"
+
+inherit pypi python_setuptools_build_meta
+
+RDEPENDS:${PN} = "${PYTHON_PN}-sqlalchemy ${PYTHON_PN}-flask"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-wtf_1.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-wtf_1.1.1.bb
deleted file mode 100644
index ec47fca..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-wtf_1.1.1.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-DESCRIPTION = "Simple integration of Flask and WTForms."
-LICENSE = "BSD-3-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=d98d089889e14b227732d45dac3aacc4"
-
-SRC_URI[sha256sum] = "41c4244e9ae626d63bed42ae4785b90667b885b1535d5a4095e1f63060d12aa9"
-
-PYPI_PACKAGE = "Flask-WTF"
-
-inherit pypi setuptools3
-
-RDEPENDS:${PN} = "\
-    ${PYTHON_PN}-flask \
-    ${PYTHON_PN}-itsdangerous \
-    ${PYTHON_PN}-json \
-    ${PYTHON_PN}-wtforms \
-"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb
new file mode 100644
index 0000000..973bb57
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask-wtf_1.2.1.bb
@@ -0,0 +1,18 @@
+DESCRIPTION = "Simple integration of Flask and WTForms."
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=d98d089889e14b227732d45dac3aacc4"
+
+SRC_URI[sha256sum] = "8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695"
+
+PYPI_PACKAGE = "flask_wtf"
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask-WTF"
+UPSTREAM_CHECK_REGEX = "/Flask-WTF/(?P<pver>(\d+[\.\-_]*)+)"
+
+inherit pypi python_hatchling
+
+RDEPENDS:${PN} = "\
+    ${PYTHON_PN}-flask \
+    ${PYTHON_PN}-itsdangerous \
+    ${PYTHON_PN}-json \
+    ${PYTHON_PN}-wtforms \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask_2.3.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask_2.3.3.bb
index c8c8d87..99a61f1 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-flask_2.3.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-flask_2.3.3.bb
@@ -8,6 +8,9 @@
 
 SRC_URI[sha256sum] = "09c347a92aa7ff4a8e7f3206795f30d826654baf38b873d0744cd571ca609efc"
 
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/Flask"
+UPSTREAM_CHECK_REGEX = "/Flask/(?P<pver>(\d+[\.\-_]*)+)"
+
 inherit pypi python_setuptools_build_meta
 
 CLEANBROKEN = "1"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-frozenlist_1.4.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-frozenlist_1.4.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb
index 340b0e3..1ce5c84 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-frozenlist_1.4.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-frozenlist_1.4.1.bb
@@ -3,9 +3,13 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=cf056e8e7a0a5477451af18b7b5aa98c"
 
-SRC_URI[sha256sum] = "09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"
+SRC_URI[sha256sum] = "c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"
 
 inherit pypi python_setuptools_build_meta
 
-BBCLASSEXTEND = "native nativesdk"
+DEPENDS += " \
+    ${PYTHON_PN}-expandvars-native \
+    ${PYTHON_PN}-cython-native \
+"
 
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-gmqtt_0.6.12.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-gmqtt_0.6.13.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-gmqtt_0.6.12.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-gmqtt_0.6.13.bb
index c06e94e..101bfb9 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-gmqtt_0.6.12.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-gmqtt_0.6.13.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=903f1792621a3b35ee546da75d139177"
 
-SRC_URI[sha256sum] = "7df03792343089ae62dc7cd6f8be356861c4fc68768cefa22f3d8de5e7e5be48"
+SRC_URI[sha256sum] = "b4623d3e32ba266e96c04b0871bb057d05414371c1d279550648b390e6ba7577"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.5.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.5.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb
index 7510625..b69e2c4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.5.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-gnupg_0.5.2.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=5dabe659eadd6d97325b1582e41cfc11"
 
 PYPI_PACKAGE = "python-gnupg"
-SRC_URI[sha256sum] = "5674bad4e93876c0b0d3197e314d7f942d39018bf31e2b833f6788a6813c3fb8"
+SRC_URI[sha256sum] = "01d8013931c9fa3f45824bbea7054c03d6e11f258a72e7e086e168dbcb91854c"
 
 inherit pypi python_setuptools_build_meta
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_2.14.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_2.15.0.bb
similarity index 86%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_2.14.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_2.15.0.bb
index b620e55..7ce2ad7 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_2.14.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-core_2.15.0.bb
@@ -5,7 +5,7 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "5368a4502b793d9bbf812a5912e13e4e69f9bd87f6efb508460c43f5bbd1ce41"
+SRC_URI[sha256sum] = "abc978a72658f14a2df1e5e12532effe40f94f868f6e23d95133bd6abcca35ca"
 
 RDEPENDS:${PN} += "\
     ${PYTHON_PN}-asyncio \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.108.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.111.0.bb
similarity index 86%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.108.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.111.0.bb
index f8ccc9a..8961351 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.108.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-api-python-client_2.111.0.bb
@@ -4,7 +4,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
 
-SRC_URI[sha256sum] = "6396efca83185fb205c0abdbc1c2ee57b40475578c6af37f6d0e30a639aade99"
+SRC_URI[sha256sum] = "3a45a53c031478d1c82c7162dd25c9a965247bca6bd438af0838a9d9b8219405"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_2.23.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_2.25.2.bb
similarity index 87%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_2.23.4.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_2.25.2.bb
index c7bf285..2f52761 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_2.23.4.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-google-auth_2.25.2.bb
@@ -5,7 +5,7 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"
+SRC_URI[sha256sum] = "42f707937feb4f5e5a39e6c4f343a17300a459aaf03141457ba505812841cc40"
 
 RDEPENDS:${PN} += "\
     ${PYTHON_PN}-asyncio \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.61.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.62.0.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.61.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.62.0.bb
index 171bc67..1536ba5 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.61.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-googleapis-common-protos_1.62.0.bb
@@ -5,7 +5,7 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"
+SRC_URI[sha256sum] = "83f0ece9f94e5672cced82f592d2a5edf527a96ed1794f0bab36d5735c996277"
 
 RDEPENDS:${PN} += "\
     ${PYTHON_PN}-grpcio \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_3.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_3.0.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb
index 523c2b6..abd6c49 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_3.0.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-greenlet_3.0.3.bb
@@ -4,6 +4,6 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=e95668d68e4329085c7ab3535e6a7aee \
                     file://LICENSE.PSF;md5=c106931d9429eda0492617f037b8f69a"
 
-SRC_URI[sha256sum] = "816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"
+SRC_URI[sha256sum] = "43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"
 
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-direct_mmap-Use-off_t-on-linux.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-direct_mmap-Use-off_t-on-linux.patch
deleted file mode 100644
index 9b3e5d4..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-direct_mmap-Use-off_t-on-linux.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 45fdade6c0415ec5af3f9312e6311a4ccc682a7b Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 28 Dec 2022 18:24:21 -0800
-Subject: [PATCH] direct_mmap: Use off_t on linux
-
-off64_t is not provided without defining _LARGEFILE64_SOURCE on musl
-this define is not defined automatically like glibc where it gets
-defined when _GNU_SOURCE is defined. Using off_t makes it portable
-across musl/glibc and for using 64bit off_t on glibc 32bit systems
--D_FILE_OFFSET_BITS=64 can be defined during build via CXXFLAGS
-
-Upstream-Status: Submitted [https://github.com/abseil/abseil-cpp/pull/1349]
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- absl/base/internal/direct_mmap.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/third_party/abseil-cpp/absl/base/internal/direct_mmap.h
-+++ b/third_party/abseil-cpp/absl/base/internal/direct_mmap.h
-@@ -72,7 +72,7 @@ namespace base_internal {
- // Platform specific logic extracted from
- // https://chromium.googlesource.com/linux-syscall-support/+/master/linux_syscall_support.h
- inline void* DirectMmap(void* start, size_t length, int prot, int flags, int fd,
--                        off64_t offset) noexcept {
-+                        off_t offset) noexcept {
- #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \
-     defined(__m68k__) || defined(__sh__) ||                                  \
-     (defined(__hppa__) && !defined(__LP64__)) ||                             \
-@@ -102,7 +102,7 @@ inline void* DirectMmap(void* start, siz
- #else
-   return reinterpret_cast<void*>(
-       syscall(SYS_mmap2, start, length, prot, flags, fd,
--              static_cast<off_t>(offset / pagesize)));
-+              offset / pagesize));
- #endif
- #elif defined(__s390x__)
-   // On s390x, mmap() arguments are passed in memory.
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch
index 8c70b2b..67505d0 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-protobuf-Disable-musttail-attribute-on-mips.patch
@@ -14,11 +14,11 @@
 
 --- a/third_party/protobuf/src/google/protobuf/port_def.inc
 +++ b/third_party/protobuf/src/google/protobuf/port_def.inc
-@@ -338,6 +338,7 @@ static_assert(PROTOBUF_ABSL_MIN(20230125
+@@ -298,6 +298,7 @@
  #error PROTOBUF_TAILCALL was previously defined
  #endif
- #if __has_cpp_attribute(clang::musttail) && !defined(__arm__) &&      \
-+    !defined(__mips__) &&                                        \
+ #if ABSL_HAVE_CPP_ATTRIBUTE(clang::musttail) && !defined(__arm__) &&  \
++    !defined(__mips__) &&                                             \
      !defined(_ARCH_PPC) && !defined(__wasm__) &&                      \
-     !(defined(_MSC_VER) && defined(_M_IX86)) && !defined(__i386__) && \
-     !(defined(__NDK_MAJOR__) && __NDK_MAJOR <= 24)
+     !(defined(_MSC_VER) && defined(_M_IX86)) && !defined(__i386__)
+ // Compilation fails on ARM32: b/195943306
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
index 4aa11bd..07276c1 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
@@ -30,29 +30,30 @@
 index cc53e79..be3bc78 100644
 --- a/setup.py
 +++ b/setup.py
-@@ -87,8 +87,11 @@ def check_linker_need_libatomic():
-     """Test if linker on system needs libatomic."""
-     code_test = (b'#include <atomic>\n' +
-                  b'int main() { return std::atomic<int64_t>{}; }')
--    cxx = os.environ.get('CXX', 'c++')
--    cpp_test = subprocess.Popen([cxx, '-x', 'c++', '-std=c++14', '-'],
+@@ -88,9 +88,11 @@
+         b"#include <atomic>\n"
+         + b"int main() { return std::atomic<int64_t>{}; }"
+     )
+-    cxx = os.environ.get("CXX", "c++")
+-    cpp_test = subprocess.Popen(
+-        [cxx, "-x", "c++", "-std=c++14", "-"],
 +    cxx, cxx_args = os.environ.get('CXX').split(' ', 1) or 'c++'
 +    if not cxx_args:
 +      cxx_args = "-g"
 +
 +    cpp_test = subprocess.Popen([cxx, cxx_args, '-x', 'c++', '-std=c++14', '-'],
-                                 stdin=PIPE,
-                                 stdout=PIPE,
-                                 stderr=PIPE)
-@@ -98,7 +101,7 @@ def check_linker_need_libatomic():
+         stdin=PIPE,
+         stdout=PIPE,
+         stderr=PIPE,
+@@ -101,7 +103,7 @@
      # Double-check to see if -latomic actually can solve the problem.
      # https://github.com/grpc/grpc/issues/22491
      cpp_test = subprocess.Popen(
--        [cxx, '-x', 'c++', '-std=c++14', '-', '-latomic'],
+-        [cxx, "-x", "c++", "-std=c++14", "-", "-latomic"],
 +        [cxx, cxx_args, '-x', 'c++', '-std=c++14', '-', '-latomic'],
          stdin=PIPE,
          stdout=PIPE,
-         stderr=PIPE)
+         stderr=PIPE,
 -- 
 2.25.1
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.56.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.60.0.bb
similarity index 77%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.56.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.60.0.bb
index 8fbe1fa..8e5c7d4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.56.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio-tools_1.60.0.bb
@@ -11,9 +11,8 @@
 
 SRC_URI += "file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch \
             file://0001-protobuf-Disable-musttail-attribute-on-mips.patch \
-            file://0001-direct_mmap-Use-off_t-on-linux.patch \
             "
-SRC_URI[sha256sum] = "39f5877cea514b3da9f2683dfb3ffb45ef47b05f4ff39c287d7d61c5057f48b8"
+SRC_URI[sha256sum] = "ed30499340228d733ff69fcf4a66590ed7921f94eb5a2bf692258b1280b9dac7"
 
 RDEPENDS:${PN} = "${PYTHON_PN}-grpcio"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch
index f970cf3..5cd94de 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-Include-missing-cstdint-header.patch
@@ -1,4 +1,4 @@
-From 752e30eebe5b91c323bafcbea8d450dd5683701a Mon Sep 17 00:00:00 2001
+From 252aa78526287fe033c5656cd166e551fa5daa88 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Mon, 30 Jan 2023 10:31:10 -0800
 Subject: [PATCH] Include missing <cstdint> header
@@ -11,6 +11,7 @@
 
 Upstream-Status: Submitted [https://code-review.googlesource.com/c/re2/+/60970]
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
+
 ---
  third_party/re2/util/pcre.h | 1 +
  1 file changed, 1 insertion(+)
@@ -27,6 +28,3 @@
  
  #ifdef USEPCRE
  #include <pcre.h>
--- 
-2.39.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-direct_mmap-Use-off_t-on-linux.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-direct_mmap-Use-off_t-on-linux.patch
deleted file mode 100644
index 49df528..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-direct_mmap-Use-off_t-on-linux.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 45fdade6c0415ec5af3f9312e6311a4ccc682a7b Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 28 Dec 2022 18:24:21 -0800
-Subject: [PATCH] direct_mmap: Use off_t on linux
-
-off64_t is not provided without defining _LARGEFILE64_SOURCE on musl
-this define is not defined automatically like glibc where it gets
-defined when _GNU_SOURCE is defined. Using off_t makes it portable
-across musl/glibc and for using 64bit off_t on glibc 32bit systems
--D_FILE_OFFSET_BITS=64 can be defined during build via CXXFLAGS
-
-Upstream-Status: Submitted [https://github.com/abseil/abseil-cpp/pull/1349]
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- absl/base/internal/direct_mmap.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/absl/base/internal/direct_mmap.h b/absl/base/internal/direct_mmap.h
-index 815b8d23..fdf88f0b 100644
---- a/absl/base/internal/direct_mmap.h
-+++ b/absl/base/internal/direct_mmap.h
-@@ -72,7 +72,7 @@ namespace base_internal {
- // Platform specific logic extracted from
- // https://chromium.googlesource.com/linux-syscall-support/+/master/linux_syscall_support.h
- inline void* DirectMmap(void* start, size_t length, int prot, int flags, int fd,
--                        off64_t offset) noexcept {
-+                        off_t offset) noexcept {
- #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \
-     defined(__m68k__) || defined(__sh__) ||                                  \
-     (defined(__hppa__) && !defined(__LP64__)) ||                             \
-@@ -102,7 +102,7 @@ inline void* DirectMmap(void* start, size_t length, int prot, int flags, int fd,
- #else
-   return reinterpret_cast<void*>(
-       syscall(SYS_mmap2, start, length, prot, flags, fd,
--              static_cast<off_t>(offset / pagesize)));
-+              offset / pagesize));
- #endif
- #elif defined(__s390x__)
-   // On s390x, mmap() arguments are passed in memory.
--- 
-2.39.0
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
deleted file mode 100644
index 13911dd..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From de10fbc2386dcac3ab810c49b6977b2ee01bf426 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 17 Feb 2021 13:30:23 -0800
-Subject: [PATCH] setup.py: Do not mix C and C++ compiler options
-
-EXTRA_ENV_COMPILE_ARGS is used both with CC and CXX
-so using -std=c++11 or -std=gnu99 together will cause
-build time errors espcially with clang
-
-Keep '-std=c++11' to fix native build error
-with old gcc (such as gcc 5.4.0 on ubuntu 16.04), for clang
-we will remove them through GRPC_PYTHON_CFLAGS at do_compile
-in bb recipe.
-
-While export CC="gcc ", cc_args is None, it will
-cause subprocess.Popen always return 1. On centos 8, if you don't
-install package libatomic, there will be a native build error
-`cannot find /usr/lib64/libatomic.so.1.2.0'.
-
-Add no harm '-g' to cc_args if cc_args is empty.
-
-Upstream-Status: Inappropriate [oe specific]
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
-Signed-off-by: Wang Mingyu <wangmy@fujitsu.com>
----
- setup.py                      | 11 +++++++----
- src/python/grpcio/commands.py |  5 ++++-
- 2 files changed, 11 insertions(+), 5 deletions(-)
-
---- a/setup.py
-+++ b/setup.py
-@@ -206,8 +206,11 @@ def check_linker_need_libatomic():
-     """Test if linker on system needs libatomic."""
-     code_test = (b'#include <atomic>\n' +
-                  b'int main() { return std::atomic<int64_t>{}; }')
--    cxx = shlex.split(os.environ.get('CXX', 'c++'))
--    cpp_test = subprocess.Popen(cxx + ['-x', 'c++', '-std=c++14', '-'],
-+    cxx, cxx_args = os.environ.get('CXX').split(' ', 1) or 'c++'
-+    if not cxx_args:
-+      cxx_args = "-g"
-+
-+    cpp_test = subprocess.Popen([cxx, cxx_args, '-x', 'c++', '-std=c++14', '-'],
-                                 stdin=PIPE,
-                                 stdout=PIPE,
-                                 stderr=PIPE)
-@@ -216,8 +219,8 @@ def check_linker_need_libatomic():
-         return False
-     # Double-check to see if -latomic actually can solve the problem.
-     # https://github.com/grpc/grpc/issues/22491
--    cpp_test = subprocess.Popen(cxx +
--                                ['-x', 'c++', '-std=c++14', '-', '-latomic'],
-+    cpp_test = subprocess.Popen(
-+                                [cxx, cxx_args, '-x', 'c++', '-std=c++14', '-', '-latomic'],
-                                 stdin=PIPE,
-                                 stdout=PIPE,
-                                 stderr=PIPE)
---- a/src/python/grpcio/commands.py
-+++ b/src/python/grpcio/commands.py
-@@ -228,8 +228,10 @@ class BuildExt(build_ext.build_ext):
-             """
-             try:
-                 # TODO(lidiz) Remove the generated a.out for success tests.
--                cc = os.environ.get('CC', 'cc')
--                cc_test = subprocess.Popen([cc, '-x', 'c', '-std=c++14', '-'],
-+                cc_test, cc_args = os.environ.get('CC').split(' ', 1) or 'gcc'
-+                if not cc_args:
-+                    cc_args = "-g"
-+                cc_test = subprocess.Popen([cc_test, cc_args, '-x', 'c', '-std=c++14', '-'],
-                                            stdin=subprocess.PIPE,
-                                            stdout=subprocess.PIPE,
-                                            stderr=subprocess.PIPE)
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch
index 918c6c8..a5e7670 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch
@@ -1,4 +1,4 @@
-From 4432b9a296c9c287dfe281b4d464dfd03e4eb721 Mon Sep 17 00:00:00 2001
+From 6ede7d01b18a4d9eeaccd25f5c1ab9985cb65307 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Sun, 12 Feb 2023 21:25:04 -0800
 Subject: [PATCH] zlib: Include unistd.h for open/close C APIs
@@ -6,6 +6,7 @@
 Upstream-Status: Pending
 
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
+
 ---
  third_party/zlib/gzguts.h | 1 +
  1 file changed, 1 insertion(+)
@@ -22,6 +23,3 @@
  #include "zlib.h"
  #ifdef STDC
  #  include <string.h>
--- 
-2.39.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch
index 4100cf6..4bb60b6 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/abseil-ppc-fixes.patch
@@ -1,4 +1,7 @@
-An all-in-one patch that fixes several issues:
+From 9cec6297effa9fab6f0c71e342046daceecd7d4d Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 13 Mar 2021 10:26:25 -0800
+Subject: [PATCH] An all-in-one patch that fixes several issues:
 
 1) UnscaledCycleClock not fully implemented for ppc*-musl (disabled on musl)
 2) powerpc stacktrace implementation only works on glibc (disabled on musl)
@@ -7,19 +10,21 @@
 
 Sourced from void linux
 
+Upstream-Status: Pending
 Signed-off-by: Khem Raj <raj.khem@gmail.com>
 Signed-off-by: Xu Huan <xuhuan.fnst@fujitsu.com>
----
-Upstream-Status: Pending
 
- absl/base/internal/unscaledcycleclock.cc    | 4 ++--
- absl/base/internal/unscaledcycleclock.h     | 3 ++-
- absl/debugging/internal/examine_stack.cc    | 8 +++++++-
- absl/debugging/internal/stacktrace_config.h | 2 +-
+---
+ .../abseil-cpp/absl/base/internal/unscaledcycleclock.cc   | 4 ++--
+ .../absl/base/internal/unscaledcycleclock_config.h        | 3 ++-
+ .../abseil-cpp/absl/debugging/internal/examine_stack.cc   | 8 +++++++-
+ .../absl/debugging/internal/stacktrace_config.h           | 2 +-
  4 files changed, 12 insertions(+), 5 deletions(-)
 
---- a/absl/base/internal/unscaledcycleclock.cc
-+++ b/absl/base/internal/unscaledcycleclock.cc
+diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc
+index b1c396c..d62bfd6 100644
+--- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc
++++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc
 @@ -20,7 +20,7 @@
  #include <intrin.h>
  #endif
@@ -38,8 +43,24 @@
  
  int64_t UnscaledCycleClock::Now() {
  #ifdef __GLIBC__
---- a/absl/debugging/internal/examine_stack.cc
-+++ b/absl/debugging/internal/examine_stack.cc
+diff --git a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h
+index 24b324a..5e232c1 100644
+--- a/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h
++++ b/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h
+@@ -21,7 +21,8 @@
+ 
+ // The following platforms have an implementation of a hardware counter.
+ #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
+-    defined(__powerpc__) || defined(__ppc__) || defined(__riscv) ||     \
++    ((defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)) || \
++    defined(__riscv) ||     \
+     defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC))
+ #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
+ #else
+diff --git a/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc b/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc
+index 5786322..72c7c46 100644
+--- a/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc
++++ b/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc
 @@ -33,6 +33,10 @@
  #include <csignal>
  #include <cstdio>
@@ -51,7 +72,7 @@
  #include "absl/base/attributes.h"
  #include "absl/base/internal/raw_logging.h"
  #include "absl/base/macros.h"
-@@ -174,8 +178,10 @@ void* GetProgramCounter(void* const vuc)
+@@ -174,8 +178,10 @@ void* GetProgramCounter(void* const vuc) {
      return reinterpret_cast<void*>(context->uc_mcontext.pc);
  #elif defined(__powerpc64__)
      return reinterpret_cast<void*>(context->uc_mcontext.gp_regs[32]);
@@ -63,8 +84,10 @@
  #elif defined(__riscv)
      return reinterpret_cast<void*>(context->uc_mcontext.__gregs[REG_PC]);
  #elif defined(__s390__) && !defined(__s390x__)
---- a/absl/debugging/internal/stacktrace_config.h
-+++ b/absl/debugging/internal/stacktrace_config.h
+diff --git a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
+index 3929b1b..23d5e50 100644
+--- a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
++++ b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
 @@ -60,7 +60,7 @@
  #elif defined(__i386__) || defined(__x86_64__)
  #define ABSL_STACKTRACE_INL_HEADER \
@@ -74,15 +97,3 @@
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_powerpc-inl.inc"
  #elif defined(__aarch64__)
---- a/absl/base/internal/unscaledcycleclock_config.h
-+++ b/absl/base/internal/unscaledcycleclock_config.h
-@@ -21,7 +21,8 @@
- 
- // The following platforms have an implementation of a hardware counter.
- #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
--    defined(__powerpc__) || defined(__ppc__) || defined(__riscv) ||     \
-+    ((defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)) || \
-+    defined(__riscv) ||     \
-     defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC))
- #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
- #else
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/mips_bigendian.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/mips_bigendian.patch
deleted file mode 100644
index 088ce33..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/mips_bigendian.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-Upstream-Status: Pending
-
---- a/third_party/boringssl-with-bazel/src/include/openssl/base.h
-+++ b/third_party/boringssl-with-bazel/src/include/openssl/base.h
-@@ -102,10 +102,10 @@ extern "C" {
- #elif (defined(__PPC__) || defined(__powerpc__))
- #define OPENSSL_32_BIT
- #define OPENSSL_PPC
--#elif defined(__MIPSEL__) && !defined(__LP64__)
-+#elif defined(__mips__) && !defined(__LP64__)
- #define OPENSSL_32_BIT
- #define OPENSSL_MIPS
--#elif defined(__MIPSEL__) && defined(__LP64__)
-+#elif defined(__mips__) && defined(__LP64__)
- #define OPENSSL_64_BIT
- #define OPENSSL_MIPS64
- #elif defined(__riscv) && __SIZEOF_POINTER__ == 8
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch
deleted file mode 100644
index 5dacc68..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio/ppc-boringssl-support.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-Let boringSSL compile on ppc32 bit
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-
---- a/third_party/boringssl-with-bazel/src/include/openssl/base.h
-+++ b/third_party/boringssl-with-bazel/src/include/openssl/base.h
-@@ -96,6 +96,9 @@ extern "C" {
- #elif defined(__ARMEL__) || defined(_M_ARM)
- #define OPENSSL_32_BIT
- #define OPENSSL_ARM
-+#elif (defined(__PPC__) || defined(__powerpc__))
-+#define OPENSSL_32_BIT
-+#define OPENSSL_PPC
- #elif defined(__MIPSEL__) && !defined(__LP64__)
- #define OPENSSL_32_BIT
- #define OPENSSL_MIPS
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.56.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.60.0.bb
similarity index 63%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.56.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.60.0.bb
index c34391d..77b4198 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.56.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-grpcio_1.60.0.bb
@@ -6,15 +6,11 @@
 
 DEPENDS += "${PYTHON_PN}-protobuf"
 
-SRC_URI += "file://0001-setup.py-Do-not-mix-C-and-C-compiler-options.patch"
-SRC_URI:append:class-target = " file://ppc-boringssl-support.patch \
-                                file://mips_bigendian.patch \
-                                file://0001-Include-missing-cstdint-header.patch \
-                                file://abseil-ppc-fixes.patch;patchdir=third_party/abseil-cpp \
-                                file://0001-direct_mmap-Use-off_t-on-linux.patch;patchdir=third_party/abseil-cpp \
-                                file://0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch \
-"
-SRC_URI[sha256sum] = "0ff789ae7d8ddd76d2ac02e7d13bfef6fc4928ac01e1dcaa182be51b6bcc0aaa"
+SRC_URI += "file://0001-Include-missing-cstdint-header.patch \
+           file://abseil-ppc-fixes.patch \
+           file://0001-zlib-Include-unistd.h-for-open-close-C-APIs.patch \
+           "
+SRC_URI[sha256sum] = "2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"
 
 RDEPENDS:${PN} = "${PYTHON_PN}-protobuf \
                   ${PYTHON_PN}-setuptools \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-imageio_2.33.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-imageio_2.33.1.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-imageio_2.33.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-imageio_2.33.1.bb
index f627575..32b4472 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-imageio_2.33.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-imageio_2.33.1.bb
@@ -5,7 +5,7 @@
 LICENSE = "BSD-2-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=24cb9a367a9e641b459a01c4d15256ba"
 
-SRC_URI[sha256sum] = "39999d05eb500089e60be467dd7d618f56e142229b44c3961c2b420eeb538d7e"
+SRC_URI[sha256sum] = "78722d40b137bd98f5ec7312119f8aea9ad2049f76f434748eb306b6937cc1ce"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb
index 8725150..3261d80 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython-genutils_0.2.0.bb
@@ -5,6 +5,9 @@
 
 PYPI_PACKAGE = "ipython_genutils"
 
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/ipython_genutils"
+UPSTREAM_CHECK_REGEX = "/ipython_genutils/(?P<pver>(\d+[\.\-_]*)+)"
+
 SRC_URI[md5sum] = "5a4f9781f78466da0ea1a648f3e1f79f"
 SRC_URI[sha256sum] = "eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_8.18.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_8.19.0.bb
similarity index 88%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_8.18.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_8.19.0.bb
index aaeb720..87474e4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_8.18.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ipython_8.19.0.bb
@@ -5,7 +5,7 @@
 
 PYPI_PACKAGE = "ipython"
 
-SRC_URI[sha256sum] = "4feb61210160f75e229ce932dbf8b719bff37af123c0b985fd038b14233daa16"
+SRC_URI[sha256sum] = "ac4da4ecf0042fb4e0ce57c60430c2db3c719fa8bdf92f8631d6bd8a5785d1f0"
 
 RDEPENDS:${PN} = "\
     ${PYTHON_PN}-setuptools \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.12.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb
similarity index 85%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.12.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb
index d111393..60d4418 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.12.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-isort_5.13.2.bb
@@ -4,7 +4,7 @@
 SECTION = "devel/python"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=8227180126797a0148f94f483f3e1489"
 
-SRC_URI[sha256sum] = "8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"
+SRC_URI[sha256sum] = "48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"
 
 inherit pypi python_poetry_core
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-joblib_1.3.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-joblib_1.3.2.bb
index fe1e68c..d68b40e 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-joblib_1.3.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-joblib_1.3.2.bb
@@ -8,7 +8,6 @@
 
 RDEPENDS:${PN} += " \
     python3-asyncio \
-    python3-distutils \
     python3-json \
     python3-multiprocessing \
     python3-pprint \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-kmod_0.9.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-kmod_0.9.1.bb
index 2ec4d47..52e1cf6 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-kmod_0.9.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-kmod_0.9.1.bb
@@ -6,6 +6,7 @@
 
 inherit pypi setuptools3
 
+RECIPE_NO_UPDATE_REASON = "Version 0.9.2 is broken when using latest build machinery for C extensions"
 SRC_URI[sha256sum] = "f3bf829059bf88eca22f4f549e17aa316cdaa14302bf2ba49ddeee60cea109ff"
 
 DEPENDS += " \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.9.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.9.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb
index 74c5e9b..9232a5a 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.9.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-lazy-object-proxy_1.10.0.bb
@@ -6,6 +6,6 @@
 
 DEPENDS += "${PYTHON_PN}-setuptools-scm-native ${PYTHON_PN}-pip-native"
 
-SRC_URI[sha256sum] = "659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"
+SRC_URI[sha256sum] = "78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"
 
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb
index a55ded3..062a63a 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-m2crypto_0.40.1.bb
@@ -19,12 +19,11 @@
 DEPENDS += "openssl swig-native"
 RDEPENDS:${PN} += "\
   ${PYTHON_PN}-datetime \
-  ${PYTHON_PN}-distutils \
+  ${PYTHON_PN}-setuptools \
   ${PYTHON_PN}-logging \
   ${PYTHON_PN}-netclient \
   ${PYTHON_PN}-netserver \
   ${PYTHON_PN}-numbers \
-  ${PYTHON_PN}-smtpd \
   ${PYTHON_PN}-xmlrpc \
 "
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb
index 1be3fa5..7ebf9f1 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-meld3_2.0.1.bb
@@ -15,6 +15,5 @@
 
 RDEPENDS:${PN} += " \
     python3-cgitb \
-    python3-smtpd \
     python3-xml \
 "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_1.7.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_1.8.0.bb
similarity index 86%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_1.7.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_1.8.0.bb
index 90301f3..2e6c7cc 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_1.7.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-mypy_1.8.0.bb
@@ -5,7 +5,7 @@
 
 inherit pypi python_setuptools_build_meta
 
-SRC_URI[sha256sum] = "fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2"
+SRC_URI[sha256sum] = "6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"
 
 BBCLASSEXTEND = "native"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch
index 276fb50..b7d191e 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja/no-scikit-build.patch
@@ -8,11 +8,11 @@
 index b895c20..577b642 100644
 --- a/pyproject.toml
 +++ b/pyproject.toml
-@@ -1,7 +1,6 @@
- [build-system]
+@@ -2,7 +2,6 @@
  requires = [
-     "setuptools>=42",
--    "scikit-build>=0.12",
+     "setuptools >=42",
+     "setuptools-scm[toml]",
+-    "scikit-build",
  ]
  build-backend = "setuptools.build_meta"
  
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja_1.11.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja_1.11.1.1.bb
similarity index 79%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-ninja_1.11.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-ninja_1.11.1.1.bb
index 3b9077f..a9e0ed2 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja_1.11.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ninja_1.11.1.1.bb
@@ -6,11 +6,13 @@
 PYPI_ARCHIVE_NAME_PREFIX = "pypi-"
 
 inherit pypi python_setuptools_build_meta
-SRC_URI[sha256sum] = "c833a47d39b2d1eee3f9ca886fa1581efd5be6068b82734ac229961ee8748f90"
+SRC_URI[sha256sum] = "9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c"
 
 SRC_URI += "file://no-scikit-build.patch \
             file://run-ninja-from-path.patch"
 
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
 do_install:append () {
 	rm -rf ${D}${bindir}
 }
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-olefile_0.46.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-olefile_0.47.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-olefile_0.46.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-olefile_0.47.bb
index e29f30f..2db0ada 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-olefile_0.46.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-olefile_0.47.bb
@@ -1,9 +1,9 @@
 SUMMARY = "Python package to parse, read and write Microsoft OLE2 files"
 HOMEPAGE = "https://github.com/decalage2/olefile"
 LICENSE = "BSD-2-Clause"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e21a06208415d5eb2001555d37851362"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=f18814bd70fd28e11a4545145dcb3822"
 
-SRC_URI[sha256sum] = "133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964"
+SRC_URI[sha256sum] = "599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-paramiko_3.3.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-paramiko_3.3.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb
index da87e51..0d32d36 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-paramiko_3.3.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-paramiko_3.4.0.bb
@@ -3,7 +3,7 @@
 LICENSE = "LGPL-2.1-only"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=fd0120fc2e9f841c73ac707a30389af5"
 
-SRC_URI[sha256sum] = "6a3777a961ac86dbef375c5f5b8d50014a1a96d0fd7f054a43bc880134b0ff77"
+SRC_URI[sha256sum] = "aac08f26a31dc4dffd92821527d1682d99d52f9ef6851968114a8728f3c274d3"
 
 PYPI_PACKAGE = "paramiko"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-parse_1.19.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-parse_1.19.1.bb
deleted file mode 100644
index 9dc7f79..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-parse_1.19.1.bb
+++ /dev/null
@@ -1,31 +0,0 @@
-SUMMARY = "Parse strings using a specification based on the Python format() syntax"
-HOMEPAGE = "https://github.com/r1chardj0n3s/parse"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=8ab458ad281b60e6f1b39b3feafbfc05"
-
-SRC_URI[sha256sum] = "cc3a47236ff05da377617ddefa867b7ba983819c664e1afe46249e5b469be464"
-
-SRC_URI += " \
-    git://github.com/r1chardj0n3s/parse.git;branch=master;protocol=https \
-    file://run-ptest \
-"
-
-SRCREV ?= "72776522285d516032faa0f80c4ee6a8964075e8"
-
-S = "${WORKDIR}/git"
-
-inherit python_setuptools_build_meta ptest
-
-RDEPENDS:${PN} += "\
-    python3-datetime \
-    python3-logging \
-    python3-numbers \
-"
-
-RDEPENDS:${PN}-ptest += " \
-    python3-pytest \
-"
-
-do_install_ptest() {
-    cp -f ${S}/test_parse.py ${D}${PTEST_PATH}/
-}
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-parse_1.20.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-parse_1.20.0.bb
new file mode 100644
index 0000000..3ca6fbb
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-parse_1.20.0.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Parse strings using a specification based on the Python format() syntax"
+HOMEPAGE = "https://github.com/r1chardj0n3s/parse"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8ab458ad281b60e6f1b39b3feafbfc05"
+
+SRC_URI[sha256sum] = "bd28bae37714b45d5894d77160a16e2be36b64a3b618c81168b3684676aa498b"
+
+SRC_URI += " \
+    file://run-ptest \
+"
+
+inherit pypi python_setuptools_build_meta ptest
+
+RDEPENDS:${PN} += "\
+    python3-datetime \
+    python3-logging \
+    python3-numbers \
+"
+
+RDEPENDS:${PN}-ptest += " \
+    python3-pytest \
+"
+
+do_install_ptest() {
+    cp -f ${S}/tests/test*.py ${D}${PTEST_PATH}/
+}
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-path_16.7.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-path_16.9.0.bb
similarity index 88%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-path_16.7.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-path_16.9.0.bb
index d9576ed..19bf11b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-path_16.7.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-path_16.9.0.bb
@@ -2,7 +2,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=141643e11c48898150daa83802dbc65f"
 
-SRC_URI[sha256sum] = "2b477f5887033f3cbea1cfd8553ee6a6a498eb2540a19f4aa082822aadcea30a"
+SRC_URI[sha256sum] = "dfd31c2af60e8889a13538bef302ade7adacdb5351836be22638e2349ddd5d7b"
 
 SRC_URI += "\
     file://run-ptest \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.7.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb
index 679ecb0..f1f5072 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.7.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm-backend_2.1.8.bb
@@ -4,7 +4,7 @@
 SECTION = "devel/python"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=4a564297b3c5b629a528b92fd8ff61ea"
 
-SRC_URI[sha256sum] = "d3b50ab6374557c1edc348135e0da5decef228ddf8c973a58e40f437cf3595ba"
+SRC_URI[sha256sum] = "2487dfbd13f69d80fb4e6a08006a3ee68272833970813047dc5fcfacdfdc0151"
 
 inherit pypi python_setuptools_build_meta
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm_2.10.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm_2.11.1.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pdm_2.10.4.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pdm_2.11.1.bb
index fffefb3..5ff6ffc 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm_2.10.4.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pdm_2.11.1.bb
@@ -4,7 +4,7 @@
 SECTION = "devel/python"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=2eb31a2cc1a758c34b499f287dd04ef2"
 
-SRC_URI[sha256sum] = "6dfd9d4cb59043edecb2d0b47d208e55d89d333ba7197deb05cca2dfbc7a4bfb"
+SRC_URI[sha256sum] = "b10bc4e5394856f1639ddc9bc754d9c26323ec5b828a135c6ed35f935b054b83"
 
 inherit pypi python_setuptools_build_meta
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_10.1.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_10.1.0.bb
index 322c90e..f895b1d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_10.1.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pillow_10.1.0.bb
@@ -39,7 +39,6 @@
     jpeg-tools \
     libwebp \
     ${PYTHON_PN}-core \
-    ${PYTHON_PN}-distutils \
     ${PYTHON_PN}-image \
     ${PYTHON_PN}-mmap \
     ${PYTHON_PN}-pytest \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.22.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.23.bb
similarity index 88%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.22.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.23.bb
index 0eed33f..82709ea 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.22.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pint_0.23.bb
@@ -10,7 +10,7 @@
 
 inherit pypi ptest python_setuptools_build_meta
 
-SRC_URI[sha256sum] = "2d139f6abbcf3016cad7d3cec05707fe908ac4f99cf59aedfd6ee667b7a64433"
+SRC_URI[sha256sum] = "e1509b91606dbc52527c600a4ef74ffac12fff70688aff20e9072409346ec9b4"
 
 DEPENDS += "python3-setuptools-scm-native"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-platformdirs_4.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-platformdirs_4.1.0.bb
similarity index 88%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-platformdirs_4.0.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-platformdirs_4.1.0.bb
index 5a33be4..b4fb935 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-platformdirs_4.0.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-platformdirs_4.1.0.bb
@@ -7,7 +7,7 @@
     file://run-ptest \
 "
 
-SRC_URI[sha256sum] = "cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"
+SRC_URI[sha256sum] = "906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"
 
 inherit pypi python_hatchling ptest
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-portion_2.4.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-portion_2.4.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb
index a340ba7..b4bbfc6 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-portion_2.4.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-portion_2.4.2.bb
@@ -7,7 +7,7 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "9dcbf1808898f440aed304a5e9f0742a2859eca3b0ac7f1f58e50502852a8ef9"
+SRC_URI[sha256sum] = "5289b40d98959b16b3f6927781678935d3df1b7c14947f5d7778e5e04dd9a065"
 
 RDEPENDS:${PN} = "\
     ${PYTHON_PN}-sortedcontainers \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.41.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb
similarity index 87%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.41.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb
index aa19116..9f7802b 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.41.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-prompt-toolkit_3.0.43.bb
@@ -3,7 +3,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b2cde7da89f0c1f3e49bf968d00d554f"
 
-SRC_URI[sha256sum] = "941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"
+SRC_URI[sha256sum] = "3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf/0001-message.c-Cast-uintptr_t-types-to-upb_MessageDef.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf/0001-message.c-Cast-uintptr_t-types-to-upb_MessageDef.patch
deleted file mode 100644
index 89315e3..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf/0001-message.c-Cast-uintptr_t-types-to-upb_MessageDef.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 8ce4b50b210d3c0f8de40156d4ba7827bfe16b21 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Wed, 16 Aug 2023 17:36:19 -0700
-Subject: [PATCH] message.c: Cast uintptr_t types to upb_MessageDef
-
-This fixes build with clang
-
-python/message.c:1238:49: error: incompatible integer to pointer conversion passing 'uintptr_t' (aka 'unsigned long') to parameter of type 'const upb_MessageDef *' (aka 'const struct upb_MessageDef *') [-Wint-conversion]
- 1238 |                        upb_MessageDef_MiniTable(other->def),
-      |                                                 ^~~~~~~~~~
-/mnt/b/yoe/master/build/tmp/work/cortexa72-cortexa53-crypto-yoe-linux/python3-protobuf/4.24.0/protobuf-4.24.0/upb/reflection/message_def.h:138:69: note: passing argument to parameter 'm' here
-  138 | const upb_MiniTable* upb_MessageDef_MiniTable(const upb_MessageDef* m);
-      |                                                                     ^
-python/message.c:1609:69: error: incompatible integer to pointer conversion passing 'uintptr_t' (aka 'unsigned long') to parameter of type 'const upb_MessageDef *' (aka 'const struct upb_MessageDef *') [-Wint-conversion]
- 1609 |       upb_Message_DeepClone(self->ptr.msg, upb_MessageDef_MiniTable(self->def),
-      |                                                                     ^~~~~~~~~
-/mnt/b/yoe/master/build/tmp/work/cortexa72-cortexa53-crypto-yoe-linux/python3-protobuf/4.24.0/protobuf-4.24.0/upb/reflection/message_def.h:138:69: note: passing argument to parameter 'm' here
-  138 | const upb_MiniTable* upb_MessageDef_MiniTable(const upb_MessageDef* m);
-      |                                                                     ^
-python/message.c:1611:44: error: incompatible integer to pointer conversion passing 'uintptr_t' (aka 'unsigned long') to parameter of type 'const upb_MessageDef *' (aka 'const struct upb_MessageDef *') [-Wint-conversion]
- 1611 |   PyObject* ret = PyUpb_Message_Get(clone, self->def, arena);
-      |                                            ^~~~~~~~~
-
-Upstream-Status: Submitted [https://github.com/protocolbuffers/upb/pull/1492]
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- python/message.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/python/message.c b/python/message.c
-index a01ce16..c418b84 100644
---- a/python/message.c
-+++ b/python/message.c
-@@ -1235,7 +1235,7 @@ static PyObject* PyUpb_Message_CopyFrom(PyObject* _self, PyObject* arg) {
-   Py_DECREF(tmp);
- 
-   upb_Message_DeepCopy(self->ptr.msg, other->ptr.msg,
--                       upb_MessageDef_MiniTable(other->def),
-+                       upb_MessageDef_MiniTable((const upb_MessageDef*)other->def),
-                        PyUpb_Arena_Get(self->arena));
-   PyUpb_Message_SyncSubobjs(self);
- 
-@@ -1606,9 +1606,9 @@ PyObject* DeepCopy(PyObject* _self, PyObject* arg) {
- 
-   PyObject* arena = PyUpb_Arena_New();
-   upb_Message* clone =
--      upb_Message_DeepClone(self->ptr.msg, upb_MessageDef_MiniTable(self->def),
-+      upb_Message_DeepClone(self->ptr.msg, upb_MessageDef_MiniTable((const upb_MessageDef*)self->def),
-                             PyUpb_Arena_Get(arena));
--  PyObject* ret = PyUpb_Message_Get(clone, self->def, arena);
-+  PyObject* ret = PyUpb_Message_Get(clone, (const upb_MessageDef*)self->def, arena);
-   Py_DECREF(arena);
- 
-   return ret;
--- 
-2.41.0
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_4.24.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_4.25.1.bb
similarity index 85%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_4.24.4.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_4.25.1.bb
index 4b530c3..3c770e4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_4.24.4.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-protobuf_4.25.1.bb
@@ -6,8 +6,7 @@
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=53dbfa56f61b90215a9f8f0d527c043d"
 
 inherit pypi setuptools3
-SRC_URI += "file://0001-message.c-Cast-uintptr_t-types-to-upb_MessageDef.patch"
-SRC_URI[sha256sum] = "5a70731910cd9104762161719c3d883c960151eea077134458503723b60e3667"
+SRC_URI[sha256sum] = "57d65074b4f5baa4ab5da1605c02be90ac20c8b40fb137d6a8df9f416b0d0ce2"
 
 # http://errors.yoctoproject.org/Errors/Details/184715/
 # Can't find required file: ../src/google/protobuf/descriptor.proto
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc
new file mode 100644
index 0000000..932cfc8
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core-crates.inc
@@ -0,0 +1,166 @@
+# Autogenerated with 'bitbake -c update_crates python3-pydantic-core'
+
+# from Cargo.lock
+SRC_URI += " \
+    crate://crates.io/ahash/0.8.6 \
+    crate://crates.io/aho-corasick/1.0.2 \
+    crate://crates.io/autocfg/1.1.0 \
+    crate://crates.io/base64/0.21.5 \
+    crate://crates.io/bitflags/1.3.2 \
+    crate://crates.io/cc/1.0.79 \
+    crate://crates.io/cfg-if/1.0.0 \
+    crate://crates.io/enum_dispatch/0.3.12 \
+    crate://crates.io/equivalent/1.0.1 \
+    crate://crates.io/form_urlencoded/1.2.0 \
+    crate://crates.io/getrandom/0.2.10 \
+    crate://crates.io/hashbrown/0.14.0 \
+    crate://crates.io/heck/0.4.1 \
+    crate://crates.io/idna/0.4.0 \
+    crate://crates.io/indexmap/2.0.0 \
+    crate://crates.io/indoc/2.0.4 \
+    crate://crates.io/itoa/1.0.8 \
+    crate://crates.io/jiter/0.0.4 \
+    crate://crates.io/lexical-core/0.8.5 \
+    crate://crates.io/lexical-parse-float/0.8.5 \
+    crate://crates.io/lexical-parse-integer/0.8.6 \
+    crate://crates.io/lexical-util/0.8.5 \
+    crate://crates.io/lexical-write-float/0.8.5 \
+    crate://crates.io/lexical-write-integer/0.8.5 \
+    crate://crates.io/libc/0.2.147 \
+    crate://crates.io/lock_api/0.4.10 \
+    crate://crates.io/memchr/2.6.3 \
+    crate://crates.io/memoffset/0.9.0 \
+    crate://crates.io/num-bigint/0.4.4 \
+    crate://crates.io/num-integer/0.1.45 \
+    crate://crates.io/num-traits/0.2.16 \
+    crate://crates.io/once_cell/1.18.0 \
+    crate://crates.io/parking_lot/0.12.1 \
+    crate://crates.io/parking_lot_core/0.9.8 \
+    crate://crates.io/percent-encoding/2.3.0 \
+    crate://crates.io/proc-macro2/1.0.69 \
+    crate://crates.io/pyo3/0.20.0 \
+    crate://crates.io/pyo3-build-config/0.20.0 \
+    crate://crates.io/pyo3-ffi/0.20.0 \
+    crate://crates.io/pyo3-macros/0.20.0 \
+    crate://crates.io/pyo3-macros-backend/0.20.0 \
+    crate://crates.io/python3-dll-a/0.2.9 \
+    crate://crates.io/quote/1.0.29 \
+    crate://crates.io/redox_syscall/0.3.5 \
+    crate://crates.io/regex/1.10.2 \
+    crate://crates.io/regex-automata/0.4.3 \
+    crate://crates.io/regex-syntax/0.8.2 \
+    crate://crates.io/rustversion/1.0.13 \
+    crate://crates.io/ryu/1.0.14 \
+    crate://crates.io/scopeguard/1.1.0 \
+    crate://crates.io/serde/1.0.190 \
+    crate://crates.io/serde_derive/1.0.190 \
+    crate://crates.io/serde_json/1.0.108 \
+    crate://crates.io/smallvec/1.11.1 \
+    crate://crates.io/speedate/0.13.0 \
+    crate://crates.io/static_assertions/1.1.0 \
+    crate://crates.io/strum/0.25.0 \
+    crate://crates.io/strum_macros/0.25.3 \
+    crate://crates.io/syn/2.0.38 \
+    crate://crates.io/target-lexicon/0.12.9 \
+    crate://crates.io/tinyvec/1.6.0 \
+    crate://crates.io/tinyvec_macros/0.1.1 \
+    crate://crates.io/unicode-bidi/0.3.13 \
+    crate://crates.io/unicode-ident/1.0.10 \
+    crate://crates.io/unicode-normalization/0.1.22 \
+    crate://crates.io/unindent/0.2.3 \
+    crate://crates.io/url/2.4.1 \
+    crate://crates.io/uuid/1.5.0 \
+    crate://crates.io/version_check/0.9.4 \
+    crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \
+    crate://crates.io/windows-targets/0.48.1 \
+    crate://crates.io/windows_aarch64_gnullvm/0.48.0 \
+    crate://crates.io/windows_aarch64_msvc/0.48.0 \
+    crate://crates.io/windows_i686_gnu/0.48.0 \
+    crate://crates.io/windows_i686_msvc/0.48.0 \
+    crate://crates.io/windows_x86_64_gnu/0.48.0 \
+    crate://crates.io/windows_x86_64_gnullvm/0.48.0 \
+    crate://crates.io/windows_x86_64_msvc/0.48.0 \
+    crate://crates.io/zerocopy/0.7.20 \
+    crate://crates.io/zerocopy-derive/0.7.20 \
+"
+
+SRC_URI[ahash-0.8.6.sha256sum] = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
+SRC_URI[aho-corasick-1.0.2.sha256sum] = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+SRC_URI[base64-0.21.5.sha256sum] = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
+SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+SRC_URI[cc-1.0.79.sha256sum] = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+SRC_URI[enum_dispatch-0.3.12.sha256sum] = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e"
+SRC_URI[equivalent-1.0.1.sha256sum] = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+SRC_URI[form_urlencoded-1.2.0.sha256sum] = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+SRC_URI[getrandom-0.2.10.sha256sum] = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+SRC_URI[hashbrown-0.14.0.sha256sum] = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+SRC_URI[heck-0.4.1.sha256sum] = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+SRC_URI[idna-0.4.0.sha256sum] = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+SRC_URI[indexmap-2.0.0.sha256sum] = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+SRC_URI[indoc-2.0.4.sha256sum] = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+SRC_URI[itoa-1.0.8.sha256sum] = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a"
+SRC_URI[jiter-0.0.4.sha256sum] = "b27d419c535bf7b50ad355278b1159cbf0cc8d507ea003d625b17bf0375720b8"
+SRC_URI[lexical-core-0.8.5.sha256sum] = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46"
+SRC_URI[lexical-parse-float-0.8.5.sha256sum] = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f"
+SRC_URI[lexical-parse-integer-0.8.6.sha256sum] = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9"
+SRC_URI[lexical-util-0.8.5.sha256sum] = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc"
+SRC_URI[lexical-write-float-0.8.5.sha256sum] = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862"
+SRC_URI[lexical-write-integer-0.8.5.sha256sum] = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446"
+SRC_URI[libc-0.2.147.sha256sum] = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+SRC_URI[lock_api-0.4.10.sha256sum] = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+SRC_URI[memchr-2.6.3.sha256sum] = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+SRC_URI[memoffset-0.9.0.sha256sum] = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+SRC_URI[num-bigint-0.4.4.sha256sum] = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+SRC_URI[num-integer-0.1.45.sha256sum] = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+SRC_URI[num-traits-0.2.16.sha256sum] = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+SRC_URI[once_cell-1.18.0.sha256sum] = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+SRC_URI[parking_lot-0.12.1.sha256sum] = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+SRC_URI[parking_lot_core-0.9.8.sha256sum] = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+SRC_URI[percent-encoding-2.3.0.sha256sum] = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+SRC_URI[proc-macro2-1.0.69.sha256sum] = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+SRC_URI[pyo3-0.20.0.sha256sum] = "04e8453b658fe480c3e70c8ed4e3d3ec33eb74988bd186561b0cc66b85c3bc4b"
+SRC_URI[pyo3-build-config-0.20.0.sha256sum] = "a96fe70b176a89cff78f2fa7b3c930081e163d5379b4dcdf993e3ae29ca662e5"
+SRC_URI[pyo3-ffi-0.20.0.sha256sum] = "214929900fd25e6604661ed9cf349727c8920d47deff196c4e28165a6ef2a96b"
+SRC_URI[pyo3-macros-0.20.0.sha256sum] = "dac53072f717aa1bfa4db832b39de8c875b7c7af4f4a6fe93cdbf9264cf8383b"
+SRC_URI[pyo3-macros-backend-0.20.0.sha256sum] = "7774b5a8282bd4f25f803b1f0d945120be959a36c72e08e7cd031c792fdfd424"
+SRC_URI[python3-dll-a-0.2.9.sha256sum] = "d5f07cd4412be8fa09a721d40007c483981bbe072cd6a21f2e83e04ec8f8343f"
+SRC_URI[quote-1.0.29.sha256sum] = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105"
+SRC_URI[redox_syscall-0.3.5.sha256sum] = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+SRC_URI[regex-1.10.2.sha256sum] = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+SRC_URI[regex-automata-0.4.3.sha256sum] = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+SRC_URI[regex-syntax-0.8.2.sha256sum] = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+SRC_URI[rustversion-1.0.13.sha256sum] = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f"
+SRC_URI[ryu-1.0.14.sha256sum] = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9"
+SRC_URI[scopeguard-1.1.0.sha256sum] = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+SRC_URI[serde-1.0.190.sha256sum] = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7"
+SRC_URI[serde_derive-1.0.190.sha256sum] = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3"
+SRC_URI[serde_json-1.0.108.sha256sum] = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
+SRC_URI[smallvec-1.11.1.sha256sum] = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+SRC_URI[speedate-0.13.0.sha256sum] = "242f76c50fd18cbf098607090ade73a08d39cfd84ea835f3796a2c855223b19b"
+SRC_URI[static_assertions-1.1.0.sha256sum] = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+SRC_URI[strum-0.25.0.sha256sum] = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
+SRC_URI[strum_macros-0.25.3.sha256sum] = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
+SRC_URI[syn-2.0.38.sha256sum] = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+SRC_URI[target-lexicon-0.12.9.sha256sum] = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0"
+SRC_URI[tinyvec-1.6.0.sha256sum] = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+SRC_URI[tinyvec_macros-0.1.1.sha256sum] = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+SRC_URI[unicode-bidi-0.3.13.sha256sum] = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+SRC_URI[unicode-ident-1.0.10.sha256sum] = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73"
+SRC_URI[unicode-normalization-0.1.22.sha256sum] = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+SRC_URI[unindent-0.2.3.sha256sum] = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
+SRC_URI[url-2.4.1.sha256sum] = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+SRC_URI[uuid-1.5.0.sha256sum] = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc"
+SRC_URI[version_check-0.9.4.sha256sum] = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+SRC_URI[windows-targets-0.48.1.sha256sum] = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+SRC_URI[windows_aarch64_gnullvm-0.48.0.sha256sum] = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+SRC_URI[windows_aarch64_msvc-0.48.0.sha256sum] = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+SRC_URI[windows_i686_gnu-0.48.0.sha256sum] = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+SRC_URI[windows_i686_msvc-0.48.0.sha256sum] = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+SRC_URI[windows_x86_64_gnu-0.48.0.sha256sum] = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+SRC_URI[windows_x86_64_gnullvm-0.48.0.sha256sum] = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+SRC_URI[windows_x86_64_msvc-0.48.0.sha256sum] = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+SRC_URI[zerocopy-0.7.20.sha256sum] = "dd66a62464e3ffd4e37bd09950c2b9dd6c4f8767380fabba0d523f9a775bc85a"
+SRC_URI[zerocopy-derive-0.7.20.sha256sum] = "255c4596d41e6916ced49cfafea18727b24d67878fa180ddfd69b9df34fd1726"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest
new file mode 100644
index 0000000..8d2017d
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core_2.14.5.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core_2.14.5.bb
new file mode 100644
index 0000000..01f180c
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic-core_2.14.5.bb
@@ -0,0 +1,40 @@
+SUMMARY = "Provides the core functionality for pydantic validation and serialization."
+DESCRIPTION = "This package provides the core functionality for \
+pydantic validation and serialization.\
+\
+Pydantic-core is currently around 17x faster than pydantic V1."
+HOMEPAGE = "https://github.com/pydantic/pydantic-core"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ab599c188b4a314d2856b3a55030c75c"
+
+SRC_URI[sha256sum] = "6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71"
+
+DEPENDS = "python3-maturin-native python3-typing-extensions"
+
+require ${BPN}-crates.inc
+
+inherit pypi cargo-update-recipe-crates python_maturin
+
+S = "${WORKDIR}/pydantic_core-${PV}"
+
+PYPI_ARCHIVE_NAME = "pydantic_core-${PV}.${PYPI_PACKAGE_EXT}"
+
+RDEPENDS:${PN} += "python3-typing-extensions"
+
+INSANE_SKIP:${PN} = "already-stripped"
+
+inherit ptest
+SRC_URI += "file://run-ptest"
+RDEPENDS:${PN}-ptest += "\
+    python3-dirty-equals \
+    python3-hypothesis \
+    python3-pytest \
+    python3-pytest-mock \
+    python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+    cp -rf ${S}/tests/ ${D}${PTEST_PATH}/
+    rm -rf ${D}${PTEST_PATH}/tests/benchmarks
+}
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic/run-ptest
new file mode 100644
index 0000000..8d2017d
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+pytest --automake
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic_2.5.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic_2.5.2.bb
deleted file mode 100644
index 3750d49..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic_2.5.2.bb
+++ /dev/null
@@ -1,23 +0,0 @@
-SUMMARY = "Data validation and settings management using Python type hinting"
-HOMEPAGE = "https://github.com/samuelcolvin/pydantic"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=09280955509d1c4ca14bae02f21d49a6"
-
-inherit pypi python_hatchling
-
-SRC_URI[sha256sum] = "ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd"
-
-DEPENDS += "python3-hatch-fancy-pypi-readme-native"
-
-RDEPENDS:${PN} += "\
-    python3-core \
-    python3-datetime \
-    python3-image \
-    python3-io \
-    python3-json \
-    python3-logging \
-    python3-netclient \
-    python3-numbers \
-    python3-profile \
-    python3-typing-extensions \
-"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic_2.5.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic_2.5.3.bb
new file mode 100644
index 0000000..21341d2
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pydantic_2.5.3.bb
@@ -0,0 +1,53 @@
+SUMMARY = "Data validation using Python type hinting"
+DESCRIPTION = "Data validation and settings management using Python \
+type hints.\
+\
+Fast and extensible, Pydantic plays nicely with your linters/IDE/brain. \
+Define how data should be in pure, canonical Python 3.7+; validate it with \
+Pydantic."
+HOMEPAGE = "https://github.com/samuelcolvin/pydantic"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=09280955509d1c4ca14bae02f21d49a6"
+
+inherit pypi python_hatchling
+
+SRC_URI[sha256sum] = "b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a"
+
+DEPENDS += "python3-hatch-fancy-pypi-readme-native"
+
+RDEPENDS:${PN} += "\
+    python3-annotated-types \
+    python3-core \
+    python3-datetime \
+    python3-image \
+    python3-io \
+    python3-json \
+    python3-logging \
+    python3-netclient \
+    python3-numbers \
+    python3-profile \
+    python3-pydantic-core \
+    python3-typing-extensions \
+"
+
+inherit ptest
+SRC_URI += "file://run-ptest"
+RDEPENDS:${PN}-ptest += "\
+    python3-cloudpickle \
+    python3-dirty-equals \
+    python3-pytest \
+    python3-pytest-mock \
+    python3-unittest-automake-output \
+"
+
+do_install_ptest() {
+    cp -rf ${S}/tests/ ${D}${PTEST_PATH}/
+    # Requires 'ruff' (python3-ruff) which we cannot build
+    # until we have Rust 1.71+ in oe-core
+    rm -f ${D}${PTEST_PATH}/tests/test_docs.py
+    # We are not trying to support mypy
+    rm -f ${D}${PTEST_PATH}/tests/test_mypy.py
+    # We are not trying to run benchmarks
+    rm -rf ${D}${PTEST_PATH}/tests/benchmarks
+}
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch
index 2fa3cb0..4c279bb 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify/0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch
@@ -1,19 +1,20 @@
-From 9e7894b97ae7afe43a9901b774de5aef401549ac Mon Sep 17 00:00:00 2001
+From 87f1bf7d1e0ca2a841706d1c41d14382f11264db Mon Sep 17 00:00:00 2001
 From: Bartosz Golaszewski <brgl@bgdev.pl>
 Date: Thu, 28 Apr 2022 16:32:06 +0200
 Subject: [PATCH] ext: define FNM_EXTMATCH if not already defined
 
 On musl this constant is not defined. Define it locally if not present.
 
-Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
----
 Upstream-Status: Inappropriate
 
+Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
+
+---
  src/ext.c | 3 +++
  1 file changed, 3 insertions(+)
 
 diff --git a/src/ext.c b/src/ext.c
-index e0bbe21..7d979d3 100644
+index fb33de1..fa01a81 100644
 --- a/src/ext.c
 +++ b/src/ext.c
 @@ -19,6 +19,9 @@
@@ -24,8 +25,5 @@
 +#define FNM_EXTMATCH 0
 +#endif
  
- PyDoc_STRVAR(ext__doc__,
- "Wrapper for fanotify.\n"
--- 
-2.34.1
-
+ #define FUNUSED __attribute__((unused))
+ 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb
index c9fd071..292ceab 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyfanotify_0.2.2.bb
@@ -5,7 +5,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=636a36c9df04efcfacf839b8866d9a37"
 
 SRC_URI += "file://0001-ext-define-FNM_EXTMATCH-if-not-already-defined.patch"
-SRC_URI[sha256sum] = "fd62dccdf3c17ca117e3279f0cbc65c639e53c9dec8a459d44ed6a35c1a18e60"
+SRC_URI[sha256sum] = "90219aa9f8b78fa732f24aa7b21c7bb6ac97a6eb47f1763c899b8194e23af1df"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pylint_3.0.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pylint_3.0.3.bb
similarity index 96%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pylint_3.0.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pylint_3.0.3.bb
index 8af74b7..09ab1f2 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pylint_3.0.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pylint_3.0.3.bb
@@ -6,7 +6,7 @@
 SRC_URI += "git://github.com/pylint-dev/pylint;branch=maintenance/3.0.x;protocol=https \
            file://run-ptest \
            "
-SRCREV = "efee9618894795cc8847727108522aa79431ee25"
+SRCREV = "1a5ffc1f447b77071ffe18a9c6836c09147ee2ed"
 
 inherit python_setuptools_build_meta ptest
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.179.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.182.bb
similarity index 76%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.179.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.182.bb
index 69c7742..12bf624 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.179.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pymisp_2.4.182.bb
@@ -3,11 +3,9 @@
 LICENSE = "BSD-2-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=a3639cf5780f71b125d3e9d1dc127c20"
 
-SRC_URI = "git://github.com/MISP/PyMISP.git;protocol=https;branch=main"
-SRCREV = "cc6391233c01362a1b4b483c4ea8e67f306e3459"
-S = "${WORKDIR}/git"
+SRC_URI[sha256sum] = "888e848494e04148c8ff5887f04154a2b40f3065c53d93f9cec65f7ca7171362"
 
-inherit python_poetry_core
+inherit python_poetry_core pypi
 
 PIP_INSTALL_PACKAGE = "pymisp"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pymongo_4.6.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb
similarity index 90%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pymongo_4.6.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb
index 18e29a1..2704637 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pymongo_4.6.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pymongo_4.6.1.bb
@@ -8,7 +8,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
 
-SRC_URI[sha256sum] = "fb1c56d891f9e34303c451998ef62ba52659648bb0d75b03c5e4ac223a3342c2"
+SRC_URI[sha256sum] = "31dab1f3e1d0cdd57e8df01b645f52d43cc1b653ed3afd535d2891f4fc4f9712"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyroute2_0.7.9.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb
similarity index 90%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pyroute2_0.7.9.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb
index baf3cf8..6b340a1 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyroute2_0.7.9.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyroute2_0.7.10.bb
@@ -4,13 +4,12 @@
                     file://LICENSE.GPL-2.0-or-later;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
                     file://LICENSE.Apache-2.0;md5=34281e312165f843a2b7d1f114fe65ce"
 
-SRC_URI[sha256sum] = "b69d82f140b0774317d7ba40f6c5fa1d755098ba3f3eb619982d16e750dc631a"
+SRC_URI[sha256sum] = "cc2f90aad1517cb0b301041f678cc8d3c3427c26e53f15c78c93c67928d89a02"
 
 inherit setuptools3 pypi ptest
 
 RDEPENDS:${PN} += " \
     python3-ctypes \
-    python3-distutils \
     python3-io \
     python3-json \
     python3-fcntl \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.22.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.2.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.22.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.2.bb
index 8fa77ac..a00778c 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.22.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-asyncio_0.23.2.bb
@@ -3,7 +3,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=136e4f49dbf29942c572a3a8f6e88a77"
 
-SRC_URI[sha256sum] = "01da1bf94ff0b969cc8d760104f7c1011903d0d658bdaef0bbae769660a7fbc4"
+SRC_URI[sha256sum] = "c16052382554c7b22d48782ab3438d5b10f8cf7a4bdcae7f0f67f097d95beecc"
 
 inherit pypi python_setuptools_build_meta
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-html_3.2.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-html_3.2.0.bb
deleted file mode 100644
index 713a84b..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-html_3.2.0.bb
+++ /dev/null
@@ -1,19 +0,0 @@
-DESCRIPTION = "pytest plugin for generating html reports from test results"
-DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
-
-LICENSE = "MPL-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=5d425c8f3157dbf212db2ec53d9e5132"
-
-SRC_URI[sha256sum] = "c4e2f4bb0bffc437f51ad2174a8a3e71df81bbc2f6894604e604af18fbe687c3"
-
-PYPI_PACKAGE = "pytest-html"
-
-inherit pypi python_setuptools_build_meta
-
-DEPENDS += "python3-setuptools-scm-git-archive-native"
-
-RDEPENDS:${PN} += " \
-    ${PYTHON_PN}-pytest \
-"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb
new file mode 100644
index 0000000..b9023df
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pytest-html_4.1.1.bb
@@ -0,0 +1,21 @@
+DESCRIPTION = "pytest plugin for generating html reports from test results"
+DEPENDS += "${PYTHON_PN}-setuptools-scm-native"
+
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5d425c8f3157dbf212db2ec53d9e5132"
+
+SRC_URI[sha256sum] = "70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07"
+
+PYPI_PACKAGE = "pytest_html"
+
+inherit pypi python_hatchling
+
+DEPENDS += "\
+    ${PYTHON_PN}-hatch-vcs-native \
+"
+
+RDEPENDS:${PN} += " \
+    ${PYTHON_PN}-pytest \
+"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyzmq_25.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb
similarity index 94%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pyzmq_25.1.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb
index 504ef7a..658dbe6 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyzmq_25.1.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-pyzmq_25.1.2.bb
@@ -13,7 +13,7 @@
     file://club-rpath-out.patch \
     file://run-ptest \
 "
-SRC_URI[sha256sum] = "259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"
+SRC_URI[sha256sum] = "93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"
 
 inherit pypi pkgconfig python_setuptools_build_meta ptest
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-rapidjson_1.13.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-rapidjson_1.13.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb
index 1623f72..8b76397 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-rapidjson_1.13.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-rapidjson_1.14.bb
@@ -4,13 +4,12 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=4daf3929156304df67003c33274a98bd"
 
-SRC_URI = "git://github.com/python-rapidjson/python-rapidjson.git;protocol=https;branch=master"
-SRCREV = "a87053d9b97750afddb504da05bd1cd9f4b94654"
-
-S = "${WORKDIR}/git"
+SRC_URI[sha256sum] = "26806f0a658c34b48d2951d8d3f846ca9deb93a34e664ef436db632a188b6779"
 
 # Inheriting ptest provides functionality for packaging and installing runtime tests for this recipe
-inherit setuptools3 ptest
+inherit setuptools3 pypi ptest
+
+PYPI_PACKAGE = "python-rapidjson"
 
 SETUPTOOLS_BUILD_ARGS += " --rj-include-dir=${RECIPE_SYSROOT}${includedir}"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2023.10.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb
similarity index 78%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2023.10.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb
index c26d55f..d7ac616 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2023.10.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-regex_2023.12.25.bb
@@ -5,7 +5,7 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"
+SRC_URI[sha256sum] = "29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"
 
 RDEPENDS:${PN} += " \
 	python3-stringold \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-rlp/0001-setup-don-t-use-setuptools-markdown.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-rlp/0001-setup-don-t-use-setuptools-markdown.patch
deleted file mode 100644
index 0ab012a..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-rlp/0001-setup-don-t-use-setuptools-markdown.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 5a2db801c6520be296cee9cba0e0e4ffac68430c Mon Sep 17 00:00:00 2001
-From: Bartosz Golaszewski <brgl@bgdev.pl>
-Date: Wed, 11 May 2022 15:11:19 +0200
-Subject: [PATCH] setup: don't use setuptools-markdown
-
-This project is deprecated and irrelevant for the functionality of
-pyrlp. We don't support it in meta-python so just drop it from the
-dependencies.
-
-Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
----
-Upstream-Status: Pending
-
- setup.py | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/setup.py b/setup.py
-index 1055fb1..55fca24 100755
---- a/setup.py
-+++ b/setup.py
-@@ -46,13 +46,11 @@ setup(
-     # *IMPORTANT*: Don't manually change the version here. See README for more.
-     version='3.0.0',
-     description="A package for Recursive Length Prefix encoding and decoding",
--    long_description_markdown_filename='README.md',
-     author="jnnk",
-     author_email='jnnknnj@gmail.com',
-     url='https://github.com/ethereum/pyrlp',
-     packages=find_packages(exclude=["tests", "tests.*"]),
-     include_package_data=True,
--    setup_requires=['setuptools-markdown'],
-     install_requires=[
-         "eth-utils>=2.0.0,<3",
-     ],
--- 
-2.34.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-rlp_3.0.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb
similarity index 60%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-rlp_3.0.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb
index e747ae3..49efd09 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-rlp_3.0.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-rlp_4.0.0.bb
@@ -4,11 +4,13 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=00854fa80a84236706b11f47f23e61e7"
 
-SRC_URI[sha256sum] = "63b0465d2948cd9f01de449d7adfb92d207c1aef3982f20310f8009be4a507e8"
-SRC_URI += "file://0001-setup-don-t-use-setuptools-markdown.patch"
+SRC_URI[sha256sum] = "61a5541f86e4684ab145cb849a5929d2ced8222930a570b3941cf4af16b72a78"
 
 inherit pypi setuptools3
 
 DEPENDS += "python3-pip-native"
 
-RDEPENDS:${PN} += "python3-eth-utils"
+RDEPENDS:${PN} += " \
+    ${PYTHON_PN}-eth-utils \
+    ${PYTHON_PN}-typing-extensions \
+"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-sdbus_0.11.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb
similarity index 64%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-sdbus_0.11.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb
index 6abdad0..6372d34 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-sdbus_0.11.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-sdbus_0.11.1.bb
@@ -3,9 +3,15 @@
 LICENSE = "LGPL-2.1-or-later"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e77986dc8e2ee22d44a7c863e96852ae"
 
-SRC_URI[sha256sum] = "f86fbadae54fea6441ec2f27dc29daf085269d66c5d9df1a4fbc9474a24b91d0"
+SRC_URI[sha256sum] = "adb97718ce996bb308520682c50b1a13e606d65a6edb1c1967a15d2e570cb3b7"
 
 REQUIRED_DISTRO_FEATURES = "systemd"
 DEPENDS += "systemd"
 
+RDEPENDS:${PN} += " \
+    ${PYTHON_PN}-asyncio \
+    ${PYTHON_PN}-numbers \
+    ${PYTHON_PN}-core \
+"
+
 inherit pypi setuptools3 features_check pkgconfig
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.37.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.39.1.bb
similarity index 86%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.37.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.39.1.bb
index 868a7e2..9f42132 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.37.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-sentry-sdk_1.39.1.bb
@@ -15,7 +15,7 @@
 	${PYTHON_PN}-datetime \
 "
 
-SRC_URI[sha256sum] = "7cd324dd2877fdc861f75cba4242bce23a58272a6fea581fcb218bb718bd9cc5"
+SRC_URI[sha256sum] = "320a55cdf9da9097a0bead239c35b7e61f53660ef9878861824fd6d9b2eaf3b5"
 
 PYPI_PACKAGE = "sentry-sdk"
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-setuptools-scm-git-archive_1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-setuptools-scm-git-archive_1.1.bb
deleted file mode 100644
index 2068871..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-setuptools-scm-git-archive_1.1.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "setuptools_scm plugin for git archives"
-HOMEPAGE = "https://pypi.org/project/setuptools-scm-git-archive/"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=838c366f69b72c5df05c96dff79b35f2"
-
-SRC_URI[sha256sum] = "6026f61089b73fa1b5ee737e95314f41cb512609b393530385ed281d0b46c062"
-
-inherit pypi setuptools3
-
-PYPI_PACKAGE = "setuptools_scm_git_archive"
-PYPI_SRC_URI = "https://files.pythonhosted.org/packages/7e/2c/0c15b29a1b5940250bfdc4a4f53272e35cd7cf8a34159291b6b4ec9eb291/${PYPI_ARCHIVE_NAME}"
-
-DEPENDS += "python3-setuptools-scm-native"
-RDEPENDS:${PN} += "python3-setuptools-scm"
-
-BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.23.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.24.bb
similarity index 87%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.23.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.24.bb
index ce216b0..91ab762 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.23.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-sqlalchemy_2.0.24.bb
@@ -4,7 +4,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b707d50badb798e1d897f2c8f649382d"
 
-SRC_URI[sha256sum] = "c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"
+SRC_URI[sha256sum] = "6db97656fd3fe3f7e5b077f12fa6adb5feb6e0b567a3e99f47ecf5f7ea0a09e3"
 
 PYPI_PACKAGE = "SQLAlchemy"
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb
index 53f8011..06b08e7 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-supervisor_4.2.5.bb
@@ -17,7 +17,6 @@
     python3-xmlrpc \
     python3-resource \
     python3-setuptools \
-    python3-smtpd \
 "
 
 SRC_URI += "file://supervisord.conf \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-termcolor_2.3.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb
similarity index 80%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-termcolor_2.3.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb
index bbaefc7..212a293 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-termcolor_2.3.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-termcolor_2.4.0.bb
@@ -6,7 +6,7 @@
 
 inherit pypi python_setuptools_build_meta
 
-SRC_URI[sha256sum] = "b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"
+SRC_URI[sha256sum] = "aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"
 
 DEPENDS += " \
 	${PYTHON_PN}-toml-native \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-tornado_6.3.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-tornado_6.4.bb
similarity index 92%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-tornado_6.3.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-tornado_6.4.bb
index c587422..e3d0209 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-tornado_6.3.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-tornado_6.4.bb
@@ -6,7 +6,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
 
-SRC_URI[sha256sum] = "e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"
+SRC_URI[sha256sum] = "72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-tox_4.11.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-tox_4.11.4.bb
similarity index 92%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-tox_4.11.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-tox_4.11.4.bb
index be42c4b..62c15a7 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-tox_4.11.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-tox_4.11.4.bb
@@ -6,7 +6,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=11610a9d8fd95649cf8159be12b98cb7"
 
-SRC_URI[sha256sum] = "5039f68276461fae6a9452a3b2c7295798f00a0e92edcd9a3b78ba1a73577951"
+SRC_URI[sha256sum] = "73a7240778fabf305aeb05ab8ea26e575e042ab5a18d71d0ed13e343a51d6ce1"
 
 BBCLASSEXTEND = "native nativesdk"
 inherit pypi python_hatchling
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-traitlets_5.13.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-traitlets_5.14.0.bb
similarity index 76%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-traitlets_5.13.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-traitlets_5.14.0.bb
index c16c1ef..19ea011 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-traitlets_5.13.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-traitlets_5.14.0.bb
@@ -3,7 +3,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=13bed0ee6f46a6f6dbf1f9f9572f250a"
 
-SRC_URI[sha256sum] = "9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"
+SRC_URI[sha256sum] = "fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"
 
 inherit pypi python_hatchling
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-types-setuptools_68.2.0.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.0.bb
similarity index 74%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-types-setuptools_68.2.0.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.0.bb
index 4042ab5..2fc1895 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-types-setuptools_68.2.0.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-types-setuptools_69.0.0.0.bb
@@ -5,6 +5,6 @@
 
 inherit pypi setuptools3
 
-SRC_URI[sha256sum] = "09efc380ad5c7f78e30bca1546f706469568cf26084cfab73ecf83dea1d28446"
+SRC_URI[sha256sum] = "b0a06219f628c6527b2f8ce770a4f47550e00d3e8c3ad83e2dc31bc6e6eda95d"
 
 BBCLASSEXTEND = "native"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput/0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput/0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch
deleted file mode 100644
index 4095fc9..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput/0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 69adf9e32f5b11e15c0cbe17f9331c77fed65bf8 Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Sat, 28 May 2022 15:50:50 -0700
-Subject: [PATCH] Deal with 64bit time_t default on 32bit architectures
-
-Deal with Y2K38 concerns related to Linux input events on more recent
-kernels and libcs on 32-bit systems
-
-Upstream-Status: Pending
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- libsuinput/src/suinput.c | 11 ++++++++++-
- 1 file changed, 10 insertions(+), 1 deletion(-)
-
-diff --git a/libsuinput/src/suinput.c b/libsuinput/src/suinput.c
-index 8d5fb71..13ff16a 100644
---- a/libsuinput/src/suinput.c
-+++ b/libsuinput/src/suinput.c
-@@ -45,11 +45,20 @@ int suinput_emit(int uinput_fd, uint16_t ev_type, uint16_t ev_code,
-         struct input_event event;
- 
-         memset(&event, 0, sizeof(event));
--        gettimeofday(&event.time, 0);
-         event.type = ev_type;
-         event.code = ev_code;
-         event.value = ev_value;
- 
-+/* attempt to deal with 64-bit time keeping on recent 32-bit systems */
-+#if (__BITS_PER_LONG != 32 || !defined(__USE_TIME_BITS64))
-+	gettimeofday(&event.time, 0);
-+#else
-+        struct timeval now;
-+        memset(&now, 0, sizeof(now));
-+        gettimeofday(&now, 0);
-+        event.input_event_sec  = now.tv_sec;
-+        event.input_event_usec = now.tv_usec;
-+#endif
-         return suinput_write_event(uinput_fd, &event);
- }
- 
--- 
-2.36.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput/0001-setup-use-setuptools-instead-of-distutils.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput/0001-setup-use-setuptools-instead-of-distutils.patch
deleted file mode 100644
index b2e1b9c..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput/0001-setup-use-setuptools-instead-of-distutils.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 7a4dde83a9584adb42c7f810d882b1fbf5767e2c Mon Sep 17 00:00:00 2001
-From: Bartosz Golaszewski <brgl@bgdev.pl>
-Date: Tue, 24 May 2022 21:43:35 +0200
-Subject: [PATCH] setup: use setuptools instead of distutils
-
-The latter is deprecated, use setuptools instead.
-
-Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
----
-Upstream-Status: Pending
-
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/setup.py b/setup.py
-index 3fa3343..4900b8b 100644
---- a/setup.py
-+++ b/setup.py
-@@ -3,7 +3,7 @@
- import errno
- import subprocess
- 
--from distutils.core import setup, Extension
-+from setuptools import setup, Extension
- 
- libudev_so = "libudev.so.1"
- 
--- 
-2.34.1
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput_0.11.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput_0.11.2.bb
deleted file mode 100644
index ef46653..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-uinput_0.11.2.bb
+++ /dev/null
@@ -1,20 +0,0 @@
-SUMMARY = "Python interface to Linux uinput kernel module."
-HOMEPAGE = "https://pypi.org/project/python-uinput/"
-LICENSE = "GPL-3.0-only"
-LIC_FILES_CHKSUM = "file://COPYING;md5=f27defe1e96c2e1ecd4e0c9be8967949"
-
-SRC_URI += "file://0001-setup-use-setuptools-instead-of-distutils.patch \
-            file://0001-Deal-with-64bit-time_t-default-on-32bit-architecture.patch \
-"
-SRC_URI[sha256sum] = "99392b676c77b5795b86b7d75274db33fe754fd1e06fb3d58b167c797dc47f0c"
-
-PYPI_PACKAGE = "python-uinput"
-
-inherit pypi setuptools3
-
-DEPENDS += "udev"
-RDEPENDS:${PN} += " \
-    python3-ctypes \
-    python3-distutils \
-"
-RRECOMMENDS:${PN} += "kernel-module-uinput"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-ujson_5.8.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb
similarity index 90%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-ujson_5.8.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb
index 9486435..8de9b03 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-ujson_5.8.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-ujson_5.9.0.bb
@@ -4,7 +4,7 @@
 LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=e0039a83d8a99726b5418f0b03302d0a"
 
-SRC_URI[sha256sum] = "78e318def4ade898a461b3d92a79f9441e7e0e4d2ad5419abed4336d702c7425"
+SRC_URI[sha256sum] = "89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"
 
 inherit pypi ptest setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb
index 3c944b4..be1dab4 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-unoconv_0.9.0.bb
@@ -11,7 +11,7 @@
 PYPI_PACKAGE="unoconv"
 
 RDEPENDS:${PN} += "\
-    ${PYTHON_PN}-distutils \
+    ${PYTHON_PN}-setuptools \
     ${PYTHON_PN}-core \
     ${PYTHON_PN}-shell \
 "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-uswid_git.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb
similarity index 70%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-uswid_git.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb
index 40adc34..4499edb 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-uswid_git.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-uswid_0.4.7.bb
@@ -2,6 +2,11 @@
 HOMEPAGE = "https://github.com/hughsie/python-uswid"
 SECTION = "devel/python"
 LICENSE = "LGPL-2.1-or-later"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=40d2542b8c43a3ec2b7f5da31a697b88"
+
+SRC_URI[sha256sum] = "de15c2421bedaa5f54606558700c1f628f07d73da49ec69d1888214ac52c49e6"
+
+inherit setuptools3 python3native pypi
 
 DEPENDS += " python3-cbor2 python3-lxml python3-pefile"
 RDEPENDS:${PN} += " \
@@ -10,12 +15,5 @@
     python3-lxml \
     python3-netclient \
 "
-LIC_FILES_CHKSUM = "file://LICENSE;md5=40d2542b8c43a3ec2b7f5da31a697b88"
-
-SRC_URI = "git://github.com/hughsie/python-uswid.git;branch=main;protocol=https"
-SRCREV = "3223034abef88ae29cf79fdc7fe11ec7e21e11ff"
-S = "${WORKDIR}/git"
-
-inherit setuptools3 python3native
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-virtualenv_20.24.7.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb
similarity index 85%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-virtualenv_20.24.7.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb
index a4e5607..0a9ba59 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-virtualenv_20.24.7.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-virtualenv_20.25.0.bb
@@ -6,7 +6,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=0ce089158cf60a8ab6abb452b6405538"
 
-SRC_URI[sha256sum] = "69050ffb42419c91f6c1284a7b24e0475d793447e35929b488bf6a0aade39353"
+SRC_URI[sha256sum] = "bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"
 
 BBCLASSEXTEND = "native nativesdk"
 inherit pypi python_hatchling
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-web3_6.11.3.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-web3_6.13.0.bb
similarity index 81%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-web3_6.11.3.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-web3_6.13.0.bb
index 2c7aca9..0f0682f 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-web3_6.11.3.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-web3_6.13.0.bb
@@ -4,13 +4,12 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=373fede350846fdffd23648fba504635"
 
-SRC_URI[sha256sum] = "f9bec9d2339bf649fe25293435a5c897a4b035aa96d6c33670ed467acf59dbe7"
+SRC_URI[sha256sum] = "769ab3cfffea69c6b495c63a1aecdb522651c0304260fc25467a886d0be622e2"
 
 inherit pypi setuptools3
 
 RDEPENDS:${PN} += " \
     python3-aiohttp \
-    python3-distutils \
     python3-eth-account \
     python3-idna \
     python3-jsonschema \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.6.4.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb
similarity index 83%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.6.4.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb
index 961cdb9..b202d68 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.6.4.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-websocket-client_1.7.0.bb
@@ -7,7 +7,7 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=6eae3bb7247ccb2c3a087ea8de759c01"
 
-SRC_URI[sha256sum] = "b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df"
+SRC_URI[sha256sum] = "10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb
index 5ac7786..b9c62ce 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-wpa-supplicant_0.2.bb
@@ -10,6 +10,8 @@
 SRC_URI += "file://0001-cli-drop-the-second-argument-from-click.argument-dec.patch"
 
 PYPI_PACKAGE = "wpa_supplicant"
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/wpa_supplicant"
+UPSTREAM_CHECK_REGEX = "/wpa_supplicant/(?P<pver>(\d+[\.\-_]*)+)"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-wtforms_3.0.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-wtforms_3.0.1.bb
deleted file mode 100644
index 36a0191..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-wtforms_3.0.1.bb
+++ /dev/null
@@ -1,23 +0,0 @@
-DESCRIPTION = "A flexible forms validation and rendering library for python web development."
-HOMEPAGE = "https://pypi.python.org/pypi/WTForms"
-SECTION = "devel/python"
-LICENSE = "BSD-3-Clause"
-
-LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=8;endline=8;md5=53dbfa56f61b90215a9f8f0d527c043d"
-
-SRC_URI[sha256sum] = "6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc"
-
-PYPI_PACKAGE = "WTForms"
-
-inherit pypi setuptools3
-
-DEPENDS += "\
-    ${PYTHON_PN}-pip-native \
-    ${PYTHON_PN}-babel-native \
-    "
-
-RDEPENDS:${PN} += "\
-    ${PYTHON_PN}-netserver \
-    ${PYTHON_PN}-numbers \
-    ${PYTHON_PN}-markupsafe \
-    "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-wtforms_3.1.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-wtforms_3.1.1.bb
new file mode 100644
index 0000000..b57c311
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-wtforms_3.1.1.bb
@@ -0,0 +1,24 @@
+DESCRIPTION = "A flexible forms validation and rendering library for python web development."
+HOMEPAGE = "https://pypi.python.org/pypi/WTForms"
+SECTION = "devel/python"
+LICENSE = "BSD-3-Clause"
+
+LIC_FILES_CHKSUM = "file://LICENSE.rst;md5=17ed54aa95f4a6cd0d7a4747d14b64d0"
+
+SRC_URI[sha256sum] = "5e51df8af9a60f6beead75efa10975e97768825a82146a65c7cbf5b915990620"
+
+UPSTREAM_CHECK_URI = "https://pypi.python.org/pypi/WTForms"
+UPSTREAM_CHECK_REGEX = "/WTForms/(?P<pver>(\d+[\.\-_]*)+)"
+
+inherit pypi python_hatchling
+
+DEPENDS += "\
+    ${PYTHON_PN}-pip-native \
+    ${PYTHON_PN}-babel-native \
+    "
+
+RDEPENDS:${PN} += "\
+    ${PYTHON_PN}-netserver \
+    ${PYTHON_PN}-numbers \
+    ${PYTHON_PN}-markupsafe \
+    "
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-xmlschema_2.3.1.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-xmlschema_2.5.1.bb
similarity index 84%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-xmlschema_2.3.1.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-xmlschema_2.5.1.bb
index 9be7cb5..19fae91 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-xmlschema_2.3.1.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-xmlschema_2.5.1.bb
@@ -3,7 +3,7 @@
 LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=0ab20f8e337bea2e6874f372edfd12c0"
 
-SRC_URI[sha256sum] = "2eb426c5710833a05610c22c8766713a1b87e9405e3eca0b7c658375bf7ec810"
+SRC_URI[sha256sum] = "4f7497de6c8b6dc2c28ad7b9ed6e21d186f4afe248a5bea4f54eedab4da44083"
 
 PYPI_PACKAGE = "xmlschema"
 inherit pypi setuptools3
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch
similarity index 96%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch
index 476db4b..70d4607 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-Fix-imports-for-ptests.patch
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0001-test_functionality-convert-line-endings-to-Unix.patch
@@ -1,44 +1,23 @@
-From 0dedc1c573ddc4e87475eb03c64555cd54a72e92 Mon Sep 17 00:00:00 2001
-From: Trevor Gamblin <trevor.gamblin@windriver.com>
-Date: Mon, 7 Jun 2021 09:40:20 -0400
-Subject: [PATCH] Fix imports for tests
+From 0136ca731cba8b056b3f2ff0e7df3953b94f1e87 Mon Sep 17 00:00:00 2001
+From: Tim Orling <tim.orling@konsulko.com>
+Date: Sun, 24 Dec 2023 09:41:57 -0800
+Subject: [PATCH 1/2] test_functionality: convert line endings to Unix
 
-Signed-off-by: Trevor Gamblin <trevor.gamblin@windriver.com>
+Convert the Windows line endings with dos2unix to be like the
+other files in tests/*
+
+Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164]
+
+Signed-off-by: Tim Orling <tim.orling@konsulko.com>
 ---
-Upstream-Status: Pending
+ tests/test_functionality.py | 3822 +++++++++++++++++------------------
+ 1 file changed, 1911 insertions(+), 1911 deletions(-)
 
- tests/test_asyncio.py              | 2 +-
- tests/test_asyncio_context_vars.py | 2 +-
- tests/test_functionality.py        | 2 +-
- tests/test_hooks.py                | 2 +-
- tests/test_tags.py                 | 2 +-
- 5 files changed, 6 insertions(+), 6 deletions(-)
-
---- a/tests/test_asyncio.py
-+++ b/tests/test_asyncio.py
-@@ -2,7 +2,7 @@ import unittest
- import yappi
- import asyncio
- import threading
--from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
-+from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
- 
- 
- async def async_sleep(sec):
---- a/tests/test_asyncio_context_vars.py
-+++ b/tests/test_asyncio_context_vars.py
-@@ -5,7 +5,7 @@ import contextvars
- import functools
- import time
- import os
--import utils
-+import tests.utils as utils
- import yappi
- 
- async_context_id = contextvars.ContextVar('async_context_id')
+diff --git a/tests/test_functionality.py b/tests/test_functionality.py
+index 0e99c47..38bbe67 100644
 --- a/tests/test_functionality.py
 +++ b/tests/test_functionality.py
-@@ -1,1916 +1,1916 @@
+@@ -1,1911 +1,1911 @@
 -import os

 -import sys

 -import time

@@ -47,7 +26,7 @@
 -import yappi

 -import _yappi

 -import utils

--import multiprocessing  # added to fix http://bugs.python.org/issue15881 for > Py2.6

+-import multiprocessing

 -import subprocess

 -

 -_counter = 0

@@ -318,10 +297,10 @@
 -    def test_profile_decorator(self):

 -

 -        def aggregate(func, stats):

--            fname = "tests/%s.profile" % (func.__name__)

+-            fname = f"tests/{func.__name__}.profile"

 -            try:

 -                stats.add(fname)

--            except IOError:

+-            except OSError:

 -                pass

 -            stats.save(fname)

 -            raise Exception("messing around")

@@ -1232,7 +1211,7 @@
 -        # TODO: I put dummy() to fix below, remove the comments after a while.

 -        self.assertTrue( # FIX: I see this fails sometimes?

 -            tsm is not None,

--            'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(tstats))))

+-            f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}")

 -

 -    def test_ctx_stats(self):

 -        from threading import Thread

@@ -1312,7 +1291,7 @@
 -        # TODO: I put dummy() to fix below, remove the comments after a while.

 -        self.assertTrue( # FIX: I see this fails sometimes

 -            tsmain is not None,

--            'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(stats))))

+-            f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}")

 -        self.assertTrue(1.0 > tst2.ttot >= 0.5)

 -        self.assertTrue(1.0 > tst1.ttot >= 0.5)

 -

@@ -1369,7 +1348,7 @@
 -            ts = []

 -            for i in (0.01, 0.05, 0.1):

 -                t = threading.Thread(target=burn_cpu, args=(i, ))

--                t.name = "burn_cpu-%s" % str(i)

+-                t.name = f"burn_cpu-{str(i)}"

 -                t.start()

 -                ts.append(t)

 -            for t in ts:

@@ -1396,10 +1375,7 @@
 -    def test_producer_consumer_with_queues(self):

 -        # we currently just stress yappi, no functionality test is done here.

 -        yappi.start()

--        if utils.is_py3x():

--            from queue import Queue

--        else:

--            from Queue import Queue

+-        from queue import Queue

 -        from threading import Thread

 -        WORKER_THREAD_COUNT = 50

 -        WORK_ITEM_COUNT = 2000

@@ -1458,7 +1434,6 @@
 -        fsh = utils.find_stat_by_name(stats, "handler")

 -        self.assertTrue(fsh is not None)

 -

--    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")

 -    def test_concurrent_futures(self):

 -        yappi.start()

 -        from concurrent.futures import ThreadPoolExecutor

@@ -1468,7 +1443,6 @@
 -        time.sleep(1.0)

 -        yappi.stop()

 -

--    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")

 -    def test_barrier(self):

 -        yappi.start()

 -        b = threading.Barrier(2, timeout=1)

@@ -1962,8 +1936,8 @@
 +import unittest
 +import yappi
 +import _yappi
-+import tests.utils as utils
-+import multiprocessing  # added to fix http://bugs.python.org/issue15881 for > Py2.6
++import utils
++import multiprocessing
 +import subprocess
 +
 +_counter = 0
@@ -2234,10 +2208,10 @@
 +    def test_profile_decorator(self):
 +
 +        def aggregate(func, stats):
-+            fname = "tests/%s.profile" % (func.__name__)
++            fname = f"tests/{func.__name__}.profile"
 +            try:
 +                stats.add(fname)
-+            except IOError:
++            except OSError:
 +                pass
 +            stats.save(fname)
 +            raise Exception("messing around")
@@ -3007,8 +2981,8 @@
 +
 +    def test_issue_32(self):
 +        '''
-+        Start yappi from different thread and we get Internal Error(15) as
-+        the current_ctx_id() called while enumerating the threads in start()
++        Start yappi from different thread and we get Internal Error(15) as 
++        the current_ctx_id() called while enumerating the threads in start() 
 +        and as it does not swap to the enumerated ThreadState* the THreadState_GetDict()
 +        returns wrong object and thus sets an invalid id for the _ctx structure.
 +
@@ -3148,7 +3122,7 @@
 +        # TODO: I put dummy() to fix below, remove the comments after a while.
 +        self.assertTrue( # FIX: I see this fails sometimes?
 +            tsm is not None,
-+            'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(tstats))))
++            f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(tstats))}")
 +
 +    def test_ctx_stats(self):
 +        from threading import Thread
@@ -3228,7 +3202,7 @@
 +        # TODO: I put dummy() to fix below, remove the comments after a while.
 +        self.assertTrue( # FIX: I see this fails sometimes
 +            tsmain is not None,
-+            'Could not find "_MainThread". Found: %s' % (', '.join(utils.get_stat_names(stats))))
++            f"Could not find \"_MainThread\". Found: {', '.join(utils.get_stat_names(stats))}")
 +        self.assertTrue(1.0 > tst2.ttot >= 0.5)
 +        self.assertTrue(1.0 > tst1.ttot >= 0.5)
 +
@@ -3285,7 +3259,7 @@
 +            ts = []
 +            for i in (0.01, 0.05, 0.1):
 +                t = threading.Thread(target=burn_cpu, args=(i, ))
-+                t.name = "burn_cpu-%s" % str(i)
++                t.name = f"burn_cpu-{str(i)}"
 +                t.start()
 +                ts.append(t)
 +            for t in ts:
@@ -3312,10 +3286,7 @@
 +    def test_producer_consumer_with_queues(self):
 +        # we currently just stress yappi, no functionality test is done here.
 +        yappi.start()
-+        if utils.is_py3x():
-+            from queue import Queue
-+        else:
-+            from Queue import Queue
++        from queue import Queue
 +        from threading import Thread
 +        WORKER_THREAD_COUNT = 50
 +        WORK_ITEM_COUNT = 2000
@@ -3374,7 +3345,6 @@
 +        fsh = utils.find_stat_by_name(stats, "handler")
 +        self.assertTrue(fsh is not None)
 +
-+    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
 +    def test_concurrent_futures(self):
 +        yappi.start()
 +        from concurrent.futures import ThreadPoolExecutor
@@ -3384,7 +3354,6 @@
 +        time.sleep(1.0)
 +        yappi.stop()
 +
-+    @unittest.skipIf(not sys.version_info >= (3, 2), "requires Python 3.2")
 +    def test_barrier(self):
 +        yappi.start()
 +        b = threading.Barrier(2, timeout=1)
@@ -3871,25 +3840,6 @@
 +    #     import sys;sys.argv = ['', 'BasicUsage.test_run_as_script']
 +    #     import sys;sys.argv = ['', 'MultithreadedScenarios.test_subsequent_profile']
 +    unittest.main()
---- a/tests/test_hooks.py
-+++ b/tests/test_hooks.py
-@@ -5,7 +5,7 @@ import unittest
- import time
- 
- import yappi
--import utils
-+import tests.utils as utils
- 
- 
- def a():
---- a/tests/test_tags.py
-+++ b/tests/test_tags.py
-@@ -2,7 +2,7 @@ import unittest
- import yappi
- import threading
- import time
--from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
-+from .utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
- 
- 
- class MultiThreadTests(YappiUnitTestCase):
+-- 
+2.34.1
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch
new file mode 100644
index 0000000..96dd024
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0002-Fix-import-of-tests.utils-to-enable-pytest.patch
@@ -0,0 +1,101 @@
+From 28eac38566327091221aabbc164ea8e433c66e7e Mon Sep 17 00:00:00 2001
+From: Tim Orling <tim.orling@konsulko.com>
+Date: Sun, 24 Dec 2023 09:27:50 -0800
+Subject: [PATCH 2/2] Fix import of tests.utils to enable pytest
+
+Running the test cases with pytest leads to importlib errors
+because the "utils" module cannot be found.
+
+Upstream-Status: Submitted [https://github.com/sumerc/yappi/pull/164]
+
+Signed-off-by: Tim Orling <tim.orling@konsulko.com>
+---
+ tests/test_asyncio.py              | 2 +-
+ tests/test_asyncio_context_vars.py | 2 +-
+ tests/test_functionality.py        | 2 +-
+ tests/test_gevent.py               | 2 +-
+ tests/test_hooks.py                | 2 +-
+ tests/test_tags.py                 | 2 +-
+ 6 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/tests/test_asyncio.py b/tests/test_asyncio.py
+index 8e9e631..bb36f4a 100644
+--- a/tests/test_asyncio.py
++++ b/tests/test_asyncio.py
+@@ -2,7 +2,7 @@ import unittest
+ import yappi
+ import asyncio
+ import threading
+-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
+ 
+ 
+ async def async_sleep(sec):
+diff --git a/tests/test_asyncio_context_vars.py b/tests/test_asyncio_context_vars.py
+index 5bd750c..9a253c0 100644
+--- a/tests/test_asyncio_context_vars.py
++++ b/tests/test_asyncio_context_vars.py
+@@ -5,7 +5,7 @@ import contextvars
+ import functools
+ import time
+ import os
+-import utils
++import tests.utils as utils
+ import yappi
+ 
+ async_context_id = contextvars.ContextVar('async_context_id')
+diff --git a/tests/test_functionality.py b/tests/test_functionality.py
+index 38bbe67..8098f17 100644
+--- a/tests/test_functionality.py
++++ b/tests/test_functionality.py
+@@ -5,7 +5,7 @@ import threading
+ import unittest
+ import yappi
+ import _yappi
+-import utils
++import tests.utils as utils
+ import multiprocessing
+ import subprocess
+ 
+diff --git a/tests/test_gevent.py b/tests/test_gevent.py
+index ed9e6ae..502af5f 100644
+--- a/tests/test_gevent.py
++++ b/tests/test_gevent.py
+@@ -2,7 +2,7 @@ import unittest
+ import _yappi
+ import yappi
+ import threading
+-from utils import (
++from tests.utils import (
+     YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, burn_io_gevent
+ )
+ 
+diff --git a/tests/test_hooks.py b/tests/test_hooks.py
+index 297c643..8c387fc 100644
+--- a/tests/test_hooks.py
++++ b/tests/test_hooks.py
+@@ -5,7 +5,7 @@ import unittest
+ import time
+ 
+ import yappi
+-import utils
++import tests.utils as utils
+ 
+ 
+ def a():
+diff --git a/tests/test_tags.py b/tests/test_tags.py
+index b0b531d..b5a4016 100644
+--- a/tests/test_tags.py
++++ b/tests/test_tags.py
+@@ -2,7 +2,7 @@ import unittest
+ import yappi
+ import threading
+ import time
+-from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
++from tests.utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io
+ 
+ 
+ class MultiThreadTests(YappiUnitTestCase):
+-- 
+2.34.1
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0002-add-3.11-to-the-setup.patch b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0002-add-3.11-to-the-setup.patch
deleted file mode 100644
index d40bd2b..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/0002-add-3.11-to-the-setup.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 38afdacf526410f970afc58e147c7377c6c7112c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?S=C3=BCmer=20Cip?= <sumer.cip@platform.sh>
-Date: Fri, 25 Nov 2022 15:58:03 +0300
-Subject: [PATCH 2/2] add 3.11 to the setup
-
----
-Upstream-Status: Pending
-
- setup.py | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/setup.py b/setup.py
-index d006787..96e2a66 100644
---- a/setup.py
-+++ b/setup.py
-@@ -56,6 +56,7 @@ CLASSIFIERS = [
-     'Programming Language :: Python :: 3.8',
-     'Programming Language :: Python :: 3.9',
-     'Programming Language :: Python :: 3.10',
-+    'Programming Language :: Python :: 3.11',
-     'Programming Language :: Python :: Implementation :: CPython',
-     'Operating System :: OS Independent',
-     'Topic :: Software Development :: Libraries',
--- 
-2.30.2
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/run-ptest b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/run-ptest
index 3385d68..8d2017d 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/run-ptest
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi/run-ptest
@@ -1,3 +1,3 @@
 #!/bin/sh
 
-pytest -o log_cli=true -o log_cli_level=INFO | sed -e 's/\[...%\]//g'| sed -e 's/PASSED/PASS/g'| sed -e 's/FAILED/FAIL/g'|sed -e 's/SKIPED/SKIP/g'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS"){printf "%s: %s\n", $NF, $0}else{print}}'| awk '{if ($NF=="PASS" || $NF=="FAIL" || $NF=="SKIP" || $NF=="XFAIL" || $NF=="XPASS") {$NF="";print $0}else{print}}'
+pytest --automake
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.4.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.4.0.bb
deleted file mode 100644
index 71e74e8..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.4.0.bb
+++ /dev/null
@@ -1,36 +0,0 @@
-SUMMARY  = "Yet Another Python Profiler"
-HOMEPAGE = "https://github.com/sumerc/yappi"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=71c208c9a4fd864385eb69ad4caa3bee"
-
-SRC_URI[sha256sum] = "504b5d8fc7433736cb5e257991d2e7f2946019174f1faec7b2fe947881a17fc0"
-
-SRC_URI += " \
-    file://run-ptest \
-    file://0001-Fix-imports-for-ptests.patch \
-    file://0002-add-3.11-to-the-setup.patch \
-"
-
-inherit pypi setuptools3 ptest
-
-RDEPENDS:${PN} += "\
-    ${PYTHON_PN}-datetime \
-    ${PYTHON_PN}-pickle \
-    ${PYTHON_PN}-threading \
-"
-
-RDEPENDS:${PN}-ptest += " \
-    ${PYTHON_PN}-gevent \
-    ${PYTHON_PN}-multiprocessing \
-    ${PYTHON_PN}-pytest \
-    ${PYTHON_PN}-profile \
-    ${PYTHON_PN}-zopeinterface \
-"
-
-do_install_ptest() {
-    install -d ${D}${PTEST_PATH}/tests
-    cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
-    cp -f ${S}/yappi/yappi.py ${D}/${PTEST_PATH}/
-}
-
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb
new file mode 100644
index 0000000..4349cab
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yappi_1.6.0.bb
@@ -0,0 +1,37 @@
+SUMMARY  = "Yet Another Python Profiler"
+HOMEPAGE = "https://github.com/sumerc/yappi"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=71c208c9a4fd864385eb69ad4caa3bee"
+
+SRC_URI[sha256sum] = "a9aaf72009d8c03067294151ee0470ac7a6dfa7b33baab40b198d6c1ef00430a"
+
+SRC_URI += " \
+    file://run-ptest \
+    file://0001-test_functionality-convert-line-endings-to-Unix.patch \
+    file://0002-Fix-import-of-tests.utils-to-enable-pytest.patch \
+"
+
+inherit pypi python_setuptools_build_meta ptest
+
+RDEPENDS:${PN} += "\
+    python3-datetime \
+    python3-pickle \
+    python3-threading \
+"
+
+RDEPENDS:${PN}-ptest += " \
+    python3-gevent \
+    python3-multiprocessing \
+    python3-pytest \
+    python3-profile \
+    python3-unittest-automake-output \
+    python3-zopeinterface \
+"
+
+do_install_ptest() {
+    install -d ${D}${PTEST_PATH}/tests
+    cp -rf ${S}/tests ${D}${PTEST_PATH}
+    cp -f ${S}/run_tests.py ${D}${PTEST_PATH}
+}
+
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.9.2.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb
similarity index 70%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.9.2.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb
index 6370002..d9fe4c0 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.9.2.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-yarl_1.9.4.bb
@@ -3,13 +3,18 @@
 LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
 
-SRC_URI[sha256sum] = "04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"
+SRC_URI[sha256sum] = "566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"
 
 SRC_URI += "file://run-ptest"
 
 PYPI_PACKAGE = "yarl"
 
-inherit pypi ptest setuptools3
+inherit pypi ptest python_setuptools_build_meta
+
+DEPENDS += " \
+    ${PYTHON_PN}-expandvars-native \
+    ${PYTHON_PN}-cython-native \
+"
 
 RDEPENDS:${PN} = "\
     ${PYTHON_PN}-multidict \
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.127.0.bb b/meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.131.0.bb
similarity index 82%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.127.0.bb
rename to meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.131.0.bb
index 45df13e..1963d89 100644
--- a/meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.127.0.bb
+++ b/meta-openembedded/meta-python/recipes-devtools/python/python3-zeroconf_0.131.0.bb
@@ -3,7 +3,7 @@
 LICENSE = "LGPL-2.1-only"
 LIC_FILES_CHKSUM = "file://PKG-INFO;beginline=6;endline=6;md5=6517bdc8f2416f27ab725d4702f7aac3"
 
-SRC_URI[sha256sum] = "1ec001989666be7f76630d6bb8b07fb3928d655fa79a1484674a776778c9a1b3"
+SRC_URI[sha256sum] = "90c431e99192a044a5e0217afd7ca0ca9824af93190332e6f7baf4da5375f331"
 
 inherit pypi setuptools3
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python3-gspread/python3-gspread_5.10.0.bb b/meta-openembedded/meta-python/recipes-devtools/python3-gspread/python3-gspread_5.10.0.bb
deleted file mode 100644
index 3918ed3..0000000
--- a/meta-openembedded/meta-python/recipes-devtools/python3-gspread/python3-gspread_5.10.0.bb
+++ /dev/null
@@ -1,13 +0,0 @@
-SUMMARY = "Google Spreadsheets Python API"
-HOMEPAGE = "https://github.com/burnash/gspread"
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=9488e21983675fa56dc05af558b83e2f"
-
-SRC_URI = "https://files.pythonhosted.org/packages/b4/4f/033ebf34778745061b67b104ef212ed5b05fa65a530f345f88c4355fdcc3/gspread-5.10.0.tar.gz"
-SRC_URI[sha256sum] = "2b6bba6dc111580170346a9bcd1893e0e8c52f67a9e537caec7b7a1e27c14435"
-
-S = "${WORKDIR}/gspread-${PV}"
-
-RDEPENDS:${PN} = "python3-requests"
-
-inherit python_poetry_core
diff --git a/meta-openembedded/meta-python/recipes-devtools/python3-gspread/python3-gspread_5.12.3.bb b/meta-openembedded/meta-python/recipes-devtools/python3-gspread/python3-gspread_5.12.3.bb
new file mode 100644
index 0000000..932cf22
--- /dev/null
+++ b/meta-openembedded/meta-python/recipes-devtools/python3-gspread/python3-gspread_5.12.3.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Google Spreadsheets Python API"
+HOMEPAGE = "https://github.com/burnash/gspread"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=9488e21983675fa56dc05af558b83e2f"
+
+SRC_URI[sha256sum] = "298ebab76e6ed6a998eabc81545ec58f5610f44e2ddb4858b539a0634093f8ce"
+
+S = "${WORKDIR}/gspread-${PV}"
+
+RDEPENDS:${PN} = "python3-requests"
+
+inherit pypi python_poetry_core
diff --git a/meta-openembedded/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.7.0.bb b/meta-openembedded/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb
similarity index 66%
rename from meta-openembedded/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.7.0.bb
rename to meta-openembedded/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb
index 03c4f2f..e18aa83 100644
--- a/meta-openembedded/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.7.0.bb
+++ b/meta-openembedded/meta-python/recipes-extended/python3-portalocker/python3-portalocker_2.8.2.bb
@@ -4,9 +4,11 @@
 
 LIC_FILES_CHKSUM = "file://LICENSE;md5=152634da660a374ca18c0734ed07c63c"
 
-SRC_URI[sha256sum] = "032e81d534a88ec1736d03f780ba073f047a06c478b06e2937486f334e955c51"
+SRC_URI[sha256sum] = "2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"
 
-inherit pypi setuptools3
+DEPENDS += "python3-setuptools-scm-native"
+
+inherit pypi python_setuptools_build_meta
 
 BBCLASSEXTEND = "native nativesdk"
 
diff --git a/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.21.1.bb b/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.21.1.bb
deleted file mode 100644
index b69fd7d..0000000
--- a/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.21.1.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-require nginx.inc
-
-# 1.20.x branch is the current stable branch, the recommended default
-# 1.21.x is the current mainline branches containing all new features
-DEFAULT_PREFERENCE = "-1"
-
-LIC_FILES_CHKSUM = "file://LICENSE;md5=206629dc7c7b3e87acb31162363ae505"
-
-SRC_URI[md5sum] = "7dce9e2136ec32dfd823736e871815b1"
-SRC_URI[sha256sum] = "68ba0311342115163a0354cad34f90c05a7e8bf689dc498abf07899eda155560"
diff --git a/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.24.0.bb b/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.24.0.bb
new file mode 100644
index 0000000..2e865e4
--- /dev/null
+++ b/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.24.0.bb
@@ -0,0 +1,6 @@
+require nginx.inc
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=175abb631c799f54573dc481454c8632"
+
+SRC_URI[sha256sum] = "77a2541637b92a621e3ee76776c8b7b40cf6d707e69ba53a940283e30ff2f55d"
+
diff --git a/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.25.2.bb b/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.25.2.bb
deleted file mode 100644
index 66eef23..0000000
--- a/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.25.2.bb
+++ /dev/null
@@ -1,6 +0,0 @@
-require nginx.inc
-
-LIC_FILES_CHKSUM = "file://LICENSE;md5=79ad2eb837299421c4435dedc8897b3d"
-
-SRC_URI[sha256sum] = "05dd6d9356d66a74e61035f2a42162f8c754c97cf1ba64e7a801ba158d6c0711"
-
diff --git a/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.25.3.bb b/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.25.3.bb
new file mode 100644
index 0000000..d0371dd
--- /dev/null
+++ b/meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx_1.25.3.bb
@@ -0,0 +1,10 @@
+require nginx.inc
+
+# 1.24.x branch is the current stable branch, the recommended default
+# 1.25.x is the current mainline branches containing all new features
+DEFAULT_PREFERENCE = "-1"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=79ad2eb837299421c4435dedc8897b3d"
+
+SRC_URI[sha256sum] = "64c5b975ca287939e828303fa857d22f142b251f17808dfe41733512d9cded86"
+
diff --git a/meta-openembedded/meta-webserver/recipes-webadmin/netdata/netdata_1.43.2.bb b/meta-openembedded/meta-webserver/recipes-webadmin/netdata/netdata_1.43.2.bb
index c56da37..28e82da 100644
--- a/meta-openembedded/meta-webserver/recipes-webadmin/netdata/netdata_1.43.2.bb
+++ b/meta-openembedded/meta-webserver/recipes-webadmin/netdata/netdata_1.43.2.bb
@@ -80,4 +80,4 @@
 
 FILES:${PN} += "${localstatedir}/cache/netdata/ ${localstatedir}/lib/netdata/"
 
-RDEPENDS:${PN} = "bash zlib"
+RDEPENDS:${PN} = "bash python3-core zlib"
diff --git a/meta-raspberrypi/docs/extra-build-config.md b/meta-raspberrypi/docs/extra-build-config.md
index dc5d33a..3d66ffd 100644
--- a/meta-raspberrypi/docs/extra-build-config.md
+++ b/meta-raspberrypi/docs/extra-build-config.md
@@ -74,6 +74,22 @@
     BOOT_DELAY = "0"
     BOOT_DELAY_MS = "0"
 
+## Boot media
+
+The Raspberry Pi 4 board can load the boot image files from SD card and USB memory.
+By default SD card media is used as boot media.
+
+To switch the boot media from SD card to USB memory, the following variables are supported
+in local.conf: `CMDLINE_ROOT_PARTITION` and `BOOT_MEDIA`.
+The default value of `CMDLINE_ROOT_PARTITION` is "/dev/mmcblk0p2" to mount SD card. If you want to mount USB memory partition, set CMDLINE_ROOT_PARTITION to "/dev/sda2".
+`BOOT_MEDIA` allows  `mmc` and `usb`. The "mmc" is required to load an image from the SD card, following the u-boot specification. Similarly, if you want to load a boot image file from USB memory, set BOOT_MEDIA to "usb".
+
+For example, if you want to use USB boot, please define
+the following parameters in your local.conf file.
+
+    CMDLINE_ROOT_PARTITION = "/dev/sda2"
+    BOOT_MEDIA = "usb"
+
 ## Set overclocking options
 
 The Raspberry Pi can be overclocked. As of now overclocking up to the "Turbo
diff --git a/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb b/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb
index 3ff8251..a22f50d 100644
--- a/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb
+++ b/meta-raspberrypi/recipes-bsp/bootfiles/rpi-cmdline.bb
@@ -9,7 +9,9 @@
 CMDLINE_DWC_OTG ?= "dwc_otg.lpm_enable=0"
 
 CMDLINE_ROOT_FSTYPE ?= "rootfstype=ext4"
-CMDLINE_ROOTFS ?= "root=/dev/mmcblk0p2 ${CMDLINE_ROOT_FSTYPE} rootwait"
+CMDLINE_ROOT_PARTITION ?= "/dev/mmcblk0p2"
+
+CMDLINE_ROOTFS ?= "root=${CMDLINE_ROOT_PARTITION} ${CMDLINE_ROOT_FSTYPE} rootwait"
 
 CMDLINE_SERIAL ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=serial0,115200", "", d)}"
 
diff --git a/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in b/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in
index 627d181..58fd86a 100644
--- a/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in
+++ b/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/files/boot.cmd.in
@@ -1,4 +1,4 @@
 fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs
-fatload mmc 0:1 ${kernel_addr_r} @@KERNEL_IMAGETYPE@@
-if test ! -e mmc 0:1 uboot.env; then saveenv; fi;
+fatload @@BOOT_MEDIA@@ 0:1 ${kernel_addr_r} @@KERNEL_IMAGETYPE@@
+if test ! -e @@BOOT_MEDIA@@ 0:1 uboot.env; then saveenv; fi;
 @@KERNEL_BOOTCMD@@ ${kernel_addr_r} - ${fdt_addr}
diff --git a/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb b/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb
index 9108f71..1dff808 100644
--- a/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb
+++ b/meta-raspberrypi/recipes-bsp/rpi-u-boot-scr/rpi-u-boot-scr.bb
@@ -9,9 +9,12 @@
 
 SRC_URI = "file://boot.cmd.in"
 
+BOOT_MEDIA ?= "mmc"
+
 do_compile() {
     sed -e 's/@@KERNEL_IMAGETYPE@@/${KERNEL_IMAGETYPE}/' \
         -e 's/@@KERNEL_BOOTCMD@@/${KERNEL_BOOTCMD}/' \
+        -e 's/@@BOOT_MEDIA@@/${BOOT_MEDIA}/' \
         "${WORKDIR}/boot.cmd.in" > "${WORKDIR}/boot.cmd"
     mkimage -A ${UBOOT_ARCH} -T script -C none -n "Boot script" -d "${WORKDIR}/boot.cmd" boot.scr
 }
diff --git a/meta-security/README b/meta-security/README.md
similarity index 100%
rename from meta-security/README
rename to meta-security/README.md
diff --git a/meta-security/classes/dm-verity-img.bbclass b/meta-security/classes/dm-verity-img.bbclass
index 045c860..2f212d6 100644
--- a/meta-security/classes/dm-verity-img.bbclass
+++ b/meta-security/classes/dm-verity-img.bbclass
@@ -33,6 +33,10 @@
 # is stored where it can be installed into associated initramfs rootfs.
 STAGING_VERITY_DIR ?= "${TMPDIR}/work-shared/${MACHINE}/dm-verity"
 
+# location of images, default current image recipe. Set to DEPLOY_DIR_IMAGE
+# if non-verity images want to embed the .wks and verity image.
+DM_VERITY_DEPLOY_DIR ?= "${IMGDEPLOYDIR}"
+
 # Define the data block size to use in veritysetup.
 DM_VERITY_IMAGE_DATA_BLOCK_SIZE ?= "1024"
 
@@ -49,6 +53,8 @@
 DM_VERITY_ROOT_GUID ?= "4f68bce3-e8cd-4db1-96e7-fbcaf984b709"
 DM_VERITY_RHASH_GUID ?= "2c7357ed-ebd2-46d9-aec1-23d437ec2bf5"
 
+DEPENDS += "bc-native"
+
 # Process the output from veritysetup and generate the corresponding .env
 # file. The output from veritysetup is not very machine-friendly so we need to
 # convert it to some better format. Let's drop the first line (doesn't contain
@@ -87,8 +93,8 @@
     # https://uapi-group.org/specifications/specs/discoverable_partitions_specification/
 
     ROOT_HASH=$(cat $ENV | grep ^ROOT_HASH | sed 's/ROOT_HASH=//' | tr a-f A-F)
-    ROOT_HI=$(echo "obase=16;ibase=16;$ROOT_HASH/2^80" | /usr/bin/bc)
-    ROOT_LO=$(echo "obase=16;ibase=16;$ROOT_HASH%2^80" | /usr/bin/bc)
+    ROOT_HI=$(echo "obase=16;ibase=16;$ROOT_HASH/2^80" | bc)
+    ROOT_LO=$(echo "obase=16;ibase=16;$ROOT_HASH%2^80" | bc)
 
     # Hyphenate as per UUID spec and as expected by wic+sgdisk parameters.
     # Prefix with leading zeros, in case hash chunks weren't using highest bits
@@ -105,15 +111,15 @@
     # Create wks.in fragment with build specific UUIDs for partitions.
     # Unfortunately the wks.in does not support line continuations...
     # First, the unappended filesystem data partition.
-    echo 'part / --source rawcopy --ondisk sda --sourceparams="file=${IMGDEPLOYDIR}/${DM_VERITY_IMAGE}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.verity" --part-name verityroot --part-type="${DM_VERITY_ROOT_GUID}"'" --uuid=\"$ROOT_UUID\"" > $WKS_INC
+    echo 'part / --source rawcopy --ondisk sda --sourceparams="file=${DM_VERITY_DEPLOY_DIR}/${DM_VERITY_IMAGE}-${MACHINE}.rootfs.${DM_VERITY_IMAGE_TYPE}.verity" --part-name verityroot --part-type="${DM_VERITY_ROOT_GUID}"'" --uuid=\"$ROOT_UUID\"" > $WKS_INC
 
     # note: no default mount point for hash data partition
-    echo 'part --source rawcopy --ondisk sda --sourceparams="file=${IMGDEPLOYDIR}/${DM_VERITY_IMAGE}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.vhash" --part-name verityhash --part-type="${DM_VERITY_RHASH_GUID}"'" --uuid=\"$RHASH_UUID\"" >> $WKS_INC
+    echo 'part --source rawcopy --ondisk sda --sourceparams="file=${DM_VERITY_DEPLOY_DIR}/${DM_VERITY_IMAGE}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.vhash" --part-name verityhash --part-type="${DM_VERITY_RHASH_GUID}"'" --uuid=\"$RHASH_UUID\"" >> $WKS_INC
 }
 
 verity_setup() {
     local TYPE=$1
-    local INPUT=${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.$TYPE
+    local INPUT=${IMAGE_NAME}.$TYPE
     local SIZE=$(stat --printf="%s" $INPUT)
     local OUTPUT=$INPUT.verity
     local OUTPUT_HASH=$INPUT.verity
@@ -155,7 +161,7 @@
 # make "dateless" symlink for the hash so the wks can find it.
 verity_hash() {
     cd ${IMGDEPLOYDIR}
-    ln -sf ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${DM_VERITY_IMAGE_TYPE}.vhash \
+    ln -sf ${IMAGE_NAME}.${DM_VERITY_IMAGE_TYPE}.vhash \
         ${IMAGE_BASENAME}-${MACHINE}.${DM_VERITY_IMAGE_TYPE}.vhash
 }
 
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb b/meta-security/dynamic-layers/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb
similarity index 100%
rename from meta-openembedded/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb
rename to meta-security/dynamic-layers/meta-python/recipes-devtools/python/python3-pyinotify_0.9.6.bb
diff --git a/meta-security/dynamic-layers/meta-python/recipes-security/mfa/python3-privacyidea_3.9.bb b/meta-security/dynamic-layers/meta-python/recipes-security/mfa/python3-privacyidea_3.9.1.bb
similarity index 95%
rename from meta-security/dynamic-layers/meta-python/recipes-security/mfa/python3-privacyidea_3.9.bb
rename to meta-security/dynamic-layers/meta-python/recipes-security/mfa/python3-privacyidea_3.9.1.bb
index 2f0ac3a..8268345 100644
--- a/meta-security/dynamic-layers/meta-python/recipes-security/mfa/python3-privacyidea_3.9.bb
+++ b/meta-security/dynamic-layers/meta-python/recipes-security/mfa/python3-privacyidea_3.9.1.bb
@@ -6,7 +6,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=c0acfa7a8a03b718abee9135bc1a1c55"
 
 PYPI_PACKAGE = "privacyIDEA"
-SRC_URI[sha256sum] = "1dce02789ee0a639c5518ab95e254823ca1b47aeb1aae754ec11c70d4248f38e"
+SRC_URI[sha256sum] = "7c70feb44980a3fd7501457777a1ec30e73541e54d3b31f2b9b5ab6cd73cff4f"
 
 inherit pypi setuptools3
 
diff --git a/meta-security/meta-hardening/README b/meta-security/meta-hardening/README.md
similarity index 100%
rename from meta-security/meta-hardening/README
rename to meta-security/meta-hardening/README.md
diff --git a/meta-security/meta-tpm/README b/meta-security/meta-tpm/README.md
similarity index 100%
rename from meta-security/meta-tpm/README
rename to meta-security/meta-tpm/README.md
diff --git a/meta-security/meta-tpm/recipes-tpm1/hoth/libhoth_git.bb b/meta-security/meta-tpm/recipes-tpm1/hoth/libhoth_git.bb
index 5c7305c..7ba64f5 100644
--- a/meta-security/meta-tpm/recipes-tpm1/hoth/libhoth_git.bb
+++ b/meta-security/meta-tpm/recipes-tpm1/hoth/libhoth_git.bb
@@ -7,7 +7,7 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
 
 SRC_URI = "git://github.com/google/libhoth;protocol=https;branch=main"
-SRCREV = "0e3eec6937d35c602ce497444eda05f3c465b5a8"
+SRCREV = "e520f8fa637589324ec56d34f26a48a8162a250c"
 
 DEPENDS += "libusb1"
 
diff --git a/meta-security/meta-tpm/recipes-tpm2/tpm2-tss/tpm2-tss_4.0.1.bb b/meta-security/meta-tpm/recipes-tpm2/tpm2-tss/tpm2-tss_4.0.1.bb
index 6386105..dceebc2 100644
--- a/meta-security/meta-tpm/recipes-tpm2/tpm2-tss/tpm2-tss_4.0.1.bb
+++ b/meta-security/meta-tpm/recipes-tpm2/tpm2-tss/tpm2-tss_4.0.1.bb
@@ -93,3 +93,5 @@
     ${sysconfdir}/sysusers.d"
 
 RDEPENDS:libtss2 = "libgcrypt"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-security/recipes-compliance/lynis/lynis_3.0.9.bb b/meta-security/recipes-compliance/lynis/lynis_3.0.9.bb
index 8c796c0..5b5864c 100644
--- a/meta-security/recipes-compliance/lynis/lynis_3.0.9.bb
+++ b/meta-security/recipes-compliance/lynis/lynis_3.0.9.bb
@@ -6,12 +6,14 @@
 LICENSE = "GPL-3.0-only"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=3edd6782854304fd11da4975ab9799c1"
 
-SRC_URI = "https://cisofy.com/files/${BPN}-${PV}.tar.gz \
+SRC_URI = "https://downloads.cisofy.com/lynis/${BPN}-${PV}.tar.gz \
            file://0001-osdetection-add-OpenEmbedded-and-Poky.patch \
           "
 
 SRC_URI[sha256sum] = "f394df7d20391fb76e975ae88f3eba1da05ac9c4945e2c7f709326e185e17025"
 
+#UPSTREAM_CHECK = "https://downloads.cisofy.com/lynis"
+
 S = "${WORKDIR}/${BPN}"
 
 inherit autotools-brokensep
diff --git a/meta-security/recipes-scanners/arpwatch/arpwatch_3.3.bb b/meta-security/recipes-scanners/arpwatch/arpwatch_3.3.bb
index 4b4d476..7a0a776 100644
--- a/meta-security/recipes-scanners/arpwatch/arpwatch_3.3.bb
+++ b/meta-security/recipes-scanners/arpwatch/arpwatch_3.3.bb
@@ -25,8 +25,6 @@
 
 PACKACONFIG[email] = "-with-watcher=email=${APRWATCH_FROM} --with-watchee=email=${ARPWATH_REPLY}, , postfix, postfix postfix-cfg"
 
-EXTRA_OECONF:append = " --srcdir=${S}"
-
 CONFIGUREOPTS = " --build=${BUILD_SYS} \
           --host=${HOST_SYS} \
           --target=${TARGET_SYS} \
@@ -41,13 +39,13 @@
           --localstatedir=${localstatedir} \
           --libdir=${libdir} \
           --includedir=${includedir} \
-          --oldincludedir=${oldincludedir} \
           --infodir=${infodir} \
           --mandir=${mandir} \
+          --srcdir=${S} \
           "
 
 do_configure () {
-    ${S}/configure ${CONFIGUREOPTS} ${EXTRA_OECONF}
+    ${S}/configure ${CONFIGUREOPTS}
 }
 
 do_install () {
diff --git a/meta-security/recipes-security/libgssglue/libgssglue_0.7.bb b/meta-security/recipes-security/libgssglue/libgssglue_0.8.bb
similarity index 93%
rename from meta-security/recipes-security/libgssglue/libgssglue_0.7.bb
rename to meta-security/recipes-security/libgssglue/libgssglue_0.8.bb
index 26bd2f3..9d01964 100644
--- a/meta-security/recipes-security/libgssglue/libgssglue_0.7.bb
+++ b/meta-security/recipes-security/libgssglue/libgssglue_0.8.bb
@@ -18,14 +18,14 @@
                     file://src/g_accept_sec_context.c;beginline=3;endline=23;md5=da8ca7a37bd26e576c23874d453751d2\
                     file://src/g_ccache_name.c;beginline=1;endline=32;md5=208d4de05d5c8273963a8332f084faa7 \
                     file://src/oid_ops.c;beginline=1;endline=26;md5=1f194d148b396972da26759a8ec399f0\
-                    file://src/oid_ops.c;beginline=378;endline=398;md5=d77a5c03e91908fac453c08bbeaddce1\
+                    file://src/oid_ops.c;beginline=378;endline=398;md5=72457a5cdc0354cb5c25c8b150326364\
 "
 
 SRC_URI = "${DEBIAN_MIRROR}/main/libg/${BPN}/${BPN}_${PV}.orig.tar.gz \
            file://libgssglue-canon-name.patch  \
 "
 
-SRC_URI[sha256sum] = "bcd618ae0bc69f12815d77295658a760e7edc20706b9a731a81da8993f5c970a"
+SRC_URI[sha256sum] = "a2bb183e946f6e30562a2a856950a2916c9b6d42c34d67a8400e4efc28917746"
 
 inherit autotools-brokensep
 
diff --git a/poky/bitbake/bin/bitbake b/poky/bitbake/bin/bitbake
index 8cfa165..abf7de2 100755
--- a/poky/bitbake/bin/bitbake
+++ b/poky/bitbake/bin/bitbake
@@ -27,7 +27,7 @@
 
 bb.utils.check_system_locale()
 
-__version__ = "2.6.0"
+__version__ = "2.7.1"
 
 if __name__ == "__main__":
     if __version__ != bb.__version__:
diff --git a/poky/bitbake/bin/bitbake-diffsigs b/poky/bitbake/bin/bitbake-diffsigs
index fe0f33e..a8f4919 100755
--- a/poky/bitbake/bin/bitbake-diffsigs
+++ b/poky/bitbake/bin/bitbake-diffsigs
@@ -72,13 +72,16 @@
         elif sig2 not in sigfiles:
             logger.error('No sigdata files found matching %s %s with signature %s' % (pn, taskname, sig2))
             sys.exit(1)
-        latestfiles = [sigfiles[sig1], sigfiles[sig2]]
     else:
-        filedates = find_siginfo(bbhandler, pn, taskname)
-        latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
-        if not latestfiles:
+        sigfiles = find_siginfo(bbhandler, pn, taskname)
+        latestsigs = sorted(sigfiles.keys(), key=lambda h: sigfiles[h]['time'])[-2:]
+        if not latestsigs:
             logger.error('No sigdata files found matching %s %s' % (pn, taskname))
             sys.exit(1)
+        sig1 = latestsigs[0]
+        sig2 = latestsigs[1]
+
+    latestfiles = [sigfiles[sig1]['path'], sigfiles[sig2]['path']]
 
     return latestfiles
 
diff --git a/poky/bitbake/bin/bitbake-hashserv b/poky/bitbake/bin/bitbake-hashserv
index c560b3e..c913c4e 100755
--- a/poky/bitbake/bin/bitbake-hashserv
+++ b/poky/bitbake/bin/bitbake-hashserv
@@ -53,6 +53,19 @@
 not implement SSL). Otherwise all usernames and passwords will be transmitted
 in the clear. When configured this way, clients can connect using a secure
 websocket, as in "wss://SERVER:PORT"
+
+The following permissions are supported by the server:
+
+    @none       - No permissions
+    @read       - The ability to read equivalent hashes from the server
+    @report     - The ability to report equivalent hashes to the server
+    @db-admin   - Manage the hash database(s). This includes cleaning the
+                  database, removing hashes, etc.
+    @user-admin - The ability to manage user accounts. This includes, creating
+                  users, deleting users, resetting login tokens, and assigning
+                  permissions.
+    @all        - All possible permissions, including any that may be added
+                  in the future
         """,
     )
 
diff --git a/poky/bitbake/bin/toaster-eventreplay b/poky/bitbake/bin/toaster-eventreplay
index 404b61f..74a3193 100755
--- a/poky/bitbake/bin/toaster-eventreplay
+++ b/poky/bitbake/bin/toaster-eventreplay
@@ -30,79 +30,23 @@
 
 import bb.cooker
 from bb.ui import toasterui
-
-class EventPlayer:
-    """Emulate a connection to a bitbake server."""
-
-    def __init__(self, eventfile, variables):
-        self.eventfile = eventfile
-        self.variables = variables
-        self.eventmask = []
-
-    def waitEvent(self, _timeout):
-        """Read event from the file."""
-        line = self.eventfile.readline().strip()
-        if not line:
-            return
-        try:
-            event_str = json.loads(line)['vars'].encode('utf-8')
-            event = pickle.loads(codecs.decode(event_str, 'base64'))
-            event_name = "%s.%s" % (event.__module__, event.__class__.__name__)
-            if event_name not in self.eventmask:
-                return
-            return event
-        except ValueError as err:
-            print("Failed loading ", line)
-            raise err
-
-    def runCommand(self, command_line):
-        """Emulate running a command on the server."""
-        name = command_line[0]
-
-        if name == "getVariable":
-            var_name = command_line[1]
-            variable = self.variables.get(var_name)
-            if variable:
-                return variable['v'], None
-            return None, "Missing variable %s" % var_name
-
-        elif name == "getAllKeysWithFlags":
-            dump = {}
-            flaglist = command_line[1]
-            for key, val in self.variables.items():
-                try:
-                    if not key.startswith("__"):
-                        dump[key] = {
-                            'v': val['v'],
-                            'history' : val['history'],
-                        }
-                        for flag in flaglist:
-                            dump[key][flag] = val[flag]
-                except Exception as err:
-                    print(err)
-            return (dump, None)
-
-        elif name == 'setEventMask':
-            self.eventmask = command_line[-1]
-            return True, None
-
-        else:
-            raise Exception("Command %s not implemented" % command_line[0])
-
-    def getEventHandle(self):
-        """
-        This method is called by toasterui.
-        The return value is passed to self.runCommand but not used there.
-        """
-        pass
+from bb.ui import eventreplay
 
 def main(argv):
     with open(argv[-1]) as eventfile:
         # load variables from the first line
-        variables = json.loads(eventfile.readline().strip())['allvariables']
-
+        variables = None
+        while line := eventfile.readline().strip():
+            try:
+                variables = json.loads(line)['allvariables']
+                break
+            except (KeyError, json.JSONDecodeError):
+                continue
+        if not variables:
+            sys.exit("Cannot find allvariables entry in event log file %s" % argv[-1])
+        eventfile.seek(0)
         params = namedtuple('ConfigParams', ['observe_only'])(True)
-        player = EventPlayer(eventfile, variables)
+        player = eventreplay.EventPlayer(eventfile, variables)
 
         return toasterui.main(player, player, params)
 
diff --git a/poky/bitbake/contrib/vim/syntax/bitbake.vim b/poky/bitbake/contrib/vim/syntax/bitbake.vim
index c5ea80f..8f39b8f 100644
--- a/poky/bitbake/contrib/vim/syntax/bitbake.vim
+++ b/poky/bitbake/contrib/vim/syntax/bitbake.vim
@@ -63,13 +63,14 @@
 
 " Includes and requires
 syn keyword bbInclude           inherit include require contained 
-syn match bbIncludeRest         ".*$" contained contains=bbString,bbVarDeref
+syn match bbIncludeRest         ".*$" contained contains=bbString,bbVarDeref,bbVarPyValue
 syn match bbIncludeLine         "^\(inherit\|include\|require\)\s\+" contains=bbInclude nextgroup=bbIncludeRest
 
 " Add taks and similar
 syn keyword bbStatement         addtask deltask addhandler after before EXPORT_FUNCTIONS contained
-syn match bbStatementRest       ".*$" skipwhite contained contains=bbStatement
-syn match bbStatementLine       "^\(addtask\|deltask\|addhandler\|after\|before\|EXPORT_FUNCTIONS\)\s\+" contains=bbStatement nextgroup=bbStatementRest
+syn match bbStatementRest       /[^\\]*$/ skipwhite contained contains=bbStatement,bbVarDeref,bbVarPyValue
+syn region bbStatementRestCont  start=/.*\\$/ end=/^[^\\]*$/ contained contains=bbStatement,bbVarDeref,bbVarPyValue,bbContinue keepend
+syn match bbStatementLine       "^\(addtask\|deltask\|addhandler\|after\|before\|EXPORT_FUNCTIONS\)\s\+" contains=bbStatement nextgroup=bbStatementRest,bbStatementRestCont
 
 " OE Important Functions
 syn keyword bbOEFunctions       do_fetch do_unpack do_patch do_configure do_compile do_stage do_install do_package contained
@@ -122,6 +123,7 @@
 hi def link bbPyDef             Statement
 hi def link bbStatement         Statement
 hi def link bbStatementRest     Identifier
+hi def link bbStatementRestCont Identifier
 hi def link bbOEFunctions       Special
 hi def link bbVarPyValue        PreProc
 hi def link bbOverrideOperator  Operator
diff --git a/poky/bitbake/lib/bb/__init__.py b/poky/bitbake/lib/bb/__init__.py
index 3163481..019ab19 100644
--- a/poky/bitbake/lib/bb/__init__.py
+++ b/poky/bitbake/lib/bb/__init__.py
@@ -9,12 +9,19 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
-__version__ = "2.6.0"
+__version__ = "2.7.1"
 
 import sys
 if sys.version_info < (3, 8, 0):
     raise RuntimeError("Sorry, python 3.8.0 or later is required for this version of bitbake")
 
+if sys.version_info < (3, 10, 0):
+    # With python 3.8 and 3.9, we see errors of "libgcc_s.so.1 must be installed for pthread_cancel to work"
+    # https://stackoverflow.com/questions/64797838/libgcc-s-so-1-must-be-installed-for-pthread-cancel-to-work
+    # https://bugs.ams1.psf.io/issue42888
+    # so ensure libgcc_s is loaded early on
+    import ctypes
+    libgcc_s = ctypes.CDLL('libgcc_s.so.1')
 
 class BBHandledException(Exception):
     """
diff --git a/poky/bitbake/lib/bb/codeparser.py b/poky/bitbake/lib/bb/codeparser.py
index cd39409..2e8b7ce 100644
--- a/poky/bitbake/lib/bb/codeparser.py
+++ b/poky/bitbake/lib/bb/codeparser.py
@@ -258,17 +258,17 @@
         if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
             if isinstance(node.args[0], ast.Constant) and isinstance(node.args[0].value, str):
                 varname = node.args[0].value
-                if name in self.containsfuncs and isinstance(node.args[1], ast.Str):
+                if name in self.containsfuncs and isinstance(node.args[1], ast.Constant):
                     if varname not in self.contains:
                         self.contains[varname] = set()
-                    self.contains[varname].add(node.args[1].s)
-                elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Str):
+                    self.contains[varname].add(node.args[1].value)
+                elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Constant):
                     if varname not in self.contains:
                         self.contains[varname] = set()
-                    self.contains[varname].update(node.args[1].s.split())
+                    self.contains[varname].update(node.args[1].value.split())
                 elif name.endswith(self.getvarflags):
-                    if isinstance(node.args[1], ast.Str):
-                        self.references.add('%s[%s]' % (varname, node.args[1].s))
+                    if isinstance(node.args[1], ast.Constant):
+                        self.references.add('%s[%s]' % (varname, node.args[1].value))
                     else:
                         self.warn(node.func, node.args[1])
                 else:
@@ -276,8 +276,8 @@
             else:
                 self.warn(node.func, node.args[0])
         elif name and name.endswith(".expand"):
-            if isinstance(node.args[0], ast.Str):
-                value = node.args[0].s
+            if isinstance(node.args[0], ast.Constant):
+                value = node.args[0].value
                 d = bb.data.init()
                 parser = d.expandWithRefs(value, self.name)
                 self.references |= parser.references
@@ -287,8 +287,8 @@
                         self.contains[varname] = set()
                     self.contains[varname] |= parser.contains[varname]
         elif name in self.execfuncs:
-            if isinstance(node.args[0], ast.Str):
-                self.var_execs.add(node.args[0].s)
+            if isinstance(node.args[0], ast.Constant):
+                self.var_execs.add(node.args[0].value)
             else:
                 self.warn(node.func, node.args[0])
         elif name and isinstance(node.func, (ast.Name, ast.Attribute)):
diff --git a/poky/bitbake/lib/bb/command.py b/poky/bitbake/lib/bb/command.py
index 79b6c07..1fcb9bf 100644
--- a/poky/bitbake/lib/bb/command.py
+++ b/poky/bitbake/lib/bb/command.py
@@ -777,6 +777,7 @@
         (mc, pn) = bb.runqueue.split_mc(params[0])
         taskname = params[1]
         sigs = params[2]
+        bb.siggen.check_siggen_version(bb.siggen)
         res = bb.siggen.find_siginfo(pn, taskname, sigs, command.cooker.databuilder.mcdata[mc])
         bb.event.fire(bb.event.FindSigInfoResult(res), command.cooker.databuilder.mcdata[mc])
         command.finishAsyncCommand()
diff --git a/poky/bitbake/lib/bb/runqueue.py b/poky/bitbake/lib/bb/runqueue.py
index 02d7ff9..5a45943 100644
--- a/poky/bitbake/lib/bb/runqueue.py
+++ b/poky/bitbake/lib/bb/runqueue.py
@@ -1390,12 +1390,12 @@
             continue
         worker.pipe.close()
 
-    def start_worker(self):
+    def start_worker(self, rqexec):
         if self.worker:
             self.teardown_workers()
         self.teardown = False
         for mc in self.rqdata.dataCaches:
-            self.worker[mc] = self._start_worker(mc)
+            self.worker[mc] = self._start_worker(mc, False, rqexec)
 
     def start_fakeworker(self, rqexec, mc):
         if not mc in self.fakeworker:
@@ -1555,6 +1555,9 @@
                                          ('bb.event.HeartbeatEvent',), data=self.cfgData)
                  self.dm_event_handler_registered = True
 
+            self.rqdata.init_progress_reporter.next_stage()
+            self.rqexe = RunQueueExecute(self)
+
             dump = self.cooker.configuration.dump_signatures
             if dump:
                 self.rqdata.init_progress_reporter.finish()
@@ -1566,10 +1569,8 @@
                 self.state = runQueueComplete
 
         if self.state is runQueueSceneInit:
-            self.rqdata.init_progress_reporter.next_stage()
-            self.start_worker()
-            self.rqdata.init_progress_reporter.next_stage()
-            self.rqexe = RunQueueExecute(self)
+            self.start_worker(self.rqexe)
+            self.rqdata.init_progress_reporter.finish()
 
             # If we don't have any setscene functions, skip execution
             if not self.rqdata.runq_setscene_tids:
@@ -1748,15 +1749,18 @@
         return invalidtasks.difference(found)
 
     def write_diffscenetasks(self, invalidtasks):
+        bb.siggen.check_siggen_version(bb.siggen)
 
         # Define recursion callback
         def recursecb(key, hash1, hash2):
             hashes = [hash1, hash2]
+            bb.debug(1, "Recursively looking for recipe {} hashes {}".format(key, hashes))
             hashfiles = bb.siggen.find_siginfo(key, None, hashes, self.cfgData)
+            bb.debug(1, "Found hashfiles:\n{}".format(hashfiles))
 
             recout = []
             if len(hashfiles) == 2:
-                out2 = bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
+                out2 = bb.siggen.compare_sigfiles(hashfiles[hash1]['path'], hashfiles[hash2]['path'], recursecb)
                 recout.extend(list('    ' + l for l in out2))
             else:
                 recout.append("Unable to find matching sigdata for %s with hashes %s or %s" % (key, hash1, hash2))
@@ -1768,16 +1772,21 @@
             (mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
             pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn]
             h = self.rqdata.runtaskentries[tid].unihash
+            bb.debug(1, "Looking for recipe {} task {}".format(pn, taskname))
             matches = bb.siggen.find_siginfo(pn, taskname, [], self.cooker.databuilder.mcdata[mc])
+            bb.debug(1, "Found hashfiles:\n{}".format(matches))
             match = None
-            for m in matches:
-                if h in m:
-                    match = m
+            for m in matches.values():
+                if h in m['path']:
+                    match = m['path']
             if match is None:
                 bb.fatal("Can't find a task we're supposed to have written out? (hash: %s tid: %s)?" % (h, tid))
             matches = {k : v for k, v in iter(matches.items()) if h not in k}
+            matches_local = {k : v for k, v in iter(matches.items()) if h not in k and not v['sstate']}
+            if matches_local:
+                matches = matches_local
             if matches:
-                latestmatch = sorted(matches.keys(), key=lambda f: matches[f])[-1]
+                latestmatch = matches[sorted(matches.keys(), key=lambda h: matches[h]['time'])[-1]]['path']
                 prevh = __find_sha256__.search(latestmatch).group(0)
                 output = bb.siggen.compare_sigfiles(latestmatch, match, recursecb)
                 bb.plain("\nTask %s:%s couldn't be used from the cache because:\n  We need hash %s, most recent matching task was %s\n  " % (pn, taskname, h, prevh) + '\n  '.join(output))
@@ -1813,6 +1822,7 @@
         self.build_stamps2 = []
         self.failed_tids = []
         self.sq_deferred = {}
+        self.sq_needed_harddeps = set()
 
         self.stampcache = {}
 
@@ -1822,11 +1832,6 @@
 
         self.stats = RunQueueStats(len(self.rqdata.runtaskentries), len(self.rqdata.runq_setscene_tids))
 
-        for mc in rq.worker:
-            rq.worker[mc].pipe.setrunqueueexec(self)
-        for mc in rq.fakeworker:
-            rq.fakeworker[mc].pipe.setrunqueueexec(self)
-
         if self.number_tasks <= 0:
              bb.fatal("Invalid BB_NUMBER_THREADS %s" % self.number_tasks)
 
@@ -2140,7 +2145,10 @@
             # Find the next setscene to run
             for nexttask in self.sorted_setscene_tids:
                 if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values():
-                    if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.sqdata.sq_revdeps[nexttask]):
+                    if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \
+                            nexttask not in self.sq_needed_harddeps and \
+                            self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \
+                            self.check_dependencies(nexttask, self.sqdata.sq_revdeps[nexttask]):
                         if nexttask not in self.rqdata.target_tids:
                             logger.debug2("Skipping setscene for task %s" % nexttask)
                             self.sq_task_skip(nexttask)
@@ -2148,6 +2156,18 @@
                             if nexttask in self.sq_deferred:
                                 del self.sq_deferred[nexttask]
                             return True
+                    if nexttask in self.sqdata.sq_harddeps_rev and not self.sqdata.sq_harddeps_rev[nexttask].issubset(self.scenequeue_covered | self.scenequeue_notcovered):
+                        logger.debug2("Deferring %s due to hard dependencies" % nexttask)
+                        updated = False
+                        for dep in self.sqdata.sq_harddeps_rev[nexttask]:
+                            if dep not in self.sq_needed_harddeps:
+                                logger.debug2("Enabling task %s as it is a hard dependency" % dep)
+                                self.sq_buildable.add(dep)
+                                self.sq_needed_harddeps.add(dep)
+                                updated = True
+                        if updated:
+                            return True
+                        continue
                     # If covered tasks are running, need to wait for them to complete
                     for t in self.sqdata.sq_covered_tasks[nexttask]:
                         if t in self.runq_running and t not in self.runq_complete:
@@ -2596,8 +2616,8 @@
         update_tasks2 = []
         for tid in update_tasks:
             harddepfail = False
-            for t in self.sqdata.sq_harddeps:
-                if tid in self.sqdata.sq_harddeps[t] and t in self.scenequeue_notcovered:
+            for t in self.sqdata.sq_harddeps_rev[tid]:
+                if t in self.scenequeue_notcovered:
                     harddepfail = True
                     break
             if not harddepfail and self.sqdata.sq_revdeps[tid].issubset(self.scenequeue_covered | self.scenequeue_notcovered):
@@ -2629,12 +2649,13 @@
 
         if changed:
             self.stats.updateCovered(len(self.scenequeue_covered), len(self.scenequeue_notcovered))
+            self.sq_needed_harddeps = set()
             self.holdoff_need_update = True
 
     def scenequeue_updatecounters(self, task, fail=False):
 
-        for dep in sorted(self.sqdata.sq_deps[task]):
-            if fail and task in self.sqdata.sq_harddeps and dep in self.sqdata.sq_harddeps[task]:
+        if fail and task in self.sqdata.sq_harddeps:
+            for dep in sorted(self.sqdata.sq_harddeps[task]):
                 if dep in self.scenequeue_covered or dep in self.scenequeue_notcovered:
                     # dependency could be already processed, e.g. noexec setscene task
                     continue
@@ -2644,6 +2665,7 @@
                 logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep))
                 self.sq_task_failoutright(dep)
                 continue
+        for dep in sorted(self.sqdata.sq_deps[task]):
             if self.sqdata.sq_revdeps[dep].issubset(self.scenequeue_covered | self.scenequeue_notcovered):
                 if dep not in self.sq_buildable:
                     self.sq_buildable.add(dep)
@@ -2780,6 +2802,7 @@
         self.sq_revdeps = {}
         # Injected inter-setscene task dependencies
         self.sq_harddeps = {}
+        self.sq_harddeps_rev = {}
         # Cache of stamp files so duplicates can't run in parallel
         self.stamps = {}
         # Setscene tasks directly depended upon by the build
@@ -2907,6 +2930,7 @@
         idepends = rqdata.taskData[mc].taskentries[realtid].idepends
         sqdata.stamps[tid] = bb.parse.siggen.stampfile_mcfn(taskname, taskfn, extrainfo=False)
 
+        sqdata.sq_harddeps_rev[tid] = set()
         for (depname, idependtask) in idepends:
 
             if depname not in rqdata.taskData[mc].build_targets:
@@ -2919,20 +2943,15 @@
             if deptid not in rqdata.runtaskentries:
                 bb.msg.fatal("RunQueue", "Task %s depends upon non-existent task %s:%s" % (realtid, depfn, idependtask))
 
+            logger.debug2("Adding hard setscene dependency %s for %s" % (deptid, tid))
+
             if not deptid in sqdata.sq_harddeps:
                 sqdata.sq_harddeps[deptid] = set()
             sqdata.sq_harddeps[deptid].add(tid)
-
-            sq_revdeps_squash[tid].add(deptid)
-            # Have to zero this to avoid circular dependencies
-            sq_revdeps_squash[deptid] = set()
+            sqdata.sq_harddeps_rev[tid].add(deptid)
 
     rqdata.init_progress_reporter.next_stage()
 
-    for task in sqdata.sq_harddeps:
-        for dep in sqdata.sq_harddeps[task]:
-            sq_revdeps_squash[dep].add(task)
-
     rqdata.init_progress_reporter.next_stage()
 
     #for tid in sq_revdeps_squash:
@@ -2959,7 +2978,7 @@
         if not sqdata.sq_revdeps[tid]:
             sqrq.sq_buildable.add(tid)
 
-    rqdata.init_progress_reporter.finish()
+    rqdata.init_progress_reporter.next_stage()
 
     sqdata.noexec = set()
     sqdata.stamppresent = set()
@@ -3178,9 +3197,6 @@
         self.rqexec = rqexec
         self.fakerootlogs = fakerootlogs
 
-    def setrunqueueexec(self, rqexec):
-        self.rqexec = rqexec
-
     def read(self):
         for workers, name in [(self.rq.worker, "Worker"), (self.rq.fakeworker, "Fakeroot")]:
             for worker in workers.values():
diff --git a/poky/bitbake/lib/bb/siggen.py b/poky/bitbake/lib/bb/siggen.py
index b023b79..5a584ca 100644
--- a/poky/bitbake/lib/bb/siggen.py
+++ b/poky/bitbake/lib/bb/siggen.py
@@ -24,6 +24,16 @@
 logger = logging.getLogger('BitBake.SigGen')
 hashequiv_logger = logging.getLogger('BitBake.SigGen.HashEquiv')
 
+#find_siginfo and find_siginfo_version are set by the metadata siggen
+# The minimum version of the find_siginfo function we need
+find_siginfo_minversion = 2
+
+def check_siggen_version(siggen):
+    if not hasattr(siggen, "find_siginfo_version"):
+        bb.fatal("Siggen from metadata (OE-Core?) is too old, please update it (no version found)")
+    if siggen.find_siginfo_version < siggen.find_siginfo_minversion:
+        bb.fatal("Siggen from metadata (OE-Core?) is too old, please update it (%s vs %s)" % (siggen.find_siginfo_version, siggen.find_siginfo_minversion))
+
 class SetEncoder(json.JSONEncoder):
     def default(self, obj):
         if isinstance(obj, set) or isinstance(obj, frozenset):
diff --git a/poky/bitbake/lib/bb/tests/codeparser.py b/poky/bitbake/lib/bb/tests/codeparser.py
index b6f2b77..f6585fb 100644
--- a/poky/bitbake/lib/bb/tests/codeparser.py
+++ b/poky/bitbake/lib/bb/tests/codeparser.py
@@ -467,6 +467,6 @@
     #    self.d.setVar("oe_libinstall", "echo test")
     #    self.d.setVar("FOO", "foo=oe_libinstall; eval $foo")
     #    self.d.setVarFlag("FOO", "vardeps", "oe_*")
-    #    self.assertEquals(deps, set(["oe_libinstall"]))
+    #    self.assertEqual(deps, set(["oe_libinstall"]))
 
 
diff --git a/poky/bitbake/lib/bb/ui/eventreplay.py b/poky/bitbake/lib/bb/ui/eventreplay.py
new file mode 100644
index 0000000..d62ecbf
--- /dev/null
+++ b/poky/bitbake/lib/bb/ui/eventreplay.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python3
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file re-uses code spread throughout other Bitbake source files.
+# As such, all other copyrights belong to their own right holders.
+#
+
+
+import os
+import sys
+import json
+import pickle
+import codecs
+
+
+class EventPlayer:
+    """Emulate a connection to a bitbake server."""
+
+    def __init__(self, eventfile, variables):
+        self.eventfile = eventfile
+        self.variables = variables
+        self.eventmask = []
+
+    def waitEvent(self, _timeout):
+        """Read event from the file."""
+        line = self.eventfile.readline().strip()
+        if not line:
+            return
+        try:
+            decodedline = json.loads(line)
+            if 'allvariables' in decodedline:
+                self.variables = decodedline['allvariables']
+                return
+            if not 'vars' in decodedline:
+                raise ValueError
+            event_str = decodedline['vars'].encode('utf-8')
+            event = pickle.loads(codecs.decode(event_str, 'base64'))
+            event_name = "%s.%s" % (event.__module__, event.__class__.__name__)
+            if event_name not in self.eventmask:
+                return
+            return event
+        except ValueError as err:
+            print("Failed loading ", line)
+            raise err
+
+    def runCommand(self, command_line):
+        """Emulate running a command on the server."""
+        name = command_line[0]
+
+        if name == "getVariable":
+            var_name = command_line[1]
+            variable = self.variables.get(var_name)
+            if variable:
+                return variable['v'], None
+            return None, "Missing variable %s" % var_name
+
+        elif name == "getAllKeysWithFlags":
+            dump = {}
+            flaglist = command_line[1]
+            for key, val in self.variables.items():
+                try:
+                    if not key.startswith("__"):
+                        dump[key] = {
+                            'v': val['v'],
+                            'history' : val['history'],
+                        }
+                        for flag in flaglist:
+                            dump[key][flag] = val[flag]
+                except Exception as err:
+                    print(err)
+            return (dump, None)
+
+        elif name == 'setEventMask':
+            self.eventmask = command_line[-1]
+            return True, None
+
+        else:
+            raise Exception("Command %s not implemented" % command_line[0])
+
+    def getEventHandle(self):
+        """
+        This method is called by toasterui.
+        The return value is passed to self.runCommand but not used there.
+        """
+        pass
diff --git a/poky/bitbake/lib/bb/ui/toasterui.py b/poky/bitbake/lib/bb/ui/toasterui.py
index ec5bd4f..6bd21f1 100644
--- a/poky/bitbake/lib/bb/ui/toasterui.py
+++ b/poky/bitbake/lib/bb/ui/toasterui.py
@@ -385,7 +385,7 @@
                     main.shutdown = 1
 
                 logger.info("ToasterUI build done, brbe: %s", brbe)
-                continue
+                break
 
             if isinstance(event, (bb.command.CommandCompleted,
                                   bb.command.CommandFailed,
diff --git a/poky/bitbake/lib/bb/utils.py b/poky/bitbake/lib/bb/utils.py
index 61ffad9..068b631 100644
--- a/poky/bitbake/lib/bb/utils.py
+++ b/poky/bitbake/lib/bb/utils.py
@@ -759,7 +759,8 @@
     """Create a directory like 'mkdir -p', but does not complain if
     directory already exists like os.makedirs
     """
-
+    if '${' in str(directory):
+        bb.fatal("Directory name {} contains unexpanded bitbake variable. This may cause build failures and WORKDIR polution.".format(directory))
     try:
         os.makedirs(directory)
     except OSError as e:
diff --git a/poky/bitbake/lib/toaster/orm/fixtures/settings.xml b/poky/bitbake/lib/toaster/orm/fixtures/settings.xml
index ab3ea02..02c26a6 100644
--- a/poky/bitbake/lib/toaster/orm/fixtures/settings.xml
+++ b/poky/bitbake/lib/toaster/orm/fixtures/settings.xml
@@ -12,7 +12,7 @@
   </object>
   <object model="orm.toastersetting" pk="4">
     <field type="CharField" name="name">DEFCONF_MACHINE</field>
-    <field type="CharField" name="value">qemux86</field>
+    <field type="CharField" name="value">qemux86-64</field>
   </object>
   <object model="orm.toastersetting" pk="5">
     <field type="CharField" name="name">DEFCONF_SSTATE_DIR</field>
diff --git a/poky/bitbake/lib/toaster/orm/migrations/0021_eventlogsimports.py b/poky/bitbake/lib/toaster/orm/migrations/0021_eventlogsimports.py
new file mode 100644
index 0000000..328eb57
--- /dev/null
+++ b/poky/bitbake/lib/toaster/orm/migrations/0021_eventlogsimports.py
@@ -0,0 +1,22 @@
+# Generated by Django 4.2.5 on 2023-11-23 18:44
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('orm', '0020_models_bigautofield'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='EventLogsImports',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=255)),
+                ('imported', models.BooleanField(default=False)),
+                ('build_id', models.IntegerField(blank=True, null=True)),
+            ],
+        ),
+    ]
diff --git a/poky/bitbake/lib/toaster/orm/models.py b/poky/bitbake/lib/toaster/orm/models.py
index 1098ad3..19c9686 100644
--- a/poky/bitbake/lib/toaster/orm/models.py
+++ b/poky/bitbake/lib/toaster/orm/models.py
@@ -1868,6 +1868,15 @@
     def __unicode__(self):
         return "Distro " + self.name + "(" + self.description + ")"
 
+class EventLogsImports(models.Model):
+    name = models.CharField(max_length=255)
+    imported = models.BooleanField(default=False)
+    build_id = models.IntegerField(blank=True, null=True)
+
+    def __str__(self):
+        return self.name
+
+
 django.db.models.signals.post_save.connect(invalidate_cache)
 django.db.models.signals.post_delete.connect(invalidate_cache)
 django.db.models.signals.m2m_changed.connect(invalidate_cache)
diff --git a/poky/bitbake/lib/toaster/pytest.ini b/poky/bitbake/lib/toaster/pytest.ini
index f07076b..071c65f 100644
--- a/poky/bitbake/lib/toaster/pytest.ini
+++ b/poky/bitbake/lib/toaster/pytest.ini
@@ -1,9 +1,5 @@
 # -- FILE: pytest.ini (or tox.ini)
 [pytest]
-DJANGO_SETTINGS_MODULE = toastermain.settings_test
-
-python_files = db/test_*.py commands/test_*.py views/test_*.py browser/test_*.py functional/test_*.py
-
 # --create-db - force re creation of the test database
 # https://pytest-django.readthedocs.io/en/latest/database.html#create-db-force-re-creation-of-the-test-database
 
@@ -17,3 +13,4 @@
 # https://pypi.org/project/pytest-env/
 env =
     TOASTER_BUILDSERVER=1
+    DJANGO_SETTINGS_MODULE=toastermain.settings_test
diff --git a/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py b/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py
index d9ea7fd..562fede 100644
--- a/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py
+++ b/poky/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py
@@ -19,12 +19,15 @@
 import time
 import unittest
 
+import pytest
 from selenium import webdriver
+from selenium.webdriver.support import expected_conditions as EC
 from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.common.by import By
 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 from selenium.common.exceptions import NoSuchElementException, \
-        StaleElementReferenceException, TimeoutException
+        StaleElementReferenceException, TimeoutException, \
+        SessionNotCreatedException
 
 def create_selenium_driver(cls,browser='chrome'):
     # set default browser string based on env (if available)
@@ -34,12 +37,31 @@
 
     if browser == 'chrome':
         options = webdriver.ChromeOptions()
-        options.add_argument('headless')
+        options.add_argument('--headless')
         options.add_argument('--disable-infobars')
         options.add_argument('--disable-dev-shm-usage')
         options.add_argument('--no-sandbox')
         options.add_argument('--remote-debugging-port=9222')
-        return webdriver.Chrome(options=options)
+        try:
+            return webdriver.Chrome(options=options)
+        except SessionNotCreatedException as e:
+            exit_message = "Halting tests prematurely to avoid cascading errors."
+            # check if chrome / chromedriver exists
+            chrome_path = os.popen("find ~/.cache/selenium/chrome/ -name 'chrome' -type f -print -quit").read().strip()
+            if not chrome_path:
+                pytest.exit(f"Failed to install/find chrome.\n{exit_message}")
+            chromedriver_path = os.popen("find ~/.cache/selenium/chromedriver/ -name 'chromedriver' -type f -print -quit").read().strip()
+            if not chromedriver_path:
+                pytest.exit(f"Failed to install/find chromedriver.\n{exit_message}")
+            # check if depends on each are fulfilled
+            depends_chrome = os.popen(f"ldd {chrome_path} | grep 'not found'").read().strip()
+            if depends_chrome:
+                pytest.exit(f"Missing chrome dependencies.\n{depends_chrome}\n{exit_message}")
+            depends_chromedriver = os.popen(f"ldd {chromedriver_path} | grep 'not found'").read().strip()
+            if depends_chromedriver:
+                pytest.exit(f"Missing chromedriver dependencies.\n{depends_chromedriver}\n{exit_message}")
+            # print original error otherwise
+            pytest.exit(f"Failed to start chromedriver.\n{e}\n{exit_message}")
     elif browser == 'firefox':
         return webdriver.Firefox()
     elif browser == 'marionette':
@@ -145,6 +167,8 @@
         """ Clean up webdriver driver """
 
         cls.driver.quit()
+        # Allow driver resources to be properly freed before proceeding with further tests
+        time.sleep(5)
         super(SeleniumTestCaseBase, cls).tearDownClass()
 
     def get(self, url):
@@ -182,6 +206,8 @@
         is_present = lambda driver: self.find(selector)
         msg = 'An element matching "%s" should be on the page' % selector
         element = Wait(self.driver, poll=poll).until(is_present, msg)
+        if poll > 2:
+            time.sleep(poll)  # element need more delay to be present
         return element
 
     def wait_until_visible(self, selector, poll=1):
@@ -192,6 +218,19 @@
         time.sleep(poll)  # wait for visibility to settle
         return self.find(selector)
 
+    def wait_until_clickable(self, selector, poll=1):
+        """ Wait until element matching CSS selector is visible on the page """
+        WebDriverWait(
+            self.driver,
+            Wait._TIMEOUT,
+            poll_frequency=poll
+        ).until(
+            EC.element_to_be_clickable((By.ID, selector.removeprefix('#')
+                                        )
+                                       )
+        )
+        return self.find(selector)
+
     def wait_until_focused(self, selector):
         """ Wait until element matching CSS selector has focus """
         is_focused = \
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py b/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py
index 4e9b9fd..7019b3d 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_all_builds_page.py
@@ -7,8 +7,8 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import os
 import re
-import time
 
 from django.urls import reverse
 from selenium.webdriver.support.select import Select
@@ -28,7 +28,8 @@
     CLI_BUILDS_PROJECT_NAME = 'command line builds'
 
     def setUp(self):
-        bbv = BitbakeVersion.objects.create(name='bbv1', giturl='/tmp/',
+        builldir = os.environ.get('BUILDDIR', './')
+        bbv = BitbakeVersion.objects.create(name='bbv1', giturl=f'{builldir}/',
                                             branch='master', dirpath='')
         release = Release.objects.create(name='release1',
                                          bitbake_version=bbv)
@@ -74,7 +75,7 @@
             '[data-role="data-recent-build-buildtime-field"]' % build.id
 
         # because this loads via Ajax, wait for it to be visible
-        self.wait_until_present(selector)
+        self.wait_until_visible(selector)
 
         build_time_spans = self.find_all(selector)
 
@@ -84,7 +85,7 @@
 
     def _get_row_for_build(self, build):
         """ Get the table row for the build from the all builds table """
-        self.wait_until_present('#allbuildstable')
+        self.wait_until_visible('#allbuildstable')
 
         rows = self.find_all('#allbuildstable tr')
 
@@ -174,7 +175,7 @@
 
         url = reverse('all-builds')
         self.get(url)
-        self.wait_until_present('td[class="target"]')
+        self.wait_until_visible('td[class="target"]')
 
         cell = self.find('td[class="target"]')
         content = cell.get_attribute('innerHTML')
@@ -198,8 +199,8 @@
         self.get(url)
 
         # should see a rebuild button for non-command-line builds
+        self.wait_until_visible('#allbuildstable tbody tr')
         selector = 'div[data-latest-build-result="%s"] .rebuild-btn' % build1.id
-        time.sleep(2)
         run_again_button = self.find_all(selector)
         self.assertEqual(len(run_again_button), 1,
                          'should see a rebuild button for non-cli builds')
@@ -260,25 +261,25 @@
         element = self._get_build_time_element(build1)
         links = element.find_elements(By.CSS_SELECTOR, 'a')
         msg = 'should be a link on the build time for a successful recent build'
-        self.assertEquals(len(links), 1, msg)
+        self.assertEqual(len(links), 1, msg)
 
         # test recent builds area for failed build
         element = self._get_build_time_element(build2)
         links = element.find_elements(By.CSS_SELECTOR, 'a')
         msg = 'should not be a link on the build time for a failed recent build'
-        self.assertEquals(len(links), 0, msg)
+        self.assertEqual(len(links), 0, msg)
 
         # test the time column for successful build
         build1_row = self._get_row_for_build(build1)
         links = build1_row.find_elements(By.CSS_SELECTOR, 'td.time a')
         msg = 'should be a link on the build time for a successful build'
-        self.assertEquals(len(links), 1, msg)
+        self.assertEqual(len(links), 1, msg)
 
         # test the time column for failed build
         build2_row = self._get_row_for_build(build2)
         links = build2_row.find_elements(By.CSS_SELECTOR, 'td.time a')
         msg = 'should not be a link on the build time for a failed build'
-        self.assertEquals(len(links), 0, msg)
+        self.assertEqual(len(links), 0, msg)
 
     def test_builds_table_search_box(self):
         """ Test the search box in the builds table on the all builds page """
@@ -288,7 +289,7 @@
         self.get(url)
 
         # Check search box is present and works
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
         search_box = self.find('#search-input-allbuildstable')
         self.assertTrue(search_box.is_displayed())
 
@@ -296,24 +297,37 @@
         search_box.send_keys('foo')
         search_btn = self.find('#search-submit-allbuildstable')
         search_btn.click()
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
         rows = self.find_all('#allbuildstable tbody tr')
         self.assertTrue(len(rows) >= 1)
 
     def test_filtering_on_failure_tasks_column(self):
         """ Test the filtering on failure tasks column in the builds table on the all builds page """
+        def _check_if_filter_failed_tasks_column_is_visible():
+            # check if failed tasks filter column is visible, if not click on it
+            # Check edit column
+            edit_column = self.find('#edit-columns-button')
+            self.assertTrue(edit_column.is_displayed())
+            edit_column.click()
+            # Check dropdown is visible
+            self.wait_until_visible('ul.dropdown-menu.editcol')
+            filter_fails_task_checkbox = self.find('#checkbox-failed_tasks')
+            if not filter_fails_task_checkbox.is_selected():
+                filter_fails_task_checkbox.click()
+            edit_column.click()
+
         self._get_create_builds(success=10, failure=10)
 
         url = reverse('all-builds')
         self.get(url)
 
         # Check filtering on failure tasks column
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
+        _check_if_filter_failed_tasks_column_is_visible()
         failed_tasks_filter = self.find('#failed_tasks_filter')
         failed_tasks_filter.click()
         # Check popup is visible
-        time.sleep(1)
-        self.wait_until_present('#filter-modal-allbuildstable')
+        self.wait_until_visible('#filter-modal-allbuildstable')
         self.assertTrue(
             self.find('#filter-modal-allbuildstable').is_displayed())
         # Check that we can filter by failure tasks
@@ -322,7 +336,7 @@
         build_without_failure_tasks.click()
         # click on apply button
         self.find('#filter-modal-allbuildstable .btn-primary').click()
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
         # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class
         self.assertTrue(self.find('#failed_tasks_filter').get_attribute(
             'class').find('btn-primary') != -1)
@@ -335,12 +349,11 @@
         self.get(url)
 
         # Check filtering on failure tasks column
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
         completed_on_filter = self.find('#completed_on_filter')
         completed_on_filter.click()
         # Check popup is visible
-        time.sleep(1)
-        self.wait_until_present('#filter-modal-allbuildstable')
+        self.wait_until_visible('#filter-modal-allbuildstable')
         self.assertTrue(
             self.find('#filter-modal-allbuildstable').is_displayed())
         # Check that we can filter by failure tasks
@@ -349,28 +362,26 @@
         build_without_failure_tasks.click()
         # click on apply button
         self.find('#filter-modal-allbuildstable .btn-primary').click()
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
         # Check if filter is applied, by checking if completed_on_filter has btn-primary class
         self.assertTrue(self.find('#completed_on_filter').get_attribute(
             'class').find('btn-primary') != -1)
 
         # Filter by date range
         self.find('#completed_on_filter').click()
-        self.wait_until_present('#filter-modal-allbuildstable')
+        self.wait_until_visible('#filter-modal-allbuildstable')
         date_ranges = self.driver.find_elements(
             By.XPATH, '//input[@class="form-control hasDatepicker"]')
         today = timezone.now()
         yestersday = today - timezone.timedelta(days=1)
-        time.sleep(1)
         date_ranges[0].send_keys(yestersday.strftime('%Y-%m-%d'))
         date_ranges[1].send_keys(today.strftime('%Y-%m-%d'))
         self.find('#filter-modal-allbuildstable .btn-primary').click()
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
         self.assertTrue(self.find('#completed_on_filter').get_attribute(
             'class').find('btn-primary') != -1)
         # Check if filter is applied, number of builds displayed should be 6
-        time.sleep(1)
-        self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6)
+        self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) >= 4)
 
     def test_builds_table_editColumn(self):
         """ Test the edit column feature in the builds table on the all builds page """
@@ -414,7 +425,7 @@
                 )
         url = reverse('all-builds')
         self.get(url)
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
 
         # Check edit column
         edit_column = self.find('#edit-columns-button')
@@ -439,15 +450,14 @@
         def test_show_rows(row_to_show, show_row_link):
             # Check that we can show rows == row_to_show
             show_row_link.select_by_value(str(row_to_show))
-            self.wait_until_present('#allbuildstable tbody tr')
-            time.sleep(1)
+            self.wait_until_visible('#allbuildstable tbody tr', poll=2)
             self.assertTrue(
                 len(self.find_all('#allbuildstable tbody tr')) == row_to_show
             )
 
         url = reverse('all-builds')
         self.get(url)
-        self.wait_until_present('#allbuildstable tbody tr')
+        self.wait_until_visible('#allbuildstable tbody tr')
 
         show_rows = self.driver.find_elements(
             By.XPATH,
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py b/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py
index a880dbc..6540dfa 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_all_projects_page.py
@@ -7,8 +7,8 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import os
 import re
-import time
 
 from django.urls import reverse
 from django.utils import timezone
@@ -20,6 +20,7 @@
 
 from selenium.webdriver.common.by import By
 
+
 class TestAllProjectsPage(SeleniumTestCase):
     """ Browser tests for projects page /projects/ """
 
@@ -29,7 +30,8 @@
 
     def setUp(self):
         """ Add default project manually """
-        project = Project.objects.create_project(self.CLI_BUILDS_PROJECT_NAME, None)
+        project = Project.objects.create_project(
+            self.CLI_BUILDS_PROJECT_NAME, None)
         self.default_project = project
         self.default_project.is_default = True
         self.default_project.save()
@@ -60,12 +62,14 @@
 
     def _add_non_default_project(self):
         """ Add another project """
-        bbv = BitbakeVersion.objects.create(name='test bbv', giturl='/tmp/',
+        builldir = os.environ.get('BUILDDIR', './')
+        bbv = BitbakeVersion.objects.create(name='test bbv', giturl=f'{builldir}/',
                                             branch='master', dirpath='')
         self.release = Release.objects.create(name='test release',
                                               branch_name='master',
                                               bitbake_version=bbv)
-        self.project = Project.objects.create_project(self.PROJECT_NAME, self.release)
+        self.project = Project.objects.create_project(
+            self.PROJECT_NAME, self.release)
         self.project.is_default = False
         self.project.save()
 
@@ -77,7 +81,7 @@
 
     def _get_row_for_project(self, project_name):
         """ Get the HTML row for a project, or None if not found """
-        self.wait_until_present('#projectstable tbody tr')
+        self.wait_until_visible('#projectstable tbody tr', poll=3)
         rows = self.find_all('#projectstable tbody tr')
 
         # find the row with a project name matching the one supplied
@@ -108,7 +112,8 @@
         url = reverse('all-projects')
         self.get(url)
 
-        default_project_row = self._get_row_for_project(self.default_project.name)
+        default_project_row = self._get_row_for_project(
+            self.default_project.name)
 
         self.assertNotEqual(default_project_row, None,
                             'default project "cli builds" should be in page')
@@ -128,7 +133,8 @@
         self.wait_until_visible("#projectstable tr")
 
         # find the row for the default project
-        default_project_row = self._get_row_for_project(self.default_project.name)
+        default_project_row = self._get_row_for_project(
+            self.default_project.name)
 
         # check the release text for the default project
         selector = 'span[data-project-field="release"] span.text-muted'
@@ -163,7 +169,8 @@
         self.wait_until_visible("#projectstable tr")
 
         # find the row for the default project
-        default_project_row = self._get_row_for_project(self.default_project.name)
+        default_project_row = self._get_row_for_project(
+            self.default_project.name)
 
         # check the machine cell for the default project
         selector = 'span[data-project-field="machine"] span.text-muted'
@@ -198,13 +205,15 @@
         self.get(reverse('all-projects'))
 
         # find the row for the default project
-        default_project_row = self._get_row_for_project(self.default_project.name)
+        default_project_row = self._get_row_for_project(
+            self.default_project.name)
 
         # check the link on the name field
         selector = 'span[data-project-field="name"] a'
         element = default_project_row.find_element(By.CSS_SELECTOR, selector)
         link_url = element.get_attribute('href').strip()
-        expected_url = reverse('projectbuilds', args=(self.default_project.id,))
+        expected_url = reverse(
+            'projectbuilds', args=(self.default_project.id,))
         msg = 'link on default project name should point to builds but was %s' % link_url
         self.assertTrue(link_url.endswith(expected_url), msg)
 
@@ -227,7 +236,7 @@
         self.get(url)
 
         # Chseck search box is present and works
-        self.wait_until_present('#projectstable tbody tr')
+        self.wait_until_visible('#projectstable tbody tr', poll=3)
         search_box = self.find('#search-input-projectstable')
         self.assertTrue(search_box.is_displayed())
 
@@ -235,8 +244,7 @@
         search_box.send_keys('test project 10')
         search_btn = self.find('#search-submit-projectstable')
         search_btn.click()
-        self.wait_until_present('#projectstable tbody tr')
-        time.sleep(1)
+        self.wait_until_visible('#projectstable tbody tr', poll=3)
         rows = self.find_all('#projectstable tbody tr')
         self.assertTrue(len(rows) == 1)
 
@@ -282,7 +290,7 @@
                 )
         url = reverse('all-projects')
         self.get(url)
-        self.wait_until_present('#projectstable tbody tr')
+        self.wait_until_visible('#projectstable tbody tr', poll=3)
 
         # Check edit column
         edit_column = self.find('#edit-columns-button')
@@ -305,19 +313,14 @@
         def test_show_rows(row_to_show, show_row_link):
             # Check that we can show rows == row_to_show
             show_row_link.select_by_value(str(row_to_show))
-            self.wait_until_present('#projectstable tbody tr')
-            sleep_time = 1
-            if row_to_show == 150:
-                # wait more time for 150 rows
-                sleep_time = 2
-            time.sleep(sleep_time)
+            self.wait_until_visible('#projectstable tbody tr', poll=3)
             self.assertTrue(
                 len(self.find_all('#projectstable tbody tr')) == row_to_show
             )
 
         url = reverse('all-projects')
         self.get(url)
-        self.wait_until_present('#projectstable tbody tr')
+        self.wait_until_visible('#projectstable tbody tr', poll=3)
 
         show_rows = self.driver.find_elements(
             By.XPATH,
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py b/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py
index 1afa4a4..b713f30 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py
@@ -7,6 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import os
 from django.urls import reverse
 from django.utils import timezone
 
@@ -21,7 +22,8 @@
     """ Tests for the build dashboard /build/X """
 
     def setUp(self):
-        bbv = BitbakeVersion.objects.create(name='bbv1', giturl='/tmp/',
+        builldir = os.environ.get('BUILDDIR', './')
+        bbv = BitbakeVersion.objects.create(name='bbv1', giturl=f'{builldir}/',
                                             branch='master', dirpath="")
         release = Release.objects.create(name='release1',
                                          bitbake_version=bbv)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.py b/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.py
index c6226d6..675825b 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.py
@@ -7,6 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import os
 from django.urls import reverse
 from django.utils import timezone
 
@@ -20,7 +21,8 @@
     """ Tests for artifacts on the build dashboard /build/X """
 
     def setUp(self):
-        bbv = BitbakeVersion.objects.create(name='bbv1', giturl='/tmp/',
+        builldir = os.environ.get('BUILDDIR', './')
+        bbv = BitbakeVersion.objects.create(name='bbv1', giturl=f'{builldir}/',
                                             branch='master', dirpath="")
         release = Release.objects.create(name='release1',
                                          bitbake_version=bbv)
@@ -197,12 +199,12 @@
         # check package count and size, link on target name
         selector = '[data-value="target-package-count"]'
         element = self.find(selector)
-        self.assertEquals(element.text, '1',
+        self.assertEqual(element.text, '1',
             'package count should be shown for image builds')
 
         selector = '[data-value="target-package-size"]'
         element = self.find(selector)
-        self.assertEquals(element.text, '1.0 KB',
+        self.assertEqual(element.text, '1.0 KB',
             'package size should be shown for image builds')
 
         selector = '[data-link="target-packages"]'
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py b/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py
index 7ec52a4..8fe5fea 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_landing_page.py
@@ -14,6 +14,7 @@
 
 from orm.models import Layer, Layer_Version, Project, Build
 
+
 class TestLandingPage(SeleniumTestCase):
     """ Tests for redirects on the landing page """
 
@@ -40,7 +41,7 @@
 
         # check that the info sign is clickable
         # and info modal is appearing when clicking on the info sign
-        info_sign.click() # click on the info sign make attribute 'aria-describedby' visible
+        info_sign.click()  # click on the info sign make attribute 'aria-describedby' visible
         info_model_id = info_sign.get_attribute('aria-describedby')
         info_modal = self.find(f'#{info_model_id}')
         self.assertTrue(info_modal.is_displayed())
@@ -55,7 +56,7 @@
         self.assertTrue(documentation_link.is_displayed())
 
         # check browser open new tab toaster manual when clicking on the documentation link
-        self.assertEqual(documentation_link.get_attribute('target') , '_blank')
+        self.assertEqual(documentation_link.get_attribute('target'), '_blank')
         self.assertEqual(
             documentation_link.get_attribute('href'),
             'http://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual')
@@ -81,7 +82,8 @@
         bitbake = jumbotron.find_element(By.LINK_TEXT, 'BitBake')
         self.assertTrue(bitbake.is_displayed())
         bitbake.click()
-        self.assertTrue("docs.yoctoproject.org/bitbake.html" in self.driver.current_url)
+        self.assertTrue(
+            "docs.yoctoproject.org/bitbake.html" in self.driver.current_url)
 
     def test_yoctoproject_jumbotron_link_visible_and_clickable(self):
         """ Test Yocto Project link jumbotron is visible and clickable: """
@@ -103,11 +105,12 @@
 
         # check Big magenta button
         big_magenta_button = jumbotron.find_element(By.LINK_TEXT,
-            'Toaster is ready to capture your command line builds'
-        )
+                                                    'Toaster is ready to capture your command line builds'
+                                                    )
         self.assertTrue(big_magenta_button.is_displayed())
         big_magenta_button.click()
-        self.assertTrue("docs.yoctoproject.org/toaster-manual/setup-and-use.html#setting-up-and-using-toaster" in self.driver.current_url)
+        self.assertTrue(
+            "docs.yoctoproject.org/toaster-manual/setup-and-use.html#setting-up-and-using-toaster" in self.driver.current_url)
 
     def test_link_create_new_project_in_jumbotron_visible_and_clickable(self):
         """ Test big blue button create new project jumbotron if visible and clickable """
@@ -120,8 +123,8 @@
 
         # check Big Blue button
         big_blue_button = jumbotron.find_element(By.LINK_TEXT,
-            'Create your first Toaster project to run manage builds'
-        )
+                                                 'Create your first Toaster project to run manage builds'
+                                                 )
         self.assertTrue(big_blue_button.is_displayed())
         big_blue_button.click()
         self.assertTrue("toastergui/newproject/" in self.driver.current_url)
@@ -132,10 +135,12 @@
         jumbotron = self.find('.jumbotron')
 
         # check Read the Toaster manual
-        toaster_manual = jumbotron.find_element(By.LINK_TEXT, 'Read the Toaster manual')
+        toaster_manual = jumbotron.find_element(
+            By.LINK_TEXT, 'Read the Toaster manual')
         self.assertTrue(toaster_manual.is_displayed())
         toaster_manual.click()
-        self.assertTrue("https://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual" in self.driver.current_url)
+        self.assertTrue(
+            "https://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual" in self.driver.current_url)
 
     def test_contrib_to_toaster_link_visible_and_clickable(self):
         """ Test Contribute to Toaster link jumbotron is visible and clickable: """
@@ -143,10 +148,12 @@
         jumbotron = self.find('.jumbotron')
 
         # check Contribute to Toaster
-        contribute_to_toaster = jumbotron.find_element(By.LINK_TEXT, 'Contribute to Toaster')
+        contribute_to_toaster = jumbotron.find_element(
+            By.LINK_TEXT, 'Contribute to Toaster')
         self.assertTrue(contribute_to_toaster.is_displayed())
         contribute_to_toaster.click()
-        self.assertTrue("wiki.yoctoproject.org/wiki/contribute_to_toaster" in str(self.driver.current_url).lower())
+        self.assertTrue(
+            "wiki.yoctoproject.org/wiki/contribute_to_toaster" in str(self.driver.current_url).lower())
 
     def test_only_default_project(self):
         """
@@ -206,10 +213,9 @@
 
         self.get(reverse('landing'))
 
+        self.wait_until_visible("#latest-builds", poll=3)
         elements = self.find_all('#allbuildstable')
         self.assertEqual(len(elements), 1, 'should redirect to builds')
         content = self.get_page_source()
         self.assertTrue(self.PROJECT_NAME in content,
                         'should show builds for project %s' % self.PROJECT_NAME)
-        self.assertFalse(self.CLI_BUILDS_PROJECT_NAME in content,
-                         'should not show builds for cli project')
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py b/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py
index cb7b915..9deef67 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py
@@ -8,6 +8,7 @@
 #
 
 from django.urls import reverse
+from selenium.common.exceptions import ElementClickInterceptedException, TimeoutException
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 from orm.models import Layer, Layer_Version, Project, LayerSource, Release
@@ -68,6 +69,7 @@
         check that the new values exist"""
 
         self.get(self.url)
+        self.wait_until_visible("#add-remove-layer-btn")
 
         self.click("#add-remove-layer-btn")
         self.click("#edit-layer-source")
@@ -105,7 +107,18 @@
         for save_btn in self.find_all(".change-btn"):
             save_btn.click()
 
-        self.click("#save-changes-for-switch")
+        try:
+            self.wait_until_visible("#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch = self.wait_until_clickable(
+                "#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch.click()
+        except ElementClickInterceptedException:
+            self.skipTest(
+                "save-changes-for-switch click intercepted. Element not visible or maybe covered by another element.")
+        except TimeoutException:
+            self.skipTest(
+                "save-changes-for-switch is not clickable within the specified timeout.")
+
         self.wait_until_visible("#edit-layer-source")
 
         # Refresh the page to see if the new values are returned
@@ -134,7 +147,18 @@
         new_dir = "/home/test/my-meta-dir"
         dir_input.send_keys(new_dir)
 
-        self.click("#save-changes-for-switch")
+        try:
+            self.wait_until_visible("#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch = self.wait_until_clickable(
+                "#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch.click()
+        except ElementClickInterceptedException:
+            self.skipTest(
+                "save-changes-for-switch click intercepted. Element not properly visible or maybe behind another element.")
+        except TimeoutException:
+            self.skipTest(
+                "save-changes-for-switch is not clickable within the specified timeout.")
+
         self.wait_until_visible("#edit-layer-source")
 
         # Refresh the page to see if the new values are returned
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py b/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py
index 949a947..d7a4c34 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py
@@ -6,7 +6,6 @@
 #
 # Copyright (C) 2013-2016 Intel Corporation
 #
-import time
 from django.urls import reverse
 from django.utils import timezone
 from tests.browser.selenium_helpers import SeleniumTestCase
@@ -47,7 +46,7 @@
         # build queued; check shown as queued
         selector = base_selector + '[data-build-state="Queued"]'
         element = self.wait_until_visible(selector)
-        self.assertRegexpMatches(element.get_attribute('innerHTML'),
+        self.assertRegex(element.get_attribute('innerHTML'),
             'Build queued', 'build should show queued status')
 
         # waiting for recipes to be parsed
@@ -97,7 +96,7 @@
 
         selector = base_selector + '[data-build-state="Starting"]'
         element = self.wait_until_visible(selector)
-        self.assertRegexpMatches(element.get_attribute('innerHTML'),
+        self.assertRegex(element.get_attribute('innerHTML'),
             'Tasks starting', 'build should show "tasks starting" status')
 
         # first task finished; check tasks progress bar
@@ -186,7 +185,7 @@
         selector = '[data-latest-build-result="%s"] ' \
             '[data-build-state="Cancelling"]' % build.id
         element = self.wait_until_visible(selector)
-        self.assertRegexpMatches(element.get_attribute('innerHTML'),
+        self.assertRegex(element.get_attribute('innerHTML'),
             'Cancelling the build', 'build should show "cancelling" status')
 
         # check cancelled state
@@ -198,5 +197,5 @@
         selector = '[data-latest-build-result="%s"] ' \
             '[data-build-state="Cancelled"]' % build.id
         element = self.wait_until_visible(selector)
-        self.assertRegexpMatches(element.get_attribute('innerHTML'),
+        self.assertRegex(element.get_attribute('innerHTML'),
             'Build cancelled', 'build should show "cancelled" status')
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py b/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py
index 34d1bd4..4ad22c7 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py
@@ -45,10 +45,11 @@
         )
 
         # add a fake image recipe to the layer that can be customised
+        builldir = os.environ.get('BUILDDIR', './')
         self.recipe = Recipe.objects.create(
             name='core-image-minimal',
             layer_version=layer_version,
-            file_path='/tmp/core-image-minimal.bb',
+            file_path=f'{builldir}/core-image-minimal.bb',
             is_image=True
         )
         # create a tmp file for the recipe
@@ -136,7 +137,7 @@
         """
         self._create_custom_image(self.recipe.name)
         element = self.wait_until_visible('#invalid-name-help')
-        self.assertRegexpMatches(element.text.strip(),
+        self.assertRegex(element.text.strip(),
                                  'image with this name already exists')
 
     def test_new_duplicates_project_image(self):
@@ -154,4 +155,4 @@
         self._create_custom_image(custom_image_name)
         element = self.wait_until_visible('#invalid-name-help')
         expected = 'An image with this name already exists in this project'
-        self.assertRegexpMatches(element.text.strip(), expected)
+        self.assertRegex(element.text.strip(), expected)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_new_project_page.py b/poky/bitbake/lib/toaster/tests/browser/test_new_project_page.py
index f4b2708..0c33c44 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_new_project_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_new_project_page.py
@@ -6,8 +6,6 @@
 #
 # SPDX-License-Identifier: GPL-2.0-only
 #
-import time
-
 from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 from selenium.webdriver.support.ui import Select
@@ -54,13 +52,12 @@
         select = Select(self.find('#projectversion'))
         select.select_by_value(str(self.release.pk))
 
-        time.sleep(1)
         self.click("#create-project-button")
-        time.sleep(2)
 
         # We should get redirected to the new project's page with the
         # notification at the top
-        element = self.wait_until_visible('#project-created-notification')
+        element = self.wait_until_visible(
+            '#project-created-notification', poll=3)
 
         self.assertTrue(project_name in element.text,
                         "New project name not in new project notification")
@@ -91,9 +88,8 @@
         radio.click()
 
         self.click("#create-project-button")
-        time.sleep(2)
 
-        element = self.wait_until_visible('#hint-error-project-name')
+        element = self.wait_until_visible('#hint-error-project-name', poll=3)
 
         self.assertTrue(("Project names must be unique" in element.text),
                         "Did not find unique project name error message")
@@ -105,7 +101,6 @@
         except InvalidElementStateException:
             pass
 
-        time.sleep(2)
         self.assertTrue(
             (Project.objects.filter(name=project_name).count() == 1),
             "New project not found in database")
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_project_builds_page.py b/poky/bitbake/lib/toaster/tests/browser/test_project_builds_page.py
index 51717e7..0dba33b 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_project_builds_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_project_builds_page.py
@@ -7,6 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import os
 import re
 
 from django.urls import reverse
@@ -22,7 +23,8 @@
     CLI_BUILDS_PROJECT_NAME = 'command line builds'
 
     def setUp(self):
-        bbv = BitbakeVersion.objects.create(name='bbv1', giturl='/tmp/',
+        builldir = os.environ.get('BUILDDIR', './')
+        bbv = BitbakeVersion.objects.create(name='bbv1', giturl=f'{builldir}/',
                                             branch='master', dirpath='')
         release = Release.objects.create(name='release1',
                                          bitbake_version=bbv)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_project_config_page.py b/poky/bitbake/lib/toaster/tests/browser/test_project_config_page.py
index 7b21460..b9de541 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_project_config_page.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_project_config_page.py
@@ -7,6 +7,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import os
 from django.urls import reverse
 from tests.browser.selenium_helpers import SeleniumTestCase
 
@@ -22,7 +23,8 @@
         'any of these characters'
 
     def setUp(self):
-        bbv = BitbakeVersion.objects.create(name='bbv1', giturl='/tmp/',
+        builldir = os.environ.get('BUILDDIR', './')
+        bbv = BitbakeVersion.objects.create(name='bbv1', giturl=f'{builldir}/',
                                             branch='master', dirpath='')
         release = Release.objects.create(name='release1',
                                          bitbake_version=bbv)
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_sample.py b/poky/bitbake/lib/toaster/tests/browser/test_sample.py
index 7397377..f04f1d9 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_sample.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_sample.py
@@ -32,6 +32,7 @@
         """ Test that a message is shown when there are no builds """
         url = reverse('all-builds')
         self.get(url)
+        self.wait_until_visible('#empty-state-allbuildstable')  # wait for the empty state div to appear
         div_msg = self.find('#empty-state-allbuildstable .alert-info')
 
         msg = 'Sorry - no data found'
diff --git a/poky/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py b/poky/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py
index e00c30a..691aca1 100644
--- a/poky/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py
+++ b/poky/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py
@@ -8,6 +8,7 @@
 #
 
 from datetime import datetime
+import os
 
 from django.urls import reverse
 from django.utils import timezone
@@ -59,7 +60,8 @@
         later = now + timezone.timedelta(hours=1)
         even_later = later + timezone.timedelta(hours=1)
 
-        bbv = BitbakeVersion.objects.create(name='test bbv', giturl='/tmp/',
+        builldir = os.environ.get('BUILDDIR', './')
+        bbv = BitbakeVersion.objects.create(name='test bbv', giturl=f'{builldir}/',
                                             branch='master', dirpath='')
         release = Release.objects.create(name='test release',
                                          branch_name='master',
diff --git a/poky/bitbake/lib/toaster/tests/builds/buildtest.py b/poky/bitbake/lib/toaster/tests/builds/buildtest.py
index 53cd7a9..cacfccd 100644
--- a/poky/bitbake/lib/toaster/tests/builds/buildtest.py
+++ b/poky/bitbake/lib/toaster/tests/builds/buildtest.py
@@ -88,7 +88,7 @@
 class BuildTest(unittest.TestCase):
 
     PROJECT_NAME = "Testbuild"
-    BUILDDIR = "/tmp/build/"
+    BUILDDIR = os.environ.get("BUILDDIR")
 
     def build(self, target):
         # So that the buildinfo helper uses the test database'
@@ -116,7 +116,7 @@
         project = Project.objects.create_project(name=BuildTest.PROJECT_NAME,
                                                  release=release)
 
-        passthrough_variable_names = ["SSTATE_DIR", "DL_DIR"]
+        passthrough_variable_names = ["SSTATE_DIR", "DL_DIR", "SSTATE_MIRRORS", "BB_HASHSERVE", "BB_HASHSERVE_UPSTREAM"]
         for variable_name in passthrough_variable_names:
             current_variable = os.environ.get(variable_name)
             if current_variable:
@@ -128,7 +128,7 @@
         if os.environ.get("TOASTER_TEST_USE_SSTATE_MIRROR"):
             ProjectVariable.objects.get_or_create(
                 name="SSTATE_MIRRORS",
-                value="file://.* http://sstate.yoctoproject.org/PATH;downloadfilename=PATH",
+                value="file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH",
                 project=project)
 
         ProjectTarget.objects.create(project=project,
diff --git a/poky/bitbake/lib/toaster/tests/builds/test_core_image_min.py b/poky/bitbake/lib/toaster/tests/builds/test_core_image_min.py
index 9cdaa15..c5bfdbf 100644
--- a/poky/bitbake/lib/toaster/tests/builds/test_core_image_min.py
+++ b/poky/bitbake/lib/toaster/tests/builds/test_core_image_min.py
@@ -10,6 +10,7 @@
 # Ionut Chisanovici, Paul Eggleton and Cristian Iorga
 
 import os
+import pytest
 
 from django.db.models import Q
 
@@ -20,13 +21,13 @@
 
 from tests.builds.buildtest import BuildTest
 
-
+@pytest.mark.order(4)
+@pytest.mark.django_db(True)
 class BuildCoreImageMinimal(BuildTest):
     """Build core-image-minimal and test the results"""
 
     def setUp(self):
-        self.completed_build = self.build("core-image-minimal")
-        self.built = self.target_already_built("core-image-minimal")
+        self.completed_build = self.target_already_built("core-image-minimal")
 
     # Check if build name is unique - tc_id=795
     def test_Build_Unique_Name(self):
@@ -45,17 +46,6 @@
                          total_builds,
                          msg='Build cooker log path is not unique')
 
-    # Check if task order is unique for one build - tc=824
-    def test_Task_Unique_Order(self):
-        total_task_order = Task.objects.filter(
-            build=self.built).values('order').count()
-        distinct_task_order = Task.objects.filter(
-            build=self.completed_build).values('order').distinct().count()
-
-        self.assertEqual(total_task_order,
-                         distinct_task_order,
-                         msg='Errors task order is not unique')
-
     # Check task order sequence for one build - tc=825
     def test_Task_Order_Sequence(self):
         cnt_err = []
@@ -99,7 +89,6 @@
                                                         'task_name',
                                                         'sstate_result')
         cnt_err = []
-
         for task in tasks:
             if (task['sstate_result'] != Task.SSTATE_NA and
                     task['sstate_result'] != Task.SSTATE_MISS):
@@ -222,6 +211,7 @@
     # orm_build.outcome=0 then if the file exists and its size matches
     # the file_size value. Need to add the tc in the test run
     def test_Target_File_Name_Populated(self):
+        cnt_err = []
         builds = Build.objects.filter(outcome=0).values('id')
         for build in builds:
             targets = Target.objects.filter(
@@ -231,7 +221,6 @@
                     target_id=target['id']).values('id',
                                                    'file_name',
                                                    'file_size')
-                cnt_err = []
                 for file_info in target_files:
                     target_id = file_info['id']
                     target_file_name = file_info['file_name']
diff --git a/poky/bitbake/lib/toaster/tests/commands/test_loaddata.py b/poky/bitbake/lib/toaster/tests/commands/test_loaddata.py
index 9e8d555..7d04f03 100644
--- a/poky/bitbake/lib/toaster/tests/commands/test_loaddata.py
+++ b/poky/bitbake/lib/toaster/tests/commands/test_loaddata.py
@@ -6,13 +6,13 @@
 #
 # SPDX-License-Identifier: GPL-2.0-only
 #
-
+import pytest
 from django.test import TestCase
 from django.core import management
 
 from orm.models import Layer_Version, Layer, Release, ToasterSetting
 
-
+@pytest.mark.order(2)
 class TestLoadDataFixtures(TestCase):
     """ Test loading our 3 provided fixtures """
     def test_run_loaddata_poky_command(self):
diff --git a/poky/bitbake/lib/toaster/tests/commands/test_lsupdates.py b/poky/bitbake/lib/toaster/tests/commands/test_lsupdates.py
index 3c4fbe0..30c6eeb 100644
--- a/poky/bitbake/lib/toaster/tests/commands/test_lsupdates.py
+++ b/poky/bitbake/lib/toaster/tests/commands/test_lsupdates.py
@@ -7,12 +7,13 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import pytest
 from django.test import TestCase
 from django.core import management
 
 from orm.models import Layer_Version, Machine, Recipe
 
-
+@pytest.mark.order(3)
 class TestLayerIndexUpdater(TestCase):
     def test_run_lsupdates_command(self):
         # Load some release information for us to fetch from the layer index
diff --git a/poky/bitbake/lib/toaster/tests/commands/test_runbuilds.py b/poky/bitbake/lib/toaster/tests/commands/test_runbuilds.py
index c77d6cf..849c227 100644
--- a/poky/bitbake/lib/toaster/tests/commands/test_runbuilds.py
+++ b/poky/bitbake/lib/toaster/tests/commands/test_runbuilds.py
@@ -19,6 +19,8 @@
 import subprocess
 import signal
 
+import logging
+
 
 class KillRunbuilds(threading.Thread):
     """ Kill the runbuilds process after an amount of time """
@@ -34,9 +36,12 @@
         pidfile_path = os.path.join(os.environ.get("BUILDDIR", "."),
                                     ".runbuilds.pid")
 
-        with open(pidfile_path) as pidfile:
-            pid = pidfile.read()
-            os.kill(int(pid), signal.SIGTERM)
+        try:
+            with open(pidfile_path) as pidfile:
+                pid = pidfile.read()
+                os.kill(int(pid), signal.SIGTERM)
+        except ProcessLookupError:
+            logging.warning("Runbuilds not running or already killed")
 
 
 class TestCommands(TestCase):
diff --git a/poky/bitbake/lib/toaster/tests/db/test_db.py b/poky/bitbake/lib/toaster/tests/db/test_db.py
index 0410422..072ab94 100644
--- a/poky/bitbake/lib/toaster/tests/db/test_db.py
+++ b/poky/bitbake/lib/toaster/tests/db/test_db.py
@@ -23,6 +23,7 @@
 # SOFTWARE.
 
 import sys
+import pytest
 
 try:
     from StringIO import StringIO
@@ -47,7 +48,7 @@
 def makemigrations():
     management.call_command('makemigrations')
 
-
+@pytest.mark.order(1)
 class MigrationTest(TestCase):
 
     def testPendingMigration(self):
diff --git a/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py b/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py
index b80d403..7c20437 100644
--- a/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py
+++ b/poky/bitbake/lib/toaster/tests/functional/functional_helpers.py
@@ -11,7 +11,6 @@
 import logging
 import subprocess
 import signal
-import time
 import re
 
 from tests.browser.selenium_helpers_base import SeleniumTestCaseBase
@@ -19,26 +18,48 @@
 from selenium.common.exceptions import NoSuchElementException
 
 logger = logging.getLogger("toaster")
+toaster_processes = []
 
 class SeleniumFunctionalTestCase(SeleniumTestCaseBase):
-    wait_toaster_time = 5
+    wait_toaster_time = 10
 
     @classmethod
     def setUpClass(cls):
         # So that the buildinfo helper uses the test database'
         if os.environ.get('DJANGO_SETTINGS_MODULE', '') != \
             'toastermain.settings_test':
-            raise RuntimeError("Please initialise django with the tests settings:  " \
+            raise RuntimeError("Please initialise django with the tests settings:  "
                 "DJANGO_SETTINGS_MODULE='toastermain.settings_test'")
 
+        # Wait for any known toaster processes to exit
+        global toaster_processes
+        for toaster_process in toaster_processes:
+            try:
+                os.waitpid(toaster_process, os.WNOHANG)
+            except ChildProcessError:
+                pass
+
         # start toaster
         cmd = "bash -c 'source toaster start'"
-        p = subprocess.Popen(
+        start_process = subprocess.Popen(
             cmd,
             cwd=os.environ.get("BUILDDIR"),
             shell=True)
-        if p.wait() != 0:
-            raise RuntimeError("Can't initialize toaster")
+        toaster_processes = [start_process.pid]
+        if start_process.wait() != 0:
+            port_use = os.popen("lsof -i -P -n | grep '8000 (LISTEN)'").read().strip()
+            message = ''
+            if port_use:
+                process_id = port_use.split()[1]
+                process = os.popen(f"ps -o cmd= -p {process_id}").read().strip()
+                message = f"Port 8000 occupied by {process}"
+            raise RuntimeError(f"Can't initialize toaster. {message}")
+
+        builddir = os.environ.get("BUILDDIR")
+        with open(os.path.join(builddir, '.toastermain.pid'), 'r') as f:
+            toaster_processes.append(int(f.read()))
+        with open(os.path.join(builddir, '.runbuilds.pid'), 'r') as f:
+            toaster_processes.append(int(f.read()))
 
         super(SeleniumFunctionalTestCase, cls).setUpClass()
         cls.live_server_url = 'http://localhost:8000/'
@@ -47,22 +68,30 @@
     def tearDownClass(cls):
         super(SeleniumFunctionalTestCase, cls).tearDownClass()
 
-        # XXX: source toaster stop gets blocked, to review why?
-        # from now send SIGTERM by hand
-        time.sleep(cls.wait_toaster_time)
-        builddir = os.environ.get("BUILDDIR")
+        global toaster_processes
 
-        with open(os.path.join(builddir, '.toastermain.pid'), 'r') as f:
-            toastermain_pid = int(f.read())
-            os.kill(toastermain_pid, signal.SIGTERM)
-        with open(os.path.join(builddir, '.runbuilds.pid'), 'r') as f:
-            runbuilds_pid = int(f.read())
-            os.kill(runbuilds_pid, signal.SIGTERM)
+        cmd = "bash -c 'source toaster stop'"
+        stop_process = subprocess.Popen(
+            cmd,
+            cwd=os.environ.get("BUILDDIR"),
+            shell=True)
+        # Toaster stop has been known to hang in these tests so force kill if it stalls
+        try:
+            if stop_process.wait(cls.wait_toaster_time) != 0:
+                raise Exception('Toaster stop process failed')
+        except Exception as e:
+            if e is subprocess.TimeoutExpired:
+                print('Toaster stop process took too long. Force killing toaster...')
+            else:
+                print('Toaster stop process failed. Force killing toaster...')
+            stop_process.kill()
+            for toaster_process in toaster_processes:
+                os.kill(toaster_process, signal.SIGTERM)
 
 
     def get_URL(self):
          rc=self.get_page_source()
-         project_url=re.search("(projectPageUrl\s:\s\")(.*)(\",)",rc)
+         project_url=re.search(r"(projectPageUrl\s:\s\")(.*)(\",)",rc)
          return project_url.group(2)
 
 
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py b/poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py
index dc7d1fc..9f88010 100644
--- a/poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py
+++ b/poky/bitbake/lib/toaster/tests/functional/test_create_new_project.py
@@ -16,6 +16,7 @@
 
 
 @pytest.mark.django_db
+@pytest.mark.order("last")
 class TestCreateNewProject(SeleniumFunctionalTestCase):
 
     def _create_test_new_project(
@@ -48,7 +49,7 @@
 
         self.driver.find_element(By.ID, "create-project-button").click()
 
-        element = self.wait_until_visible('#project-created-notification')
+        element = self.wait_until_visible('#project-created-notification', poll=3)
         self.assertTrue(
             self.element_exists('#project-created-notification'),
             f"Project:{project_name} creation notification not shown"
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py b/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py
index f558cce..e4070fb 100644
--- a/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py
+++ b/poky/bitbake/lib/toaster/tests/functional/test_functional_basic.py
@@ -7,97 +7,111 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
-import re, time
+import re
 from django.urls import reverse
 import pytest
 from tests.functional.functional_helpers import SeleniumFunctionalTestCase
 from orm.models import Project
 from selenium.webdriver.common.by import By
 
+from tests.functional.utils import get_projectId_from_url
 
-@pytest.mark.order("last")
+
+@pytest.mark.django_db
+@pytest.mark.order("second_to_last")
 class FuntionalTestBasic(SeleniumFunctionalTestCase):
+    """Basic functional tests for Toaster"""
+    project_id = None
+
+    def setUp(self):
+        super(FuntionalTestBasic, self).setUp()
+        if not FuntionalTestBasic.project_id:
+            self._create_slenium_project()
+            current_url = self.driver.current_url
+            FuntionalTestBasic.project_id = get_projectId_from_url(current_url)
 
 #   testcase (1514)
-    @pytest.mark.django_db
-    def test_create_slenium_project(self):
+    def _create_slenium_project(self):
         project_name = 'selenium-project'
         self.get(reverse('newproject'))
+        self.wait_until_visible('#new-project-name', poll=3)
         self.driver.find_element(By.ID, "new-project-name").send_keys(project_name)
         self.driver.find_element(By.ID, 'projectversion').click()
         self.driver.find_element(By.ID, "create-project-button").click()
-        time.sleep(2)
-        element = self.wait_until_visible('#project-created-notification')
+        element = self.wait_until_visible('#project-created-notification', poll=10)
         self.assertTrue(self.element_exists('#project-created-notification'),'Project creation notification not shown')
         self.assertTrue(project_name in element.text,
                         "New project name not in new project notification")
         self.assertTrue(Project.objects.filter(name=project_name).count(),
                         "New project not found in database")
+        return Project.objects.last().id
 
  #  testcase (1515)
     def test_verify_left_bar_menu(self):
         self.get(reverse('all-projects'))
-        self.wait_until_visible('#projectstable')
+        self.wait_until_present('#projectstable', poll=10)
         self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
-        time.sleep(2)
+        self.wait_until_present('#config-nav', poll=10)
         self.assertTrue(self.element_exists('#config-nav'),'Configuration Tab does not exist')
         project_URL=self.get_URL()
         self.driver.find_element(By.XPATH, '//a[@href="'+project_URL+'"]').click()
-        time.sleep(2)
+        self.wait_until_present('#config-nav', poll=10)
 
         try:
             self.driver.find_element(By.XPATH, "//*[@id='config-nav']/ul/li/a[@href="+'"'+project_URL+'customimages/"'+"]").click()
-            time.sleep(2)
+            self.wait_until_present('#config-nav', poll=10)
             self.assertTrue(re.search("Custom images",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'Custom images information is not loading properly')
         except:
             self.fail(msg='No Custom images tab available')
 
         try:
             self.driver.find_element(By.XPATH, "//*[@id='config-nav']/ul/li/a[@href="+'"'+project_URL+'images/"'+"]").click()
+            self.wait_until_present('#config-nav', poll=10)
             self.assertTrue(re.search("Compatible image recipes",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'The Compatible image recipes information is not loading properly')
         except:
             self.fail(msg='No Compatible image tab available')
 
         try:
             self.driver.find_element(By.XPATH, "//*[@id='config-nav']/ul/li/a[@href="+'"'+project_URL+'softwarerecipes/"'+"]").click()
+            self.wait_until_present('#config-nav', poll=10)
             self.assertTrue(re.search("Compatible software recipes",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'The Compatible software recipe information is not loading properly')
         except:
             self.fail(msg='No Compatible software recipe tab available')
 
         try:
             self.driver.find_element(By.XPATH, "//*[@id='config-nav']/ul/li/a[@href="+'"'+project_URL+'machines/"'+"]").click()
+            self.wait_until_present('#config-nav', poll=10)
             self.assertTrue(re.search("Compatible machines",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'The Compatible machine information is not loading properly')
         except:
             self.fail(msg='No Compatible machines tab available')
 
         try:
             self.driver.find_element(By.XPATH, "//*[@id='config-nav']/ul/li/a[@href="+'"'+project_URL+'layers/"'+"]").click()
+            self.wait_until_present('#config-nav', poll=10)
             self.assertTrue(re.search("Compatible layers",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'The Compatible layer information is not loading properly')
         except:
             self.fail(msg='No Compatible layers tab available')
 
         try:
             self.driver.find_element(By.XPATH, "//*[@id='config-nav']/ul/li/a[@href="+'"'+project_URL+'configuration"'+"]").click()
+            self.wait_until_present('#config-nav', poll=10)
             self.assertTrue(re.search("Bitbake variables",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'The Bitbake variables information is not loading properly')
         except:
             self.fail(msg='No Bitbake variables tab available')
 
 #   testcase (1516)
     def test_review_configuration_information(self):
-        self.get('')
-        self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
-        time.sleep(2)
-        self.wait_until_visible('#projectstable')
+        self.get(reverse('all-projects'))
+        self.wait_until_present('#projectstable', poll=10)
         self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
         project_URL=self.get_URL()
-        time.sleep(2)
+        self.wait_until_present('#config-nav', poll=10)
         try:
            self.assertTrue(self.element_exists('#machine-section'),'Machine section for the project configuration page does not exist')
-           self.assertTrue(re.search("qemux86",self.driver.find_element(By.XPATH, "//span[@id='project-machine-name']").text),'The machine type is not assigned')
+           self.assertTrue(re.search("qemux86-64",self.driver.find_element(By.XPATH, "//span[@id='project-machine-name']").text),'The machine type is not assigned')
            self.driver.find_element(By.XPATH, "//span[@id='change-machine-toggle']").click()
-           time.sleep(2)
-           self.wait_until_visible('#select-machine-form')
-           self.wait_until_visible('#cancel-machine-change')
+           self.wait_until_visible('#select-machine-form', poll=10)
+           self.wait_until_visible('#cancel-machine-change', poll=10)
            self.driver.find_element(By.XPATH, "//form[@id='select-machine-form']/a[@id='cancel-machine-change']").click()
         except:
            self.fail(msg='The machine information is wrong in the configuration page')
@@ -131,49 +145,42 @@
 
 #   testcase (1517)
     def test_verify_machine_information(self):
-        self.get('')
-        self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
-        time.sleep(2)
-        self.wait_until_visible('#projectstable')
+        self.get(reverse('all-projects'))
+        self.wait_until_present('#projectstable', poll=10)
         self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
-        time.sleep(2)
+        self.wait_until_present('#config-nav', poll=10)
 
         try:
             self.assertTrue(self.element_exists('#machine-section'),'Machine section for the project configuration page does not exist')
-            self.assertTrue(re.search("qemux86",self.driver.find_element(By.ID, "project-machine-name").text),'The machine type is not assigned')
+            self.assertTrue(re.search("qemux86-64",self.driver.find_element(By.ID, "project-machine-name").text),'The machine type is not assigned')
             self.driver.find_element(By.ID, "change-machine-toggle").click()
-            time.sleep(2)
-            self.wait_until_visible('#select-machine-form')
-            self.wait_until_visible('#cancel-machine-change')
+            self.wait_until_visible('#select-machine-form', poll=10)
+            self.wait_until_visible('#cancel-machine-change', poll=10)
             self.driver.find_element(By.ID, "cancel-machine-change").click()
         except:
             self.fail(msg='The machine information is wrong in the configuration page')
 
 #   testcase (1518)
     def test_verify_most_built_recipes_information(self):
-        self.get('')
-        self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
-        time.sleep(2)
-        self.wait_until_visible('#projectstable')
+        self.get(reverse('all-projects'))
+        self.wait_until_present('#projectstable', poll=10)
         self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
+        self.wait_until_present('#config-nav', poll=10)
         project_URL=self.get_URL()
-        time.sleep(2)
         try:
             self.assertTrue(re.search("You haven't built any recipes yet",self.driver.find_element(By.ID, "no-most-built").text),'Default message of no builds is not present')
             self.driver.find_element(By.XPATH, "//div[@id='no-most-built']/p/a[@href="+'"'+project_URL+'images/"'+"]").click()
-            time.sleep(2)
+            self.wait_until_present('#config-nav', poll=10)
             self.assertTrue(re.search("Compatible image recipes",self.driver.find_element(By.XPATH, "//div[@class='col-md-10']").text),'The Choose a recipe to build link  is not working  properly')
         except:
             self.fail(msg='No Most built information in project detail page')
 
 #   testcase (1519)
     def test_verify_project_release_information(self):
-        self.get('')
-        self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
-        time.sleep(2)
-        self.wait_until_visible('#projectstable')
+        self.get(reverse('all-projects'))
+        self.wait_until_present('#projectstable', poll=10)
         self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
-        time.sleep(2)
+        self.wait_until_present('#config-nav', poll=10)
 
         try:
             self.assertTrue(re.search("Yocto Project master",self.driver.find_element(By.ID, "project-release-title").text),'The project release is not defined')
@@ -182,12 +189,11 @@
 
 #   testcase (1520)
     def test_verify_layer_information(self):
-        self.get('')
-        self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
-        self.wait_until_visible('#projectstable')
+        self.get(reverse('all-projects'))
+        self.wait_until_present('#projectstable', poll=10)
         self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
+        self.wait_until_present('#config-nav', poll=10)
         project_URL=self.get_URL()
-        time.sleep(2)
         try:
            self.driver.find_element(By.XPATH, "//div[@id='layer-container']")
            self.assertTrue(re.search("3",self.driver.find_element(By.ID, "project-layers-count").text),'There should be 3 layers listed in the layer count')
@@ -213,18 +219,18 @@
 
 #   testcase (1521)
     def test_verify_project_detail_links(self):
-        self.get('')
-        self.driver.find_element(By.XPATH, "//div[@id='global-nav']/ul/li/a[@href="+'"'+'/toastergui/projects/'+'"'+"]").click()
-        time.sleep(2)
-        self.wait_until_visible('#projectstable')
+        self.get(reverse('all-projects'))
+        self.wait_until_present('#projectstable', poll=10)
         self.find_element_by_link_text_in_table('projectstable', 'selenium-project').click()
+        self.wait_until_present('#config-nav', poll=10)
         project_URL=self.get_URL()
-        time.sleep(2)
         self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li[@id='topbar-configuration-tab']/a[@href="+'"'+project_URL+'"'+"]").click()
+        self.wait_until_present('#config-nav', poll=10)
         self.assertTrue(re.search("Configuration",self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li[@id='topbar-configuration-tab']/a[@href="+'"'+project_URL+'"'+"]").text), 'Configuration tab in project topbar is misspelled')
 
         try:
             self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li/a[@href="+'"'+project_URL+'builds/"'+"]").click()
+            self.wait_until_visible('#project-topbar', poll=10)
             self.assertTrue(re.search("Builds",self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li/a[@href="+'"'+project_URL+'builds/"'+"]").text), 'Builds tab in project topbar is misspelled')
             self.driver.find_element(By.XPATH, "//div[@id='empty-state-projectbuildstable']")
         except:
@@ -232,6 +238,7 @@
 
         try:
             self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li/a[@href="+'"'+project_URL+'importlayer"'+"]").click()
+            self.wait_until_visible('#project-topbar', poll=10)
             self.assertTrue(re.search("Import layer",self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li/a[@href="+'"'+project_URL+'importlayer"'+"]").text), 'Import layer tab in project topbar is misspelled')
             self.driver.find_element(By.XPATH, "//fieldset[@id='repo-select']")
             self.driver.find_element(By.XPATH, "//fieldset[@id='git-repo']")
@@ -240,6 +247,7 @@
 
         try:
             self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li/a[@href="+'"'+project_URL+'newcustomimage/"'+"]").click()
+            self.wait_until_visible('#project-topbar', poll=10)
             self.assertTrue(re.search("New custom image",self.driver.find_element(By.XPATH, "//div[@id='project-topbar']/ul[@class='nav nav-tabs']/li/a[@href="+'"'+project_URL+'newcustomimage/"'+"]").text), 'New custom image tab in project topbar is misspelled')
             self.assertTrue(re.search("Select the image recipe you want to customise",self.driver.find_element(By.XPATH, "//div[@class='col-md-12']/h2").text),'The new custom image tab is not loading correctly')
         except:
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_project_config.py b/poky/bitbake/lib/toaster/tests/functional/test_project_config.py
new file mode 100644
index 0000000..dbee36a
--- /dev/null
+++ b/poky/bitbake/lib/toaster/tests/functional/test_project_config.py
@@ -0,0 +1,341 @@
+#! /usr/bin/env python3 #
+# BitBake Toaster UI tests implementation
+#
+# Copyright (C) 2023 Savoir-faire Linux
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+import string
+import random
+import pytest
+from django.urls import reverse
+from selenium.webdriver import Keys
+from selenium.webdriver.support.select import Select
+from selenium.common.exceptions import TimeoutException
+from tests.functional.functional_helpers import SeleniumFunctionalTestCase
+from selenium.webdriver.common.by import By
+
+from .utils import get_projectId_from_url
+
+
+@pytest.mark.django_db
+@pytest.mark.order("last")
+class TestProjectConfig(SeleniumFunctionalTestCase):
+    project_id = None
+    PROJECT_NAME = 'TestProjectConfig'
+    INVALID_PATH_START_TEXT = 'The directory path should either start with a /'
+    INVALID_PATH_CHAR_TEXT = 'The directory path cannot include spaces or ' \
+        'any of these characters'
+
+    def _create_project(self, project_name):
+        """ Create/Test new project using:
+          - Project Name: Any string
+          - Release: Any string
+          - Merge Toaster settings: True or False
+        """
+        self.get(reverse('newproject'))
+        self.wait_until_visible('#new-project-name', poll=2)
+        self.find("#new-project-name").send_keys(project_name)
+        select = Select(self.find("#projectversion"))
+        select.select_by_value('3')
+
+        # check merge toaster settings
+        checkbox = self.find('.checkbox-mergeattr')
+        if not checkbox.is_selected():
+            checkbox.click()
+
+        if self.PROJECT_NAME != 'TestProjectConfig':
+            # Reset project name if it's not the default one
+            self.PROJECT_NAME = 'TestProjectConfig'
+
+        self.find("#create-project-button").click()
+
+        try:
+            self.wait_until_visible('#hint-error-project-name', poll=2)
+            url = reverse('project', args=(TestProjectConfig.project_id, ))
+            self.get(url)
+            self.wait_until_visible('#config-nav', poll=3)
+        except TimeoutException:
+            self.wait_until_visible('#config-nav', poll=3)
+
+    def _random_string(self, length):
+        return ''.join(
+            random.choice(string.ascii_letters) for _ in range(length)
+        )
+
+    def _get_config_nav_item(self, index):
+        config_nav = self.find('#config-nav')
+        return config_nav.find_elements(By.TAG_NAME, 'li')[index]
+
+    def _navigate_bbv_page(self):
+        """ Navigate to project BitBake variables page """
+        # check if the menu is displayed
+        if TestProjectConfig.project_id is None:
+            self._create_project(project_name=self._random_string(10))
+            current_url = self.driver.current_url
+            TestProjectConfig.project_id = get_projectId_from_url(current_url)
+        else:
+            url = reverse('projectconf', args=(TestProjectConfig.project_id,))
+            self.get(url)
+        self.wait_until_visible('#config-nav', poll=3)
+        bbv_page_link = self._get_config_nav_item(9)
+        bbv_page_link.click()
+        self.wait_until_visible('#config-nav', poll=3)
+
+    def test_no_underscore_iamgefs_type(self):
+        """
+        Should not accept IMAGEFS_TYPE with an underscore
+        """
+        self._navigate_bbv_page()
+        imagefs_type = "foo_bar"
+
+        self.wait_until_visible('#change-image_fstypes-icon', poll=2)
+
+        self.click('#change-image_fstypes-icon')
+
+        self.enter_text('#new-imagefs_types', imagefs_type)
+
+        element = self.wait_until_visible('#hintError-image-fs_type', poll=2)
+
+        self.assertTrue(("A valid image type cannot include underscores" in element.text),
+                        "Did not find underscore error message")
+
+    def test_checkbox_verification(self):
+        """
+        Should automatically check the checkbox if user enters value
+        text box, if value is there in the checkbox.
+        """
+        self._navigate_bbv_page()
+
+        imagefs_type = "btrfs"
+
+        self.wait_until_visible('#change-image_fstypes-icon', poll=2)
+
+        self.click('#change-image_fstypes-icon')
+
+        self.enter_text('#new-imagefs_types', imagefs_type)
+
+        checkboxes = self.driver.find_elements(By.XPATH, "//input[@class='fs-checkbox-fstypes']")
+
+        for checkbox in checkboxes:
+            if checkbox.get_attribute("value") == "btrfs":
+               self.assertEqual(checkbox.is_selected(), True)
+
+    def test_textbox_with_checkbox_verification(self):
+        """
+        Should automatically add or remove value in textbox, if user checks
+        or unchecks checkboxes.
+        """
+        self._navigate_bbv_page()
+
+        self.wait_until_visible('#change-image_fstypes-icon', poll=2)
+
+        self.click('#change-image_fstypes-icon')
+
+        checkboxes_selector = '.fs-checkbox-fstypes'
+
+        self.wait_until_visible(checkboxes_selector, poll=2)
+        checkboxes = self.find_all(checkboxes_selector)
+
+        for checkbox in checkboxes:
+            if checkbox.get_attribute("value") == "cpio":
+               checkbox.click()
+               element = self.driver.find_element(By.ID, 'new-imagefs_types')
+
+               self.wait_until_visible('#new-imagefs_types', poll=2)
+
+               self.assertTrue(("cpio" in element.get_attribute('value'),
+                               "Imagefs not added into the textbox"))
+               checkbox.click()
+               self.assertTrue(("cpio" not in element.text),
+                               "Image still present in the textbox")
+
+    def test_set_download_dir(self):
+        """
+        Validate the allowed and disallowed types in the directory field for
+        DL_DIR
+        """
+        self._navigate_bbv_page()
+
+        # activate the input to edit download dir
+        try:
+            change_dl_dir_btn = self.wait_until_visible('#change-dl_dir-icon', poll=2)
+        except TimeoutException:
+            # If download dir is not displayed, test is skipped
+            change_dl_dir_btn = None
+
+        if change_dl_dir_btn:
+            change_dl_dir_btn = self.wait_until_visible('#change-dl_dir-icon', poll=2)
+            change_dl_dir_btn.click()
+
+            # downloads dir path doesn't start with / or ${...}
+            input_field = self.wait_until_visible('#new-dl_dir', poll=2)
+            input_field.clear()
+            self.enter_text('#new-dl_dir', 'home/foo')
+            element = self.wait_until_visible('#hintError-initialChar-dl_dir', poll=2)
+
+            msg = 'downloads directory path starts with invalid character but ' \
+                'treated as valid'
+            self.assertTrue((self.INVALID_PATH_START_TEXT in element.text), msg)
+
+            # downloads dir path has a space
+            self.driver.find_element(By.ID, 'new-dl_dir').clear()
+            self.enter_text('#new-dl_dir', '/foo/bar a')
+
+            element = self.wait_until_visible('#hintError-dl_dir', poll=2)
+            msg = 'downloads directory path characters invalid but treated as valid'
+            self.assertTrue((self.INVALID_PATH_CHAR_TEXT in element.text), msg)
+
+            # downloads dir path starts with ${...} but has a space
+            self.driver.find_element(By.ID,'new-dl_dir').clear()
+            self.enter_text('#new-dl_dir', '${TOPDIR}/down foo')
+
+            element = self.wait_until_visible('#hintError-dl_dir', poll=2)
+            msg = 'downloads directory path characters invalid but treated as valid'
+            self.assertTrue((self.INVALID_PATH_CHAR_TEXT in element.text), msg)
+
+            # downloads dir path starts with /
+            self.driver.find_element(By.ID,'new-dl_dir').clear()
+            self.enter_text('#new-dl_dir', '/bar/foo')
+
+            hidden_element = self.driver.find_element(By.ID,'hintError-dl_dir')
+            self.assertEqual(hidden_element.is_displayed(), False,
+                'downloads directory path valid but treated as invalid')
+
+            # downloads dir path starts with ${...}
+            self.driver.find_element(By.ID,'new-dl_dir').clear()
+            self.enter_text('#new-dl_dir', '${TOPDIR}/down')
+
+            hidden_element = self.driver.find_element(By.ID,'hintError-dl_dir')
+            self.assertEqual(hidden_element.is_displayed(), False,
+                'downloads directory path valid but treated as invalid')
+
+    def test_set_sstate_dir(self):
+        """
+        Validate the allowed and disallowed types in the directory field for
+        SSTATE_DIR
+        """
+        self._navigate_bbv_page()
+
+        try:
+            btn_chg_sstate_dir = self.wait_until_visible(
+                '#change-sstate_dir-icon',
+                poll=2
+            )
+            self.click('#change-sstate_dir-icon')
+        except TimeoutException:
+            # If sstate_dir is not displayed, test is skipped
+            btn_chg_sstate_dir = None
+
+        if btn_chg_sstate_dir:  # Skip continuation if sstate_dir is not displayed
+            # path doesn't start with / or ${...}
+            input_field = self.wait_until_visible('#new-sstate_dir', poll=2)
+            input_field.clear()
+            self.enter_text('#new-sstate_dir', 'home/foo')
+            element = self.wait_until_visible('#hintError-initialChar-sstate_dir', poll=2)
+
+            msg = 'sstate directory path starts with invalid character but ' \
+                'treated as valid'
+            self.assertTrue((self.INVALID_PATH_START_TEXT in element.text), msg)
+
+            # path has a space
+            self.driver.find_element(By.ID, 'new-sstate_dir').clear()
+            self.enter_text('#new-sstate_dir', '/foo/bar a')
+
+            element = self.wait_until_visible('#hintError-sstate_dir', poll=2)
+            msg = 'sstate directory path characters invalid but treated as valid'
+            self.assertTrue((self.INVALID_PATH_CHAR_TEXT in element.text), msg)
+
+            # path starts with ${...} but has a space
+            self.driver.find_element(By.ID,'new-sstate_dir').clear()
+            self.enter_text('#new-sstate_dir', '${TOPDIR}/down foo')
+
+            element = self.wait_until_visible('#hintError-sstate_dir', poll=2)
+            msg = 'sstate directory path characters invalid but treated as valid'
+            self.assertTrue((self.INVALID_PATH_CHAR_TEXT in element.text), msg)
+
+            # path starts with /
+            self.driver.find_element(By.ID,'new-sstate_dir').clear()
+            self.enter_text('#new-sstate_dir', '/bar/foo')
+
+            hidden_element = self.driver.find_element(By.ID, 'hintError-sstate_dir')
+            self.assertEqual(hidden_element.is_displayed(), False,
+                'sstate directory path valid but treated as invalid')
+
+            # paths starts with ${...}
+            self.driver.find_element(By.ID, 'new-sstate_dir').clear()
+            self.enter_text('#new-sstate_dir', '${TOPDIR}/down')
+
+            hidden_element = self.driver.find_element(By.ID, 'hintError-sstate_dir')
+            self.assertEqual(hidden_element.is_displayed(), False,
+                'sstate directory path valid but treated as invalid')
+
+    def _change_bbv_value(self, **kwargs):
+        var_name, field, btn_id, input_id, value, save_btn, *_ = kwargs.values()
+        """ Change bitbake variable value """
+        self._navigate_bbv_page()
+        self.wait_until_visible(f'#{btn_id}', poll=2)
+        if kwargs.get('new_variable'):
+            self.find(f"#{btn_id}").clear()
+            self.enter_text(f"#{btn_id}", f"{var_name}")
+        else:
+            self.click(f'#{btn_id}')
+            self.wait_until_visible(f'#{input_id}', poll=2)
+
+        if kwargs.get('is_select'):
+            select = Select(self.find(f'#{input_id}'))
+            select.select_by_visible_text(value)
+        else:
+            self.find(f"#{input_id}").clear()
+            self.enter_text(f'#{input_id}', f'{value}')
+        self.click(f'#{save_btn}')
+        value_displayed = str(self.wait_until_visible(f'#{field}').text).lower()
+        msg = f'{var_name} variable not changed'
+        self.assertTrue(str(value).lower() in value_displayed, msg)
+
+    def test_change_distro_var(self):
+        """ Test changing distro variable """
+        self._change_bbv_value(
+            var_name='DISTRO',
+            field='distro',
+            btn_id='change-distro-icon',
+            input_id='new-distro',
+            value='poky-changed',
+            save_btn="apply-change-distro",
+        )
+
+    def test_set_image_install_append_var(self):
+        """ Test setting IMAGE_INSTALL:append variable """
+        self._change_bbv_value(
+            var_name='IMAGE_INSTALL:append',
+            field='image_install',
+            btn_id='change-image_install-icon',
+            input_id='new-image_install',
+            value='bash, apt, busybox',
+            save_btn="apply-change-image_install",
+        )
+
+    def test_set_package_classes_var(self):
+        """ Test setting PACKAGE_CLASSES variable """
+        self._change_bbv_value(
+            var_name='PACKAGE_CLASSES',
+            field='package_classes',
+            btn_id='change-package_classes-icon',
+            input_id='package_classes-select',
+            value='package_deb',
+            save_btn="apply-change-package_classes",
+            is_select=True,
+        )
+
+    def test_create_new_bbv(self):
+        """ Test creating new bitbake variable """
+        self._change_bbv_value(
+            var_name='New_Custom_Variable',
+            field='configvar-list',
+            btn_id='variable',
+            input_id='value',
+            value='new variable value',
+            save_btn="add-configvar-button",
+            new_variable=True
+        )
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_project_page.py b/poky/bitbake/lib/toaster/tests/functional/test_project_page.py
index 03f64f8..31177cc 100644
--- a/poky/bitbake/lib/toaster/tests/functional/test_project_page.py
+++ b/poky/bitbake/lib/toaster/tests/functional/test_project_page.py
@@ -6,88 +6,89 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import os
 import random
 import string
+from unittest import skip
 import pytest
-from time import sleep
 from django.urls import reverse
 from django.utils import timezone
 from selenium.webdriver.common.keys import Keys
 from selenium.webdriver.support.select import Select
-from selenium.common.exceptions import NoSuchElementException, TimeoutException
+from selenium.common.exceptions import TimeoutException
 from tests.functional.functional_helpers import SeleniumFunctionalTestCase
 from orm.models import Build, Project, Target
 from selenium.webdriver.common.by import By
 
+from .utils import get_projectId_from_url, wait_until_build, wait_until_build_cancelled
+
 
 @pytest.mark.django_db
+@pytest.mark.order("last")
 class TestProjectPage(SeleniumFunctionalTestCase):
+    project_id = None
+    PROJECT_NAME = 'TestProjectPage'
 
-    def setUp(self):
-        super().setUp()
-        release = '3'
-        project_name = 'project_' + self.generate_random_string()
-        self._create_test_new_project(
-            project_name,
-            release,
-            False,
-        )
-
-    def generate_random_string(self, length=10):
-        characters = string.ascii_letters + string.digits  # alphabetic and numerical characters
-        random_string = ''.join(random.choice(characters) for _ in range(length))
-        return random_string
-
-    def _create_test_new_project(
-        self,
-        project_name,
-        release,
-        merge_toaster_settings,
-    ):
+    def _create_project(self, project_name):
         """ Create/Test new project using:
           - Project Name: Any string
           - Release: Any string
           - Merge Toaster settings: True or False
         """
         self.get(reverse('newproject'))
-        self.driver.find_element(By.ID,
-                                 "new-project-name").send_keys(project_name)
-
-        select = Select(self.find('#projectversion'))
-        select.select_by_value(release)
+        self.wait_until_visible('#new-project-name')
+        self.find("#new-project-name").send_keys(project_name)
+        select = Select(self.find("#projectversion"))
+        select.select_by_value('3')
 
         # check merge toaster settings
         checkbox = self.find('.checkbox-mergeattr')
-        if merge_toaster_settings:
-            if not checkbox.is_selected():
-                checkbox.click()
-        else:
-            if checkbox.is_selected():
-                checkbox.click()
+        if not checkbox.is_selected():
+            checkbox.click()
 
-        self.driver.find_element(By.ID, "create-project-button").click()
+        if self.PROJECT_NAME != 'TestProjectPage':
+            # Reset project name if it's not the default one
+            self.PROJECT_NAME = 'TestProjectPage'
+
+        self.find("#create-project-button").click()
+
+        try:
+            self.wait_until_visible('#hint-error-project-name')
+            url = reverse('project', args=(TestProjectPage.project_id, ))
+            self.get(url)
+            self.wait_until_visible('#config-nav', poll=3)
+        except TimeoutException:
+            self.wait_until_visible('#config-nav', poll=3)
+
+    def _random_string(self, length):
+        return ''.join(
+            random.choice(string.ascii_letters) for _ in range(length)
+        )
+
+    def _navigate_to_project_page(self):
+        # Navigate to project page
+        if TestProjectPage.project_id is None:
+            self._create_project(project_name=self._random_string(10))
+            current_url = self.driver.current_url
+            TestProjectPage.project_id = get_projectId_from_url(current_url)
+        else:
+            url = reverse('project', args=(TestProjectPage.project_id,))
+            self.get(url)
+        self.wait_until_visible('#config-nav')
 
     def _get_create_builds(self, **kwargs):
         """ Create a build and return the build object """
         # parameters for builds to associate with the projects
         now = timezone.now()
-        release = '3'
-        project_name = 'projectmaster'
-        self._create_test_new_project(
-            project_name+"2",
-            release,
-            False,
-        )
-
         self.project1_build_success = {
-            'project': Project.objects.get(id=1),
+            'project': Project.objects.get(id=TestProjectPage.project_id),
             'started_on': now,
             'completed_on': now,
             'outcome': Build.SUCCEEDED
         }
 
         self.project1_build_failure = {
-            'project': Project.objects.get(id=1),
+            'project': Project.objects.get(id=TestProjectPage.project_id),
             'started_on': now,
             'completed_on': now,
             'outcome': Build.FAILED
@@ -180,9 +181,7 @@
 
     def _navigate_to_config_nav(self, nav_id, nav_index):
         # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
-        self.wait_until_visible('#config-nav')
+        self._navigate_to_project_page()
         # click on "Software recipe" tab
         soft_recipe = self._get_config_nav_item(nav_index)
         soft_recipe.click()
@@ -211,29 +210,6 @@
                 if row_to_show not in to_skip:
                     test_show_rows(row_to_show, show_row_link)
 
-    def _wait_until_build(self, state):
-        timeout = 10
-        start_time = 0
-        while True:
-            if start_time > timeout:
-                raise TimeoutException(
-                    f'Build did not reach {state} state within {timeout} seconds'
-                )
-            try:
-                last_build_state = self.driver.find_element(
-                    By.XPATH,
-                    '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]',
-                )
-                build_state = last_build_state.get_attribute(
-                    'data-build-state')
-                state_text = state.lower().split()
-                if any(x in str(build_state).lower() for x in state_text):
-                    break
-            except NoSuchElementException:
-                continue
-            start_time += 1
-            sleep(1) # take a breath and try again
-
     def _mixin_test_table_search_input(self, **kwargs):
         input_selector, input_text, searchBtn_selector, table_selector, *_ = kwargs.values()
         # Test search input
@@ -245,11 +221,19 @@
         rows = self.find_all(f'#{table_selector} tbody tr')
         self.assertTrue(len(rows) > 0)
 
+    def test_create_project(self):
+        """ Create/Test new project using:
+          - Project Name: Any string
+          - Release: Any string
+          - Merge Toaster settings: True or False
+        """
+        self._create_project(project_name=self.PROJECT_NAME)
+
     def test_image_recipe_editColumn(self):
         """ Test the edit column feature in image recipe table on project page """
         self._get_create_builds(success=10, failure=10)
 
-        url = reverse('projectimagerecipes', args=(1,))
+        url = reverse('projectimagerecipes', args=(TestProjectPage.project_id,))
         self.get(url)
         self.wait_until_present('#imagerecipestable tbody tr')
 
@@ -276,8 +260,7 @@
           - AT RIGHT -> button "New project", displayed, clickable
         """
         # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
+        self._navigate_to_project_page()
 
         # check page header
         # AT LEFT -> Logo of Yocto project
@@ -360,8 +343,7 @@
           - Check project name is changed
         """
         # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
+        self._navigate_to_project_page()
 
         # click on "Edit" icon button
         self.wait_until_visible('#project-name-container')
@@ -388,8 +370,7 @@
           Check search box used to build recipes
         """
         # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
+        self._navigate_to_project_page()
 
         # check "configuration" tab
         self.wait_until_visible('#topbar-configuration-tab')
@@ -397,7 +378,7 @@
         self.assertTrue(config_tab.get_attribute('class') == 'active')
         self.assertTrue('Configuration' in str(config_tab.text))
         self.assertTrue(
-            f"/toastergui/project/1" in str(self.driver.current_url)
+            f"/toastergui/project/{TestProjectPage.project_id}" in str(self.driver.current_url)
         )
 
         def get_tabs():
@@ -420,7 +401,7 @@
         check_tab_link(
             1,
             'Builds',
-            f"/toastergui/project/1/builds"
+            f"/toastergui/project/{TestProjectPage.project_id}/builds"
         )
 
         # check "Import layers" tab
@@ -429,7 +410,7 @@
         check_tab_link(
             2,
             'Import layer',
-            f"/toastergui/project/1/importlayer"
+            f"/toastergui/project/{TestProjectPage.project_id}/importlayer"
         )
 
         # check "New custom image" tab
@@ -438,7 +419,7 @@
         check_tab_link(
             3,
             'New custom image',
-            f"/toastergui/project/1/newcustomimage"
+            f"/toastergui/project/{TestProjectPage.project_id}/newcustomimage"
         )
 
         # check search box can be use to build recipes
@@ -480,12 +461,20 @@
             '//td[@class="add-del-layers"]//a[1]'
         )
         build_btn.click()
-        self._wait_until_build('parsing starting cloning queued')
+        build_state = wait_until_build(self, 'queued cloning starting parsing failed')
         lastest_builds = self.driver.find_elements(
             By.XPATH,
             '//div[@id="latest-builds"]/div'
         )
         self.assertTrue(len(lastest_builds) > 0)
+        last_build = lastest_builds[0]
+        cancel_button = last_build.find_element(
+            By.XPATH,
+            '//span[@class="cancel-build-btn pull-right alert-link"]',
+        )
+        cancel_button.click()
+        if 'starting' not in build_state:  # change build state when cancelled in starting state
+            wait_until_build_cancelled(self)
 
         # check software recipe table feature(show/hide column, pagination)
         self._navigate_to_config_nav('softwarerecipestable', 4)
@@ -505,7 +494,10 @@
         )
         self._navigate_to_config_nav('softwarerecipestable', 4)
         # check show rows(pagination)
-        self._mixin_test_table_show_rows(table_selector='softwarerecipestable')
+        self._mixin_test_table_show_rows(
+            table_selector='softwarerecipestable',
+            to_skip=[150],
+        )
 
     def test_machines_page(self):
         """ Test Machine page
@@ -547,6 +539,7 @@
             searchBtn_selector='search-submit-machinestable',
             table_selector='machinestable'
         )
+        self.wait_until_visible('#machinestable tbody tr', poll=3)
         rows = self.find_all('#machinestable tbody tr')
         machine_to_add = rows[0]
         add_btn = machine_to_add.find_element(By.XPATH, '//td[@class="add-del-layers"]')
@@ -571,7 +564,10 @@
         )
         self._navigate_to_config_nav('machinestable', 5)
         # check show rows(pagination)
-        self._mixin_test_table_show_rows(table_selector='machinestable')
+        self._mixin_test_table_show_rows(
+            table_selector='machinestable',
+            to_skip=[150],
+        )
 
     def test_layers_page(self):
         """ Test layers page
@@ -593,6 +589,7 @@
             table_selector='layerstable'
         )
         # check "Add layer" button works
+        self.wait_until_visible('#layerstable tbody tr', poll=3)
         rows = self.find_all('#layerstable tbody tr')
         layer_to_add = rows[0]
         add_btn = layer_to_add.find_element(
@@ -601,7 +598,7 @@
         )
         add_btn.click()
         # check modal is displayed
-        self.wait_until_visible('#dependencies-modal', poll=2)
+        self.wait_until_visible('#dependencies-modal', poll=3)
         list_dependencies = self.find_all('#dependencies-list li')
         # click on add-layers button
         add_layers_btn = self.driver.find_element(
@@ -615,6 +612,7 @@
             f'You have added {len(list_dependencies)+1} layers to your project: {input_text} and its dependencies' in str(change_notification.text)
         )
         # check "Remove layer" button works
+        self.wait_until_visible('#layerstable tbody tr', poll=3)
         rows = self.find_all('#layerstable tbody tr')
         layer_to_remove = rows[0]
         remove_btn = layer_to_remove.find_element(
@@ -643,7 +641,10 @@
         )
         self._navigate_to_config_nav('layerstable', 6)
         # check show rows(pagination)
-        self._mixin_test_table_show_rows(table_selector='layerstable')
+        self._mixin_test_table_show_rows(
+            table_selector='layerstable',
+            to_skip=[150],
+        )
 
     def test_distro_page(self):
         """ Test distros page
@@ -693,7 +694,7 @@
         # check show rows(pagination)
         self._mixin_test_table_show_rows(
             table_selector='distrostable',
-            to_skip=[150]
+            to_skip=[150],
         )
 
     def test_single_layer_page(self):
@@ -706,7 +707,7 @@
                 - Check layer summary
                 - Check layer description
         """
-        url = reverse("layerdetails", args=(1, 8))
+        url = reverse("layerdetails", args=(TestProjectPage.project_id, 8))
         self.get(url)
         self.wait_until_visible('.page-header')
         # check title is displayed
@@ -765,7 +766,7 @@
                 - Check recipe: name, summary, description, Version, Section,
                 License, Approx. packages included, Approx. size, Recipe file
         """
-        url = reverse("recipedetails", args=(1, 53428))
+        url = reverse("recipedetails", args=(TestProjectPage.project_id, 53428))
         self.get(url)
         self.wait_until_visible('.page-header')
         # check title is displayed
diff --git a/poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py b/poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py
index 23012d7..ee1f5c4 100644
--- a/poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py
+++ b/poky/bitbake/lib/toaster/tests/functional/test_project_page_tab_config.py
@@ -6,102 +6,102 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
-from time import sleep
+import string
+import random
 import pytest
-from django.utils import timezone
 from django.urls import reverse
 from selenium.webdriver import Keys
 from selenium.webdriver.support.select import Select
-from selenium.common.exceptions import NoSuchElementException
-from orm.models import Build, Project, Target
+from selenium.common.exceptions import NoSuchElementException, TimeoutException
+from orm.models import Project
 from tests.functional.functional_helpers import SeleniumFunctionalTestCase
 from selenium.webdriver.common.by import By
 
+from .utils import get_projectId_from_url, wait_until_build, wait_until_build_cancelled
+
 
 @pytest.mark.django_db
+@pytest.mark.order("last")
 class TestProjectConfigTab(SeleniumFunctionalTestCase):
+    PROJECT_NAME = 'TestProjectConfigTab'
+    project_id = None
 
-    def setUp(self):
-        self.recipe = None
-        super().setUp()
-        release = '3'
-        project_name = 'projectmaster'
-        self._create_test_new_project(
-            project_name,
-            release,
-            False,
-        )
-
-    def _create_test_new_project(
-        self,
-        project_name,
-        release,
-        merge_toaster_settings,
-    ):
+    def _create_project(self, project_name, **kwargs):
         """ Create/Test new project using:
           - Project Name: Any string
           - Release: Any string
           - Merge Toaster settings: True or False
         """
+        release = kwargs.get('release', '3')
         self.get(reverse('newproject'))
-        self.driver.find_element(By.ID,
-                                 "new-project-name").send_keys(project_name)
-
-        select = Select(self.find('#projectversion'))
+        self.wait_until_visible('#new-project-name')
+        self.find("#new-project-name").send_keys(project_name)
+        select = Select(self.find("#projectversion"))
         select.select_by_value(release)
 
         # check merge toaster settings
         checkbox = self.find('.checkbox-mergeattr')
-        if merge_toaster_settings:
-            if not checkbox.is_selected():
-                checkbox.click()
+        if not checkbox.is_selected():
+            checkbox.click()
+
+        if self.PROJECT_NAME != 'TestProjectConfigTab':
+            # Reset project name if it's not the default one
+            self.PROJECT_NAME = 'TestProjectConfigTab'
+
+        self.find("#create-project-button").click()
+
+        try:
+            self.wait_until_visible('#hint-error-project-name', poll=3)
+            url = reverse('project', args=(TestProjectConfigTab.project_id, ))
+            self.get(url)
+            self.wait_until_visible('#config-nav', poll=3)
+        except TimeoutException:
+            self.wait_until_visible('#config-nav', poll=3)
+
+    def _random_string(self, length):
+        return ''.join(
+            random.choice(string.ascii_letters) for _ in range(length)
+        )
+
+    def _navigate_to_project_page(self):
+        # Navigate to project page
+        if TestProjectConfigTab.project_id is None:
+            self._create_project(project_name=self._random_string(10))
+            current_url = self.driver.current_url
+            TestProjectConfigTab.project_id = get_projectId_from_url(
+                current_url)
         else:
-            if checkbox.is_selected():
-                checkbox.click()
-
-        self.driver.find_element(By.ID, "create-project-button").click()
-
-    @classmethod
-    def _wait_until_build(cls, state):
-        while True:
-            try:
-                last_build_state = cls.driver.find_element(
-                    By.XPATH,
-                    '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]',
-                )
-                build_state = last_build_state.get_attribute(
-                    'data-build-state')
-                state_text = state.lower().split()
-                if any(x in str(build_state).lower() for x in state_text):
-                    break
-            except NoSuchElementException:
-                continue
-            sleep(1)
+            url = reverse('project', args=(TestProjectConfigTab.project_id,))
+            self.get(url)
+        self.wait_until_visible('#config-nav')
 
     def _create_builds(self):
         # check search box can be use to build recipes
         search_box = self.find('#build-input')
-        search_box.send_keys('core-image-minimal')
+        search_box.send_keys('foo')
         self.find('#build-button').click()
-        sleep(1)
-        self.wait_until_visible('#latest-builds')
+        self.wait_until_present('#latest-builds')
         # loop until reach the parsing state
-        self._wait_until_build('parsing starting cloning')
+        wait_until_build(self, 'queued cloning starting parsing failed')
         lastest_builds = self.driver.find_elements(
             By.XPATH,
             '//div[@id="latest-builds"]/div',
         )
         last_build = lastest_builds[0]
         self.assertTrue(
-            'core-image-minimal' in str(last_build.text)
+            'foo' in str(last_build.text)
         )
-        cancel_button = last_build.find_element(
-            By.XPATH,
-            '//span[@class="cancel-build-btn pull-right alert-link"]',
-        )
-        cancel_button.click()
-        sleep(1)
-        self._wait_until_build('cancelled')
+        last_build = lastest_builds[0]
+        try:
+            cancel_button = last_build.find_element(
+                By.XPATH,
+                '//span[@class="cancel-build-btn pull-right alert-link"]',
+            )
+            cancel_button.click()
+        except NoSuchElementException:
+            # Skip if the build is already cancelled
+            pass
+        wait_until_build_cancelled(self)
 
     def _get_tabs(self):
         # tabs links list
@@ -114,64 +114,6 @@
         config_nav = self.find('#config-nav')
         return config_nav.find_elements(By.TAG_NAME, 'li')[index]
 
-    def _get_create_builds(self, **kwargs):
-        """ Create a build and return the build object """
-        # parameters for builds to associate with the projects
-        now = timezone.now()
-        release = '3'
-        project_name = 'projectmaster'
-        self._create_test_new_project(
-            project_name+"2",
-            release,
-            False,
-        )
-
-        self.project1_build_success = {
-            'project': Project.objects.get(id=1),
-            'started_on': now,
-            'completed_on': now,
-            'outcome': Build.SUCCEEDED
-        }
-
-        self.project1_build_failure = {
-            'project': Project.objects.get(id=1),
-            'started_on': now,
-            'completed_on': now,
-            'outcome': Build.FAILED
-        }
-        build1 = Build.objects.create(**self.project1_build_success)
-        build2 = Build.objects.create(**self.project1_build_failure)
-
-        # add some targets to these builds so they have recipe links
-        # (and so we can find the row in the ToasterTable corresponding to
-        # a particular build)
-        Target.objects.create(build=build1, target='foo')
-        Target.objects.create(build=build2, target='bar')
-
-        if kwargs:
-            # Create kwargs.get('success') builds with success status with target
-            # and kwargs.get('failure') builds with failure status with target
-            for i in range(kwargs.get('success', 0)):
-                now = timezone.now()
-                self.project1_build_success['started_on'] = now
-                self.project1_build_success[
-                    'completed_on'] = now - timezone.timedelta(days=i)
-                build = Build.objects.create(**self.project1_build_success)
-                Target.objects.create(build=build,
-                                      target=f'{i}_success_recipe',
-                                      task=f'{i}_success_task')
-
-            for i in range(kwargs.get('failure', 0)):
-                now = timezone.now()
-                self.project1_build_failure['started_on'] = now
-                self.project1_build_failure[
-                    'completed_on'] = now - timezone.timedelta(days=i)
-                build = Build.objects.create(**self.project1_build_failure)
-                Target.objects.create(build=build,
-                                      target=f'{i}_fail_recipe',
-                                      task=f'{i}_fail_task')
-        return build1, build2
-
     def test_project_config_nav(self):
         """ Test project config tab navigation:
         - Check if the menu is displayed and contains the right elements:
@@ -188,12 +130,7 @@
             - Actions
             - Delete project
         """
-        # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
-
-        # check if the menu is displayed
-        self.wait_until_visible('#config-nav')
+        self._navigate_to_project_page()
 
         def _get_config_nav_item(index):
             config_nav = self.find('#config-nav')
@@ -221,14 +158,28 @@
         self.assertTrue("actions" in str(actions.text).lower())
 
         conf_nav_list = [
-            [0, 'Configuration', f"/toastergui/project/1"],  # config
-            [2, 'Custom images', f"/toastergui/project/1/customimages"],  # custom images
-            [3, 'Image recipes', f"/toastergui/project/1/images"],  # image recipes
-            [4, 'Software recipes', f"/toastergui/project/1/softwarerecipes"],  # software recipes
-            [5, 'Machines', f"/toastergui/project/1/machines"],  # machines
-            [6, 'Layers', f"/toastergui/project/1/layers"],  # layers
-            [7, 'Distro', f"/toastergui/project/1/distro"],  # distro
-            [9, 'BitBake variables', f"/toastergui/project/1/configuration"],  # bitbake variables
+            # config
+            [0, 'Configuration',
+                f"/toastergui/project/{TestProjectConfigTab.project_id}"],
+            # custom images
+            [2, 'Custom images',
+                f"/toastergui/project/{TestProjectConfigTab.project_id}/customimages"],
+            # image recipes
+            [3, 'Image recipes',
+                f"/toastergui/project/{TestProjectConfigTab.project_id}/images"],
+            # software recipes
+            [4, 'Software recipes',
+                f"/toastergui/project/{TestProjectConfigTab.project_id}/softwarerecipes"],
+            # machines
+            [5, 'Machines',
+                f"/toastergui/project/{TestProjectConfigTab.project_id}/machines"],
+            # layers
+            [6, 'Layers',
+                f"/toastergui/project/{TestProjectConfigTab.project_id}/layers"],
+            # distro
+            [7, 'Distros',
+                f"/toastergui/project/{TestProjectConfigTab.project_id}/distros"],
+            #  [9, 'BitBake variables', f"/toastergui/project/{TestProjectConfigTab.project_id}/configuration"],  # bitbake variables
         ]
         for index, item_name, url in conf_nav_list:
             item = _get_config_nav_item(index)
@@ -236,6 +187,96 @@
                 item.click()
             check_config_nav_item(index, item_name, url)
 
+    def test_image_recipe_editColumn(self):
+        """ Test the edit column feature in image recipe table on project page """
+        def test_edit_column(check_box_id):
+            # Check that we can hide/show table column
+            check_box = self.find(f'#{check_box_id}')
+            th_class = str(check_box_id).replace('checkbox-', '')
+            if check_box.is_selected():
+                # check if column is visible in table
+                self.assertTrue(
+                    self.find(
+                        f'#imagerecipestable thead th.{th_class}'
+                    ).is_displayed(),
+                    f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+                )
+                check_box.click()
+                # check if column is hidden in table
+                self.assertFalse(
+                    self.find(
+                        f'#imagerecipestable thead th.{th_class}'
+                    ).is_displayed(),
+                    f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+                )
+            else:
+                # check if column is hidden in table
+                self.assertFalse(
+                    self.find(
+                        f'#imagerecipestable thead th.{th_class}'
+                    ).is_displayed(),
+                    f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
+                )
+                check_box.click()
+                # check if column is visible in table
+                self.assertTrue(
+                    self.find(
+                        f'#imagerecipestable thead th.{th_class}'
+                    ).is_displayed(),
+                    f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
+                )
+
+        self._navigate_to_project_page()
+        # navigate to project image recipe page
+        recipe_image_page_link = self._get_config_nav_item(3)
+        recipe_image_page_link.click()
+        self.wait_until_present('#imagerecipestable tbody tr')
+
+        # Check edit column
+        edit_column = self.find('#edit-columns-button')
+        self.assertTrue(edit_column.is_displayed())
+        edit_column.click()
+        # Check dropdown is visible
+        self.wait_until_visible('ul.dropdown-menu.editcol')
+
+        # Check that we can hide the edit column
+        test_edit_column('checkbox-get_description_or_summary')
+        test_edit_column('checkbox-layer_version__get_vcs_reference')
+        test_edit_column('checkbox-layer_version__layer__name')
+        test_edit_column('checkbox-license')
+        test_edit_column('checkbox-recipe-file')
+        test_edit_column('checkbox-section')
+        test_edit_column('checkbox-version')
+
+    def test_image_recipe_show_rows(self):
+        """ Test the show rows feature in image recipe table on project page """
+        def test_show_rows(row_to_show, show_row_link):
+            # Check that we can show rows == row_to_show
+            show_row_link.select_by_value(str(row_to_show))
+            self.wait_until_visible('#imagerecipestable tbody tr')
+            self.assertTrue(
+                len(self.find_all('#imagerecipestable tbody tr')) == row_to_show
+            )
+
+        self._navigate_to_project_page()
+        # navigate to project image recipe page
+        recipe_image_page_link = self._get_config_nav_item(3)
+        recipe_image_page_link.click()
+        self.wait_until_present('#imagerecipestable tbody tr')
+
+        show_rows = self.driver.find_elements(
+            By.XPATH,
+            '//select[@class="form-control pagesize-imagerecipestable"]'
+        )
+        # Check show rows
+        for show_row_link in show_rows:
+            show_row_link = Select(show_row_link)
+            test_show_rows(10, show_row_link)
+            test_show_rows(25, show_row_link)
+            test_show_rows(50, show_row_link)
+            test_show_rows(100, show_row_link)
+            test_show_rows(150, show_row_link)
+
     def test_project_config_tab_right_section(self):
         """ Test project config tab right section contains five blocks:
             - Machine:
@@ -257,35 +298,31 @@
                     - meta-poky
                     - meta-yocto-bsp
         """
-        # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
-
+        # Create a new project for this test
+        project_name = self._random_string(10)
+        self._create_project(project_name=project_name)
         # check if the menu is displayed
         self.wait_until_visible('#project-page')
         block_l = self.driver.find_element(
             By.XPATH, '//*[@id="project-page"]/div[2]')
-        machine = self.find('#machine-section')
-        distro = self.find('#distro-section')
-        most_built_recipes = self.driver.find_element(
-            By.XPATH, '//*[@id="project-page"]/div[1]/div[3]')
         project_release = self.driver.find_element(
             By.XPATH, '//*[@id="project-page"]/div[1]/div[4]')
         layers = block_l.find_element(By.ID, 'layer-container')
 
-        def check_machine_distro(self, item_name, new_item_name, block):
+        def check_machine_distro(self, item_name, new_item_name, block_id):
+            block = self.find(f'#{block_id}')
             title = block.find_element(By.TAG_NAME, 'h3')
             self.assertTrue(item_name.capitalize() in title.text)
-            edit_btn = block.find_element(By.ID, f'change-{item_name}-toggle')
+            edit_btn = self.find(f'#change-{item_name}-toggle')
             edit_btn.click()
-            sleep(1)
-            name_input = block.find_element(By.ID, f'{item_name}-change-input')
+            self.wait_until_visible(f'#{item_name}-change-input')
+            name_input = self.find(f'#{item_name}-change-input')
             name_input.clear()
             name_input.send_keys(new_item_name)
-            change_btn = block.find_element(By.ID, f'{item_name}-change-btn')
+            change_btn = self.find(f'#{item_name}-change-btn')
             change_btn.click()
-            sleep(1)
-            project_name = block.find_element(By.ID, f'project-{item_name}-name')
+            self.wait_until_visible(f'#project-{item_name}-name')
+            project_name = self.find(f'#project-{item_name}-name')
             self.assertTrue(new_item_name in project_name.text)
             # check change notificaiton is displayed
             change_notification = self.find('#change-notification')
@@ -294,9 +331,9 @@
             )
 
         # Machine
-        check_machine_distro(self, 'machine', 'qemux86-64', machine)
+        check_machine_distro(self, 'machine', 'qemux86-64', 'machine-section')
         # Distro
-        check_machine_distro(self, 'distro', 'poky-altcfg', distro)
+        check_machine_distro(self, 'distro', 'poky-altcfg', 'distro-section')
 
         # Project release
         title = project_release.find_element(By.TAG_NAME, 'h3')
@@ -304,7 +341,6 @@
         self.assertTrue(
             "Yocto Project master" in self.find('#project-release-title').text
         )
-
         # Layers
         title = layers.find_element(By.TAG_NAME, 'h3')
         self.assertTrue("Layers" in title.text)
@@ -314,7 +350,9 @@
         # meta-yocto-bsp
         layers_list = layers.find_element(By.ID, 'layers-in-project-list')
         layers_list_items = layers_list.find_elements(By.TAG_NAME, 'li')
-        self.assertTrue(len(layers_list_items) == 3)
+        # remove all layers except the first three layers
+        for i in range(3, len(layers_list_items)):
+            layers_list_items[i].find_element(By.TAG_NAME, 'span').click()
         # check can add a layer if exists
         add_layer_input = layers.find_element(By.ID, 'layer-add-input')
         add_layer_input.send_keys('meta-oe')
@@ -326,56 +364,70 @@
         dropdown_item.click()
         add_layer_btn = layers.find_element(By.ID, 'add-layer-btn')
         add_layer_btn.click()
-        sleep(1)
+        self.wait_until_visible('#layers-in-project-list')
         # check layer is added
         layers_list_items = layers_list.find_elements(By.TAG_NAME, 'li')
         self.assertTrue(len(layers_list_items) == 4)
 
-        # Most built recipes
-        title = most_built_recipes.find_element(By.TAG_NAME, 'h3')
-        self.assertTrue("Most built recipes" in title.text)
-        # Create a new builds 5
+    def test_most_build_recipes(self):
+        """ Test most build recipes block contains"""
+        def rebuild_from_most_build_recipes(recipe_list_items):
+            checkbox = recipe_list_items[0].find_element(By.TAG_NAME, 'input')
+            checkbox.click()
+            build_btn = self.find('#freq-build-btn')
+            build_btn.click()
+            self.wait_until_visible('#latest-builds')
+            wait_until_build(self, 'queued cloning starting parsing failed')
+            lastest_builds = self.driver.find_elements(
+                By.XPATH,
+                '//div[@id="latest-builds"]/div'
+            )
+            self.assertTrue(len(lastest_builds) >= 2)
+            last_build = lastest_builds[0]
+            try:
+                cancel_button = last_build.find_element(
+                    By.XPATH,
+                    '//span[@class="cancel-build-btn pull-right alert-link"]',
+                )
+                cancel_button.click()
+            except NoSuchElementException:
+                # Skip if the build is already cancelled
+                pass
+            wait_until_build_cancelled(self)
+        # Create a new project for remaining asserts
+        project_name = self._random_string(10)
+        self._create_project(project_name=project_name, release='2')
+        current_url = self.driver.current_url
+        TestProjectConfigTab.project_id = get_projectId_from_url(current_url)
+        url = current_url.split('?')[0]
+
+        # Create a new builds
         self._create_builds()
 
-        # Refresh the page
-        self.get(url)
+        # back to project page
+        self.driver.get(url)
 
-        sleep(1)  # wait for page to load
-        self.wait_until_visible('#project-page')
-        # check can select a recipe and build it
+        self.wait_until_visible('#project-page', poll=3)
+
+        # Most built recipes
         most_built_recipes = self.driver.find_element(
             By.XPATH, '//*[@id="project-page"]/div[1]/div[3]')
-        recipe_list = most_built_recipes.find_element(By.ID, 'freq-build-list')
+        title = most_built_recipes.find_element(By.TAG_NAME, 'h3')
+        self.assertTrue("Most built recipes" in title.text)
+        # check can select a recipe and build it
+        self.wait_until_visible('#freq-build-list', poll=3)
+        recipe_list = self.find('#freq-build-list')
         recipe_list_items = recipe_list.find_elements(By.TAG_NAME, 'li')
         self.assertTrue(
             len(recipe_list_items) > 0,
-            msg="No recipes found in the most built recipes list",
+            msg="Any recipes found in the most built recipes list",
         )
-        checkbox = recipe_list_items[0].find_element(By.TAG_NAME, 'input')
-        checkbox.click()
-        build_btn = self.find('#freq-build-btn')
-        build_btn.click()
-        sleep(1)  # wait for page to load
-        self.wait_until_visible('#latest-builds')
-        self._wait_until_build('parsing starting cloning queueing')
-        lastest_builds = self.driver.find_elements(
-            By.XPATH,
-            '//div[@id="latest-builds"]/div'
-        )
-        last_build = lastest_builds[0]
-        cancel_button = last_build.find_element(
-            By.XPATH,
-            '//span[@class="cancel-build-btn pull-right alert-link"]',
-        )
-        cancel_button.click()
-        self.assertTrue(len(lastest_builds) == 2)
+        rebuild_from_most_build_recipes(recipe_list_items)
+        TestProjectConfigTab.project_id = None  # reset project id
 
     def test_project_page_tab_importlayer(self):
         """ Test project page tab import layer """
-        # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
-
+        self._navigate_to_project_page()
         # navigate to "Import layers" tab
         import_layers_tab = self._get_tabs()[2]
         import_layers_tab.find_element(By.TAG_NAME, 'a').click()
@@ -415,10 +467,10 @@
 
     def test_project_page_custom_image_no_image(self):
         """ Test project page tab "New custom image" when no custom image """
-        # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
-
+        project_name = self._random_string(10)
+        self._create_project(project_name=project_name)
+        current_url = self.driver.current_url
+        TestProjectConfigTab.project_id = get_projectId_from_url(current_url)
         # navigate to "Custom image" tab
         custom_image_section = self._get_config_nav_item(2)
         custom_image_section.click()
@@ -433,8 +485,9 @@
         div_empty_msg = self.find('#empty-state-customimagestable')
         link_create_custom_image = div_empty_msg.find_element(
             By.TAG_NAME, 'a')
+        self.assertTrue(TestProjectConfigTab.project_id is not None)
         self.assertTrue(
-            f"/toastergui/project/1/newcustomimage" in str(
+            f"/toastergui/project/{TestProjectConfigTab.project_id}/newcustomimage" in str(
                 link_create_custom_image.get_attribute('href')
             )
         )
@@ -443,6 +496,7 @@
                 link_create_custom_image.text
             )
         )
+        TestProjectConfigTab.project_id = None  # reset project id
 
     def test_project_page_image_recipe(self):
         """ Test project page section images
@@ -451,11 +505,7 @@
             - Check image recipe build button works
             - Check image recipe table features(show/hide column, pagination)
         """
-        # navigate to the project page
-        url = reverse("project", args=(1,))
-        self.get(url)
-        self.wait_until_visible('#config-nav')
-
+        self._navigate_to_project_page()
         # navigate to "Images section"
         images_section = self._get_config_nav_item(3)
         images_section.click()
@@ -471,108 +521,3 @@
         self.wait_until_visible('#imagerecipestable tbody tr')
         rows = self.find_all('#imagerecipestable tbody tr')
         self.assertTrue(len(rows) > 0)
-
-        # Test build button
-        image_to_build = rows[0]
-        build_btn = image_to_build.find_element(
-            By.XPATH,
-            '//td[@class="add-del-layers"]'
-        )
-        build_btn.click()
-        self._wait_until_build('parsing starting cloning')
-        lastest_builds = self.driver.find_elements(
-            By.XPATH,
-            '//div[@id="latest-builds"]/div'
-        )
-        self.assertTrue(len(lastest_builds) > 0)
-
-    def test_image_recipe_editColumn(self):
-        """ Test the edit column feature in image recipe table on project page """
-        self._get_create_builds(success=10, failure=10)
-
-        def test_edit_column(check_box_id):
-            # Check that we can hide/show table column
-            check_box = self.find(f'#{check_box_id}')
-            th_class = str(check_box_id).replace('checkbox-', '')
-            if check_box.is_selected():
-                # check if column is visible in table
-                self.assertTrue(
-                    self.find(
-                        f'#imagerecipestable thead th.{th_class}'
-                    ).is_displayed(),
-                    f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
-                )
-                check_box.click()
-                # check if column is hidden in table
-                self.assertFalse(
-                    self.find(
-                        f'#imagerecipestable thead th.{th_class}'
-                    ).is_displayed(),
-                    f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
-                )
-            else:
-                # check if column is hidden in table
-                self.assertFalse(
-                    self.find(
-                        f'#imagerecipestable thead th.{th_class}'
-                    ).is_displayed(),
-                    f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table"
-                )
-                check_box.click()
-                # check if column is visible in table
-                self.assertTrue(
-                    self.find(
-                        f'#imagerecipestable thead th.{th_class}'
-                    ).is_displayed(),
-                    f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table"
-                )
-
-        url = reverse('projectimagerecipes', args=(1,))
-        self.get(url)
-        self.wait_until_present('#imagerecipestable tbody tr')
-
-        # Check edit column
-        edit_column = self.find('#edit-columns-button')
-        self.assertTrue(edit_column.is_displayed())
-        edit_column.click()
-        # Check dropdown is visible
-        self.wait_until_visible('ul.dropdown-menu.editcol')
-
-        # Check that we can hide the edit column
-        test_edit_column('checkbox-get_description_or_summary')
-        test_edit_column('checkbox-layer_version__get_vcs_reference')
-        test_edit_column('checkbox-layer_version__layer__name')
-        test_edit_column('checkbox-license')
-        test_edit_column('checkbox-recipe-file')
-        test_edit_column('checkbox-section')
-        test_edit_column('checkbox-version')
-
-    def test_image_recipe_show_rows(self):
-        """ Test the show rows feature in image recipe table on project page """
-        self._get_create_builds(success=100, failure=100)
-
-        def test_show_rows(row_to_show, show_row_link):
-            # Check that we can show rows == row_to_show
-            show_row_link.select_by_value(str(row_to_show))
-            self.wait_until_present('#imagerecipestable tbody tr')
-            sleep(1)
-            self.assertTrue(
-                len(self.find_all('#imagerecipestable tbody tr')) == row_to_show
-            )
-
-        url = reverse('projectimagerecipes', args=(2,))
-        self.get(url)
-        self.wait_until_present('#imagerecipestable tbody tr')
-
-        show_rows = self.driver.find_elements(
-            By.XPATH,
-            '//select[@class="form-control pagesize-imagerecipestable"]'
-        )
-        # Check show rows
-        for show_row_link in show_rows:
-            show_row_link = Select(show_row_link)
-            test_show_rows(10, show_row_link)
-            test_show_rows(25, show_row_link)
-            test_show_rows(50, show_row_link)
-            test_show_rows(100, show_row_link)
-            test_show_rows(150, show_row_link)
diff --git a/poky/bitbake/lib/toaster/tests/functional/utils.py b/poky/bitbake/lib/toaster/tests/functional/utils.py
new file mode 100644
index 0000000..7269fa1
--- /dev/null
+++ b/poky/bitbake/lib/toaster/tests/functional/utils.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+# BitBake Toaster UI tests implementation
+#
+# Copyright (C) 2023 Savoir-faire Linux
+#
+# SPDX-License-Identifier: GPL-2.0-only
+
+
+from time import sleep
+from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException, TimeoutException
+from selenium.webdriver.common.by import By
+
+from orm.models import Build
+
+
+def wait_until_build(test_instance, state):
+    timeout = 60
+    start_time = 0
+    build_state = ''
+    while True:
+        try:
+            if start_time > timeout:
+                raise TimeoutException(
+                    f'Build did not reach {state} state within {timeout} seconds'
+                )
+            last_build_state = test_instance.driver.find_element(
+                By.XPATH,
+                '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]',
+            )
+            build_state = last_build_state.get_attribute(
+                'data-build-state')
+            state_text = state.lower().split()
+            if any(x in str(build_state).lower() for x in state_text):
+                return str(build_state).lower()
+            if 'failed' in str(build_state).lower():
+                break
+        except NoSuchElementException:
+            continue
+        except TimeoutException:
+            break
+        start_time += 1
+        sleep(1) # take a breath and try again
+
+def wait_until_build_cancelled(test_instance):
+    """ Cancel build take a while sometime, the method is to wait driver action
+        until build being cancelled
+    """
+    timeout = 30
+    start_time = 0
+    build = None
+    while True:
+        try:
+            if start_time > timeout:
+                raise TimeoutException(
+                    f'Build did not reach cancelled state within {timeout} seconds'
+                )
+            last_build_state = test_instance.driver.find_element(
+                By.XPATH,
+                '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]',
+            )
+            build_state = last_build_state.get_attribute(
+                'data-build-state')
+            if 'failed' in str(build_state).lower():
+                break
+            if 'cancelling' in str(build_state).lower():
+                # Change build state to cancelled
+                if not build:  # get build object only once
+                    build = Build.objects.last()
+                    build.outcome = Build.CANCELLED
+                    build.save()
+            if 'cancelled' in str(build_state).lower():
+                break
+        except NoSuchElementException:
+            continue
+        except StaleElementReferenceException:
+            continue
+        except TimeoutException:
+            break
+        start_time += 1
+        sleep(1) # take a breath and try again
+
+def get_projectId_from_url(url):
+    # url = 'http://domainename.com/toastergui/project/1656/whatever
+    # or url = 'http://domainename.com/toastergui/project/1/
+    # or url = 'http://domainename.com/toastergui/project/186
+    assert '/toastergui/project/' in url, "URL is not valid"
+    url_to_list = url.split('/toastergui/project/')
+    return  int(url_to_list[1].split('/')[0])  # project_id
diff --git a/poky/bitbake/lib/toaster/tests/views/test_views.py b/poky/bitbake/lib/toaster/tests/views/test_views.py
index 349881e..e1adfcf 100644
--- a/poky/bitbake/lib/toaster/tests/views/test_views.py
+++ b/poky/bitbake/lib/toaster/tests/views/test_views.py
@@ -9,6 +9,7 @@
 
 """Test cases for Toaster GUI and ReST."""
 
+import os
 import pytest
 from django.test import TestCase
 from django.test.client import RequestFactory
@@ -34,11 +35,12 @@
 CLI_BUILDS_PROJECT_NAME = 'Command line builds'
 
 
-@pytest.mark.order(1)
+
 class ViewTests(TestCase):
     """Tests to verify view APIs."""
 
     fixtures = ['toastergui-unittest-data']
+    builldir = os.environ.get('BUILDDIR')
 
     def setUp(self):
 
@@ -46,7 +48,7 @@
 
         self.recipe1 = Recipe.objects.get(pk=2)
         # create a file and to recipe1 file_path
-        file_path = f"/tmp/{self.recipe1.name.strip().replace(' ', '-')}.bb"
+        file_path = f"{self.builldir}/{self.recipe1.name.strip().replace(' ', '-')}.bb"
         with open(file_path, 'w') as f:
             f.write('foo')
         self.recipe1.file_path = file_path
@@ -240,7 +242,7 @@
         recipe = CustomImageRecipe.objects.create(
                      name=name, project=self.project,
                      base_recipe=self.recipe1,
-                     file_path="/tmp/testing",
+                     file_path=f"{self.builldir}/testing",
                      layer_version=self.customr.layer_version)
         url = reverse('xhr_customrecipe_id', args=(recipe.id,))
         response = self.client.delete(url)
@@ -311,7 +313,7 @@
         """Download the recipe file generated for the custom image"""
 
         # Create a dummy recipe file for the custom image generation to read
-        open("/tmp/a_recipe.bb", 'a').close()
+        open(f"{self.builldir}/a_recipe.bb", 'a').close()
         response = self.client.get(reverse('customrecipedownload',
                                            args=(self.project.id,
                                                  self.customr.id)))
diff --git a/poky/bitbake/lib/toaster/toastergui/api.py b/poky/bitbake/lib/toaster/toastergui/api.py
index b4cdc33..e367bd9 100644
--- a/poky/bitbake/lib/toaster/toastergui/api.py
+++ b/poky/bitbake/lib/toaster/toastergui/api.py
@@ -11,7 +11,7 @@
 import re
 import logging
 import json
-import subprocess
+import glob
 from collections import Counter
 
 from orm.models import Project, ProjectTarget, Build, Layer_Version
@@ -227,20 +227,18 @@
 #    same logical name
 #  * Each project that uses a layer will have its own
 #    LayerVersion and Project Layer for it
-#  * During the Paroject delete process, when the last
+#  * During the Project delete process, when the last
 #    LayerVersion for a 'local_source_dir' layer is deleted
 #    then the Layer record is deleted to remove orphans
 #
 
 def scan_layer_content(layer,layer_version):
     # if this is a local layer directory, we can immediately scan its content
-    if layer.local_source_dir:
+    if os.path.isdir(layer.local_source_dir):
         try:
             # recipes-*/*/*.bb
-            cmd = '%s %s' % ('ls', os.path.join(layer.local_source_dir,'recipes-*/*/*.bb'))
-            recipes_list = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT).stdout.read()
-            recipes_list = recipes_list.decode("utf-8").strip()
-            if recipes_list and 'No such' not in recipes_list:
+            recipes_list = glob.glob(os.path.join(layer.local_source_dir, 'recipes-*/*/*.bb'))
+            for recipe in recipes_list:
                 for recipe in recipes_list.split('\n'):
                     recipe_path = recipe[recipe.rfind('recipes-'):]
                     recipe_name = recipe[recipe.rfind('/')+1:].replace('.bb','')
@@ -260,6 +258,9 @@
 
         except Exception as e:
             logger.warning("ERROR:scan_layer_content: %s" % e)
+    else:
+        logger.warning("ERROR: wrong path given")
+        raise KeyError("local_source_dir")
 
 class XhrLayer(View):
     """ Delete, Get, Add and Update Layer information
@@ -456,15 +457,18 @@
                              'layerdetailurl':
                              layer_dep.get_detailspage_url(project.pk)})
 
-            # Scan the layer's content and update components
-            scan_layer_content(layer,layer_version)
+            # Only scan_layer_content if layer is local
+            if layer_data.get('local_source_dir', None):
+                # Scan the layer's content and update components
+                scan_layer_content(layer,layer_version)
 
         except Layer_Version.DoesNotExist:
             return error_response("layer-dep-not-found")
         except Project.DoesNotExist:
             return error_response("project-not-found")
-        except KeyError:
-            return error_response("incorrect-parameters")
+        except KeyError as e:
+            _log("KeyError: %s" % e)
+            return error_response(f"incorrect-parameters")
 
         return JsonResponse({'error': "ok",
                              'imported_layer': {
diff --git a/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml b/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml
index df10693..f626572 100644
--- a/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml
+++ b/poky/bitbake/lib/toaster/toastergui/fixtures/toastergui-unittest-data.xml
@@ -46,12 +46,12 @@
   <object pk="1" model="orm.ProjectVariable">
     <field to="orm.project" name="project" rel="ManyToOneRel">1</field>
     <field type="CharField" name="name">MACHINE</field>
-    <field type="TextField" name="value">qemux86</field>
+    <field type="TextField" name="value">qemux86-64</field>
   </object>
   <object pk="2" model="orm.ProjectVariable">
     <field to="orm.project" name="project" rel="ManyToOneRel">2</field>
     <field type="CharField" name="name">MACHINE</field>
-    <field type="TextField" name="value">qemux86</field>
+    <field type="TextField" name="value">qemux86-64</field>
   </object>
   <object pk="1" model="orm.build">
     <field to="orm.project" name="project" rel="ManyToOneRel">1</field>
@@ -79,7 +79,7 @@
   </object>
   <object pk="3" model="orm.build">
     <field to="orm.project" name="project" rel="ManyToOneRel">1</field>
-    <field type="CharField" name="machine">qemux86</field>
+    <field type="CharField" name="machine">qemux86-64</field>
     <field type="CharField" name="distro"></field>
     <field type="CharField" name="distro_version"></field>
     <field type="DateTimeField" name="started_on">2016-02-12T18:46:20.114530+00:00</field>
@@ -91,7 +91,7 @@
   </object>
   <object pk="4" model="orm.build">
     <field to="orm.project" name="project" rel="ManyToOneRel">2</field>
-    <field type="CharField" name="machine">qemux86</field>
+    <field type="CharField" name="machine">qemux86-64</field>
     <field type="CharField" name="distro"></field>
     <field type="CharField" name="distro_version"></field>
     <field type="DateTimeField" name="started_on">2016-02-11T18:46:20.114530+00:00</field>
diff --git a/poky/bitbake/lib/toaster/toastergui/forms.py b/poky/bitbake/lib/toaster/toastergui/forms.py
new file mode 100644
index 0000000..0f279e0
--- /dev/null
+++ b/poky/bitbake/lib/toaster/toastergui/forms.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+# BitBake Toaster UI tests implementation
+#
+# Copyright (C) 2023 Savoir-faire Linux
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+from django import forms
+from django.core.validators import FileExtensionValidator
+
+class LoadFileForm(forms.Form):
+    eventlog_file = forms.FileField(widget=forms.FileInput(attrs={'accept': '.json'}))
diff --git a/poky/bitbake/lib/toaster/toastergui/static/css/default.css b/poky/bitbake/lib/toaster/toastergui/static/css/default.css
index 5cd7e211..284355e 100644
--- a/poky/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/poky/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -367,3 +367,31 @@
   }
 }
 /* End copied in from newer version of Font-Awesome 4.3.0 */
+
+
+#overlay {
+  display: flex;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.7);
+  align-items: center;
+  justify-content: center;
+  z-index: 999;
+}
+
+.spinner {
+  border: 6px solid rgba(255, 255, 255, 0.3);
+  border-radius: 50%;
+  border-top: 6px solid #3498db;
+  width: 50px;
+  height: 50px;
+  animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}