You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2024/01/16 13:35:44 UTC

(camel-website) 05/09: chore: update node-gyp to 10.0.1

This is an automated email from the ASF dual-hosted git repository.

zregvart pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-website.git

commit a0c2204443116af9303dd83d56b2d15710989777
Author: Zoran Regvart <zo...@regvart.com>
AuthorDate: Fri Jan 12 16:06:02 2024 +0100

    chore: update node-gyp to 10.0.1
---
 .pnp.cjs                                           |  746 ++++++-------
 ...pmcli-agent-npm-2.2.0-cf04e8a830-822ea07755.zip |  Bin 0 -> 8417 bytes
 .../@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip |  Bin 0 -> 12565 bytes
 .../abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip     |  Bin 0 -> 3145 bytes
 .../agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip |  Bin 0 -> 9391 bytes
 .../cache/asn1-npm-0.2.4-219dd49411-7e9ba05c58.zip |  Bin 8102 -> 0 bytes
 ...assert-plus-npm-1.0.0-cac95ef098-f4f991ae2d.zip |  Bin 4951 -> 0 bytes
 .../aws-sign2-npm-0.7.0-656c6cb84d-2ac497d739.zip  |  Bin 6119 -> 0 bytes
 .../aws4-npm-1.11.0-283476ad94-54886f07b3.zip      |  Bin 9403 -> 0 bytes
 ...crypt-pbkdf-npm-1.0.2-80db8b16ed-13a4cde058.zip |  Bin 13256 -> 0 bytes
 .../cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip   |  Bin 0 -> 25202 bytes
 .../caseless-npm-0.12.0-e83bc5df83-ea1efdf430.zip  |  Bin 6210 -> 0 bytes
 .../dashdash-npm-1.14.1-be8f10a286-137b287fa0.zip  |  Bin 25853 -> 0 bytes
 .../ecc-jsbn-npm-0.1.2-85b7a7be89-d43591f239.zip   |  Bin 9867 -> 0 bytes
 .../encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip  |  Bin 0 -> 4563 bytes
 .../err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip   |  Bin 0 -> 5770 bytes
 ...ial-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip |  Bin 0 -> 22892 bytes
 .../extsprintf-npm-1.3.0-61a92b324c-26967d6c7e.zip |  Bin 11192 -> 0 bytes
 ...rever-agent-npm-0.6.1-01dae53bf9-c1e1644d5e.zip |  Bin 5858 -> 0 bytes
 .../form-data-npm-2.3.3-c016cc11c0-1b6f3ccbf4.zip  |  Bin 38180 -> 0 bytes
 ...fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip |  Bin 0 -> 5333 bytes
 .../getpass-npm-0.1.7-519164a3be-ab18d55661.zip    |  Bin 4169 -> 0 bytes
 ...raceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip |  Bin 0 -> 11670 bytes
 ...graceful-fs-npm-4.2.4-734467635f-4485e131bd.zip |  Bin 10202 -> 0 bytes
 .../har-schema-npm-2.0.0-3a318c0ca5-d8946348f3.zip |  Bin 9520 -> 0 bytes
 ...r-validator-npm-5.1.5-bd9ac162f5-b998a7269c.zip |  Bin 4208 -> 0 bytes
 ...proxy-agent-npm-7.0.0-106a57cc8c-dbaaf3d9f3.zip |  Bin 0 -> 8523 bytes
 ...p-signature-npm-1.2.0-ee92426f34-2ff7112e6b.zip |  Bin 19149 -> 0 bytes
 ...proxy-agent-npm-7.0.2-83ea6a5d42-9ec844f78f.zip |  Bin 0 -> 12064 bytes
 .../iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip |  Bin 0 -> 198581 bytes
 .yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip |  Bin 0 -> 5271 bytes
 .../is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip  |  Bin 0 -> 2925 bytes
 .../isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip      |  Bin 0 -> 23319 bytes
 .../isstream-npm-0.1.2-8581c75385-22d9c18101.zip   |  Bin 4935 -> 0 bytes
 .../cache/jsbn-npm-0.1.1-0eb7132404-5450133242.zip |  Bin 14683 -> 0 bytes
 ...json-schema-npm-0.2.3-018ee3dfc9-2f98d28db7.zip |  Bin 45376 -> 0 bytes
 ...ingify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip |  Bin 5872 -> 0 bytes
 .../jsprim-npm-1.4.1-948d2c9ec3-819f15255a.zip     |  Bin 12780 -> 0 bytes
 ...tch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip |  Bin 0 -> 20820 bytes
 ...ass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip |  Bin 0 -> 2918 bytes
 ...ipass-fetch-npm-3.0.4-200ac7c66d-3edf72b900.zip |  Bin 0 -> 17450 bytes
 ...ipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip |  Bin 0 -> 2768 bytes
 .../minipass-npm-5.0.0-c64fb63c92-61682162d2.zip   |  Bin 0 -> 22402 bytes
 ...ss-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip |  Bin 0 -> 3797 bytes
 ...ipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip |  Bin 0 -> 31684 bytes
 .../negotiator-npm-0.6.3-9d50e36171-2723fb822a.zip |  Bin 0 -> 10848 bytes
 .../node-gyp-npm-10.0.1-48708ce70b-578cf0c821.zip  |  Bin 0 -> 461986 bytes
 .../node-gyp-npm-7.1.2-002c5798eb-b29061c737.zip   |  Bin 491407 -> 0 bytes
 .../cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip |  Bin 0 -> 11096 bytes
 .../oauth-sign-npm-0.9.0-7aa9422221-1809a366d2.zip |  Bin 5981 -> 0 bytes
 ...ormance-now-npm-2.1.0-45e3ce7e49-534e641aa8.zip |  Bin 9000 -> 0 bytes
 .../proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip   |  Bin 0 -> 3328 bytes
 ...omise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip |  Bin 0 -> 5699 bytes
 .../cache/psl-npm-1.8.0-226099d70e-5f62a8eca0.zip  |  Bin 135879 -> 0 bytes
 .yarn/cache/qs-npm-6.5.2-dbf9d8386b-ef17caa6e1.zip |  Bin 31101 -> 0 bytes
 .../request-npm-2.88.2-f4a57c72c4-005b8b237b.zip   |  Bin 64855 -> 0 bytes
 .../retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip     |  Bin 0 -> 14378 bytes
 ...mart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip |  Bin 0 -> 26632 bytes
 .../socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip      |  Bin 0 -> 43974 bytes
 ...proxy-agent-npm-8.0.2-df165543cf-ea727734bd.zip |  Bin 0 -> 7886 bytes
 .../sshpk-npm-1.16.1-feb759e7e0-b437fd3fd2.zip     |  Bin 73514 -> 0 bytes
 .../ssri-npm-10.0.5-1a7557d04d-453f9a1c24.zip      |  Bin 0 -> 12616 bytes
 .../cache/tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip |  Bin 51230 -> 0 bytes
 .../cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip  |  Bin 0 -> 52291 bytes
 ...ough-cookie-npm-2.5.0-79a2fe43fe-024cb13a4d.zip |  Bin 31795 -> 0 bytes
 .../tweetnacl-npm-0.14.5-a3f766c0d1-04ee27901c.zip |  Bin 52104 -> 0 bytes
 ...ue-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip |  Bin 0 -> 2715 bytes
 ...unique-slug-npm-4.0.0-e6b08f28aa-40912a8963.zip |  Bin 0 -> 2397 bytes
 .../verror-npm-1.10.0-c3f839c579-da548149dd.zip    |  Bin 14053 -> 0 bytes
 .../which-npm-4.0.0-dd31cd4928-f17e84c042.zip      |  Bin 0 -> 4498 bytes
 .../node_modules/node-gyp/.ready                   |    0
 .../node_modules/node-gyp/CHANGELOG.md             |  542 ++++++++--
 .../node_modules/node-gyp/CONTRIBUTING.md          |    2 +-
 .../node_modules/node-gyp/LICENSE                  |    0
 .../node_modules/node-gyp/README.md                |   99 +-
 .../node_modules/node-gyp/SECURITY.md              |    2 +
 .../node_modules/node-gyp/addon.gypi               |   43 +-
 .../node_modules/node-gyp/bin/node-gyp.js          |   56 +-
 .../node_modules/node-gyp/gyp/LICENSE              |    0
 .../node_modules/node-gyp/gyp/README.md            |   30 +
 .../node-gyp/gyp/data/win/large-pdb-shim.cc        |    0
 .../node_modules/node-gyp/gyp/gyp                  |    0
 .../node_modules/node-gyp/gyp/gyp.bat              |    0
 .../node_modules/node-gyp/gyp/gyp_main.py          |   14 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py |   39 +-
 .../node-gyp/gyp/pylib/gyp/MSVSProject.py          |    8 +-
 .../node-gyp/gyp/pylib/gyp/MSVSSettings.py         |   28 +-
 .../node-gyp/gyp/pylib/gyp/MSVSSettings_test.py    |    7 +-
 .../node-gyp/gyp/pylib/gyp/MSVSToolFile.py         |    2 +-
 .../node-gyp/gyp/pylib/gyp/MSVSUserFile.py         |    4 +-
 .../node-gyp/gyp/pylib/gyp/MSVSUtil.py             |    4 +-
 .../node-gyp/gyp/pylib/gyp/MSVSVersion.py          |   41 +-
 .../node-gyp/gyp/pylib/gyp/__init__.py             |   40 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/common.py  |   53 +-
 .../node-gyp/gyp/pylib/gyp/common_test.py          |    2 +-
 .../node-gyp/gyp/pylib/gyp/easy_xml.py             |   18 +-
 .../node-gyp/gyp/pylib/gyp/easy_xml_test.py        |   11 +-
 .../node-gyp/gyp/pylib/gyp/flock_tool.py           |    6 +-
 .../node-gyp/gyp/pylib/gyp/generator/__init__.py   |    0
 .../node-gyp/gyp/pylib/gyp/generator/analyzer.py   |   39 +-
 .../node-gyp/gyp/pylib/gyp/generator/android.py    |  229 ++--
 .../node-gyp/gyp/pylib/gyp/generator/cmake.py      |   35 +-
 .../pylib/gyp/generator/compile_commands_json.py   |    9 +-
 .../pylib/gyp/generator/dump_dependency_json.py    |    1 -
 .../node-gyp/gyp/pylib/gyp/generator/eclipse.py    |   17 +-
 .../node-gyp/gyp/pylib/gyp/generator/gypd.py       |    0
 .../node-gyp/gyp/pylib/gyp/generator/gypsh.py      |    2 +-
 .../node-gyp/gyp/pylib/gyp/generator/make.py       |  539 +++++++---
 .../node-gyp/gyp/pylib/gyp/generator/msvs.py       |  161 +--
 .../node-gyp/gyp/pylib/gyp/generator/msvs_test.py  |    7 +-
 .../node-gyp/gyp/pylib/gyp/generator/ninja.py      |  255 +++--
 .../node-gyp/gyp/pylib/gyp/generator/ninja_test.py |    2 +-
 .../node-gyp/gyp/pylib/gyp/generator/xcode.py      |   20 +-
 .../node-gyp/gyp/pylib/gyp/generator/xcode_test.py |    2 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/input.py   |  102 +-
 .../node-gyp/gyp/pylib/gyp/input_test.py           |    2 +-
 .../node-gyp/gyp/pylib/gyp/mac_tool.py             |   17 +-
 .../node-gyp/gyp/pylib/gyp/msvs_emulation.py       |  271 ++---
 .../node-gyp/gyp/pylib/gyp/ninja_syntax.py         |    6 +-
 .../node-gyp/gyp/pylib/gyp/simple_copy.py          |    5 +-
 .../node-gyp/gyp/pylib/gyp/win_tool.py             |   38 +-
 .../node-gyp/gyp/pylib/gyp/xcode_emulation.py      |  110 +-
 .../node-gyp/gyp/pylib/gyp/xcode_ninja.py          |    8 +-
 .../node-gyp/gyp/pylib/gyp/xcodeproj_file.py       |   94 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py |    4 +-
 .../node-gyp/gyp/pylib/packaging/LICENSE           |    3 +
 .../node-gyp/gyp/pylib/packaging/LICENSE.APACHE    |  177 ++++
 .../node-gyp/gyp/pylib/packaging/LICENSE.BSD       |   23 +
 .../node-gyp/gyp/pylib/packaging/__init__.py       |   15 +
 .../node-gyp/gyp/pylib/packaging/_elffile.py       |  108 ++
 .../node-gyp/gyp/pylib/packaging/_manylinux.py     |  252 +++++
 .../node-gyp/gyp/pylib/packaging/_musllinux.py     |   83 ++
 .../node-gyp/gyp/pylib/packaging/_parser.py        |  359 +++++++
 .../node-gyp/gyp/pylib/packaging/_structures.py    |   61 ++
 .../node-gyp/gyp/pylib/packaging/_tokenizer.py     |  192 ++++
 .../node-gyp/gyp/pylib/packaging/markers.py        |  252 +++++
 .../node-gyp/gyp/pylib/packaging/metadata.py       |  825 +++++++++++++++
 .../node-gyp/gyp/pylib/packaging/py.typed          |    0
 .../node-gyp/gyp/pylib/packaging/requirements.py   |   90 ++
 .../node-gyp/gyp/pylib/packaging/specifiers.py     | 1030 ++++++++++++++++++
 .../node-gyp/gyp/pylib/packaging/tags.py           |  553 ++++++++++
 .../node-gyp/gyp/pylib/packaging/utils.py          |  172 +++
 .../node-gyp/gyp/pylib/packaging/version.py        |  563 ++++++++++
 .../node_modules/node-gyp/gyp/pyproject.toml       |  119 +++
 .../node_modules/node-gyp/gyp/test_gyp.py          |   31 +-
 .../node_modules/node-gyp/lib/Find-VisualStudio.cs |    0
 .../node_modules/node-gyp/lib/build.js             |  220 ++++
 .../node_modules/node-gyp/lib/clean.js             |   10 +-
 .../node_modules/node-gyp/lib/configure.js         |  282 +++++
 .../node-gyp/lib/create-config-gypi.js             |  150 +++
 .../node_modules/node-gyp/lib/download.js          |   39 +
 .../node-gyp/lib/find-node-directory.js            |   10 +-
 .../node_modules/node-gyp/lib/find-python.js       |  320 +++---
 .../node_modules/node-gyp/lib/find-visualstudio.js |  259 ++---
 .../node_modules/node-gyp/lib/install.js           |  415 ++++++++
 .../node_modules/node-gyp/lib/list.js              |   26 +
 .../node_modules/node-gyp/lib/log.js               |  169 +++
 .../node_modules/node-gyp/lib/node-gyp.js          |  188 ++++
 .../node_modules/node-gyp/lib/process-release.js   |   45 +-
 .../node_modules/node-gyp/lib/rebuild.js           |    3 +-
 .../node_modules/node-gyp/lib/remove.js            |   43 +
 .../node_modules/node-gyp/lib/util.js              |   81 ++
 .../node-gyp/macOS_Catalina_acid_test.sh           |    0
 .../node_modules/node-gyp/package.json             |   33 +-
 .../node-gyp/src/win_delay_load_hook.cc            |    0
 .../node-gyp/.github/ISSUE_TEMPLATE.md             |   49 -
 .../node-gyp/.github/PULL_REQUEST_TEMPLATE.md      |   17 -
 .../node-gyp/.github/workflows/tests.yml           |   51 -
 .../node_modules/node-gyp/gyp/.flake8              |    4 -
 .../gyp/.github/workflows/Python_tests.yml         |   31 -
 .../node-gyp/gyp/.github/workflows/node-gyp.yml    |   40 -
 .../gyp/.github/workflows/nodejs-windows.yml       |   27 -
 .../gyp/.github/workflows/release-please.yml       |   16 -
 .../node_modules/node-gyp/gyp/AUTHORS              |   16 -
 .../node_modules/node-gyp/gyp/CHANGELOG.md         |   70 --
 .../node_modules/node-gyp/gyp/CODE_OF_CONDUCT.md   |    4 -
 .../node_modules/node-gyp/gyp/CONTRIBUTING.md      |   32 -
 .../node_modules/node-gyp/gyp/README.md            |    7 -
 .../pylib/gyp/__pycache__/MSVSUtil.cpython-39.pyc  |  Bin 6352 -> 0 bytes
 .../gyp/__pycache__/MSVSVersion.cpython-39.pyc     |  Bin 12999 -> 0 bytes
 .../pylib/gyp/__pycache__/__init__.cpython-39.pyc  |  Bin 13455 -> 0 bytes
 .../pylib/gyp/__pycache__/common.cpython-39.pyc    |  Bin 15271 -> 0 bytes
 .../gyp/pylib/gyp/__pycache__/input.cpython-39.pyc |  Bin 51925 -> 0 bytes
 .../gyp/__pycache__/msvs_emulation.cpython-39.pyc  |  Bin 40741 -> 0 bytes
 .../gyp/__pycache__/ninja_syntax.cpython-39.pyc    |  Bin 4712 -> 0 bytes
 .../gyp/__pycache__/simple_copy.cpython-39.pyc     |  Bin 1888 -> 0 bytes
 .../gyp/__pycache__/xcode_emulation.cpython-39.pyc |  Bin 55773 -> 0 bytes
 .../gyp/__pycache__/xcode_ninja.cpython-39.pyc     |  Bin 6900 -> 0 bytes
 .../gyp/__pycache__/xcodeproj_file.cpython-39.pyc  |  Bin 76891 -> 0 bytes
 .../generator/__pycache__/__init__.cpython-39.pyc  |  Bin 236 -> 0 bytes
 .../gyp/generator/__pycache__/make.cpython-39.pyc  |  Bin 63116 -> 0 bytes
 .../gyp/generator/__pycache__/ninja.cpython-39.pyc |  Bin 60203 -> 0 bytes
 .../gyp/generator/__pycache__/xcode.cpython-39.pyc |  Bin 21707 -> 0 bytes
 .../node_modules/node-gyp/gyp/requirements_dev.txt |    2 -
 .../node_modules/node-gyp/gyp/setup.py             |   44 -
 .../node_modules/node-gyp/gyp/tools/README         |   15 -
 .../node_modules/node-gyp/gyp/tools/Xcode/README   |    5 -
 .../gyp/tools/Xcode/Specifications/gyp.pbfilespec  |   27 -
 .../gyp/tools/Xcode/Specifications/gyp.xclangspec  |  226 ----
 .../node_modules/node-gyp/gyp/tools/emacs/README   |   12 -
 .../node-gyp/gyp/tools/emacs/gyp-tests.el          |   63 --
 .../node_modules/node-gyp/gyp/tools/emacs/gyp.el   |  275 -----
 .../node-gyp/gyp/tools/emacs/run-unit-tests.sh     |    7 -
 .../node-gyp/gyp/tools/emacs/testdata/media.gyp    | 1105 -------------------
 .../gyp/tools/emacs/testdata/media.gyp.fontified   | 1107 --------------------
 .../node_modules/node-gyp/gyp/tools/graphviz.py    |  103 --
 .../node_modules/node-gyp/gyp/tools/pretty_gyp.py  |  157 ---
 .../node_modules/node-gyp/gyp/tools/pretty_sln.py  |  182 ----
 .../node-gyp/gyp/tools/pretty_vcproj.py            |  345 ------
 .../node_modules/node-gyp/lib/build.js             |  204 ----
 .../node_modules/node-gyp/lib/configure.js         |  386 -------
 .../node_modules/node-gyp/lib/install.js           |  447 --------
 .../node_modules/node-gyp/lib/list.js              |   27 -
 .../node_modules/node-gyp/lib/node-gyp.js          |  210 ----
 .../node_modules/node-gyp/lib/proxy.js             |   92 --
 .../node_modules/node-gyp/lib/remove.js            |   46 -
 .../node_modules/node-gyp/lib/util.js              |   64 --
 .../node_modules/node-gyp/macOS_Catalina.md        |  104 --
 .../node_modules/node-gyp/test/common.js           |    3 -
 .../test/fixtures/VS_2017_BuildTools_minimal.txt   |    1 -
 .../test/fixtures/VS_2017_Community_workload.txt   |    1 -
 .../node-gyp/test/fixtures/VS_2017_Express.txt     |    1 -
 .../node-gyp/test/fixtures/VS_2017_Unusable.txt    |    1 -
 .../test/fixtures/VS_2019_BuildTools_minimal.txt   |    1 -
 .../test/fixtures/VS_2019_Community_workload.txt   |    1 -
 .../node-gyp/test/fixtures/VS_2019_Preview.txt     |    1 -
 .../node-gyp/test/fixtures/ca-bundle.crt           |   40 -
 .../node_modules/node-gyp/test/fixtures/ca.crt     |   21 -
 .../node_modules/node-gyp/test/fixtures/server.crt |   21 -
 .../node_modules/node-gyp/test/fixtures/server.key |   27 -
 .../node-gyp/test/fixtures/test-charmap.py         |   30 -
 .../node-gyp/test/process-exec-sync.js             |  140 ---
 .../node_modules/node-gyp/test/simple-proxy.js     |   27 -
 .../node_modules/node-gyp/test/test-addon.js       |  150 ---
 .../node-gyp/test/test-configure-python.js         |   79 --
 .../node_modules/node-gyp/test/test-download.js    |  268 -----
 .../node-gyp/test/test-find-accessible-sync.js     |   84 --
 .../node-gyp/test/test-find-node-directory.js      |  119 ---
 .../node_modules/node-gyp/test/test-find-python.js |  230 ----
 .../node-gyp/test/test-find-visualstudio.js        |  676 ------------
 .../node_modules/node-gyp/test/test-install.js     |   38 -
 .../node_modules/node-gyp/test/test-options.js     |   31 -
 .../node-gyp/test/test-process-release.js          |  434 --------
 .../node_modules/node-gyp/update-gyp.py            |   45 -
 antora-ui-camel/.pnp.cjs                           | 1074 ++++++++++---------
 ...saacs-cliui-npm-8.0.2-f4364666d5-e9ed5fd27c.zip |  Bin 0 -> 10590 bytes
 ...pmcli-agent-npm-2.2.0-cf04e8a830-822ea07755.zip |  Bin 0 -> 8417 bytes
 .../@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip |  Bin 0 -> 12565 bytes
 ...-parseargs-npm-0.11.0-cd2a3fe948-115e8ceeec.zip |  Bin 0 -> 28004 bytes
 .../abbrev-npm-1.1.1-3659247eab-2d88294118.zip     |  Bin 2939 -> 0 bytes
 .../abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip     |  Bin 0 -> 3145 bytes
 .../agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip |  Bin 0 -> 9391 bytes
 ...egate-error-npm-3.1.0-415a406f4e-1101a33f21.zip |  Bin 0 -> 4089 bytes
 .../ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip |  Bin 0 -> 3905 bytes
 ...ansi-styles-npm-6.2.1-d43647018c-70fdf883b7.zip |  Bin 0 -> 7052 bytes
 .../aproba-npm-1.2.0-34129f0778-48def77733.zip     |  Bin 4270 -> 0 bytes
 ...e-there-yet-npm-1.1.5-b8418908b0-d7c3608add.zip |  Bin 7358 -> 0 bytes
 .../cache/asn1-npm-0.2.4-219dd49411-7e9ba05c58.zip |  Bin 8102 -> 0 bytes
 ...assert-plus-npm-1.0.0-cac95ef098-f4f991ae2d.zip |  Bin 4951 -> 0 bytes
 .../asynckit-npm-0.4.0-c718858525-3ce727cbc7.zip   |  Bin 13936 -> 0 bytes
 .../aws-sign2-npm-0.7.0-656c6cb84d-2ac497d739.zip  |  Bin 6119 -> 0 bytes
 .../aws4-npm-1.11.0-283476ad94-54886f07b3.zip      |  Bin 9403 -> 0 bytes
 ...crypt-pbkdf-npm-1.0.2-80db8b16ed-13a4cde058.zip |  Bin 13256 -> 0 bytes
 .../cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip   |  Bin 0 -> 25202 bytes
 .../caseless-npm-0.12.0-e83bc5df83-ea1efdf430.zip  |  Bin 6210 -> 0 bytes
 ...clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip |  Bin 0 -> 3676 bytes
 ...ined-stream-npm-1.0.8-dc14d4a63a-2e969e637d.zip |  Bin 5212 -> 0 bytes
 ...rol-strings-npm-1.1.0-e3160e5275-27b5fa302b.zip |  Bin 5891 -> 0 bytes
 ...cross-spawn-npm-7.0.3-e4ff3e65b3-e1a13869d2.zip |  Bin 0 -> 10222 bytes
 .../dashdash-npm-1.14.1-be8f10a286-137b287fa0.zip  |  Bin 25853 -> 0 bytes
 ...ayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip |  Bin 4667 -> 0 bytes
 .../delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip  |  Bin 4237 -> 0 bytes
 ...tasianwidth-npm-0.2.0-c37eb16bd1-9b1d3e1bae.zip |  Bin 0 -> 3401 bytes
 .../ecc-jsbn-npm-0.1.2-85b7a7be89-d43591f239.zip   |  Bin 9867 -> 0 bytes
 ...emoji-regex-npm-9.2.2-e6fac8d058-915acf859c.zip |  Bin 0 -> 20945 bytes
 .../encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip  |  Bin 0 -> 4563 bytes
 .../err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip   |  Bin 0 -> 5770 bytes
 ...ial-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip |  Bin 0 -> 22892 bytes
 .../extsprintf-npm-1.3.0-61a92b324c-26967d6c7e.zip |  Bin 11192 -> 0 bytes
 ...round-child-npm-3.1.1-77e78ed774-087edd4485.zip |  Bin 0 -> 27541 bytes
 ...rever-agent-npm-0.6.1-01dae53bf9-c1e1644d5e.zip |  Bin 5858 -> 0 bytes
 .../form-data-npm-2.3.3-c016cc11c0-1b6f3ccbf4.zip  |  Bin 38180 -> 0 bytes
 ...fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip |  Bin 0 -> 5333 bytes
 .../gauge-npm-2.7.4-2189a73529-0db20a7def.zip      |  Bin 20131 -> 0 bytes
 .../getpass-npm-0.1.7-519164a3be-ab18d55661.zip    |  Bin 4169 -> 0 bytes
 .../glob-npm-10.3.10-da1ef8b112-38bdb2c9ce.zip     |  Bin 0 -> 132456 bytes
 ...raceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip |  Bin 0 -> 11670 bytes
 ...graceful-fs-npm-4.2.4-734467635f-4485e131bd.zip |  Bin 10202 -> 0 bytes
 .../har-schema-npm-2.0.0-3a318c0ca5-d8946348f3.zip |  Bin 9520 -> 0 bytes
 ...r-validator-npm-5.1.5-bd9ac162f5-b998a7269c.zip |  Bin 4208 -> 0 bytes
 ...has-unicode-npm-2.0.1-893adb4747-041b4293ad.zip |  Bin 2731 -> 0 bytes
 ...e-semantics-npm-4.1.1-1120131375-362d5ed66b.zip |  Bin 0 -> 11972 bytes
 ...proxy-agent-npm-7.0.0-106a57cc8c-dbaaf3d9f3.zip |  Bin 0 -> 8523 bytes
 ...p-signature-npm-1.2.0-ee92426f34-2ff7112e6b.zip |  Bin 19149 -> 0 bytes
 ...proxy-agent-npm-7.0.2-83ea6a5d42-9ec844f78f.zip |  Bin 0 -> 12064 bytes
 .../iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip |  Bin 0 -> 198581 bytes
 .../cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip   |  Bin 0 -> 5271 bytes
 .../is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip  |  Bin 0 -> 2925 bytes
 ...-typedarray-npm-1.0.0-bbd99de5b6-4b433bfb0f.zip |  Bin 2765 -> 0 bytes
 .../isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip      |  Bin 0 -> 23319 bytes
 .../isstream-npm-0.1.2-8581c75385-22d9c18101.zip   |  Bin 4935 -> 0 bytes
 .../jackspeak-npm-2.3.6-42e1233172-6e6490d676.zip  |  Bin 0 -> 65779 bytes
 .../cache/jsbn-npm-0.1.1-0eb7132404-5450133242.zip |  Bin 14683 -> 0 bytes
 ...json-schema-npm-0.2.3-018ee3dfc9-2f98d28db7.zip |  Bin 45376 -> 0 bytes
 ...ingify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip |  Bin 5872 -> 0 bytes
 .../jsprim-npm-1.4.1-948d2c9ec3-819f15255a.zip     |  Bin 12780 -> 0 bytes
 .../lru-cache-npm-10.1.0-f3d3a0f0ab-207278d6fa.zip |  Bin 0 -> 106997 bytes
 ...tch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip |  Bin 0 -> 20820 bytes
 .../minimatch-npm-9.0.3-69d7d6fad5-c81b47d281.zip  |  Bin 0 -> 127294 bytes
 ...ass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip |  Bin 0 -> 2918 bytes
 ...ipass-fetch-npm-3.0.4-200ac7c66d-3edf72b900.zip |  Bin 0 -> 17450 bytes
 ...ipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip |  Bin 0 -> 2768 bytes
 .../minipass-npm-5.0.0-c64fb63c92-61682162d2.zip   |  Bin 0 -> 22402 bytes
 .../minipass-npm-7.0.4-eacb4e042e-e864bd02ce.zip   |  Bin 0 -> 73520 bytes
 ...ss-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip |  Bin 0 -> 3797 bytes
 ...ipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip |  Bin 0 -> 31684 bytes
 .../negotiator-npm-0.6.3-9d50e36171-2723fb822a.zip |  Bin 0 -> 10848 bytes
 .../node-gyp-npm-10.0.1-48708ce70b-578cf0c821.zip  |  Bin 0 -> 461986 bytes
 .../node-gyp-npm-7.1.2-002c5798eb-b29061c737.zip   |  Bin 491407 -> 0 bytes
 .../cache/nopt-npm-5.0.0-304b40fbfe-00f9bb2d16.zip |  Bin 10663 -> 0 bytes
 .../cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip |  Bin 0 -> 11096 bytes
 .../npmlog-npm-4.1.2-cfb32957b5-b6b85c9f33.zip     |  Bin 7489 -> 0 bytes
 .../oauth-sign-npm-0.9.0-7aa9422221-1809a366d2.zip |  Bin 5981 -> 0 bytes
 .../p-map-npm-4.0.0-4677ae07c7-7ba4a2b1e2.zip      |  Bin 0 -> 4836 bytes
 .../path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip   |  Bin 0 -> 3358 bytes
 ...ath-scurry-npm-1.10.1-52bd946f2e-eebfb8304f.zip |  Bin 0 -> 109900 bytes
 ...ormance-now-npm-2.1.0-45e3ce7e49-534e641aa8.zip |  Bin 9000 -> 0 bytes
 .../proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip   |  Bin 0 -> 3328 bytes
 ...omise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip |  Bin 0 -> 5699 bytes
 .../cache/psl-npm-1.8.0-226099d70e-5f62a8eca0.zip  |  Bin 135879 -> 0 bytes
 .../cache/qs-npm-6.5.3-90b2635484-485c990fba.zip   |  Bin 34875 -> 0 bytes
 .../request-npm-2.88.2-f4a57c72c4-005b8b237b.zip   |  Bin 64855 -> 0 bytes
 .../retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip     |  Bin 0 -> 14378 bytes
 ...ang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip |  Bin 0 -> 2298 bytes
 ...ebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip |  Bin 0 -> 2557 bytes
 ...mart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip |  Bin 0 -> 26632 bytes
 .../socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip      |  Bin 0 -> 43974 bytes
 ...proxy-agent-npm-8.0.2-df165543cf-ea727734bd.zip |  Bin 0 -> 7886 bytes
 .../sshpk-npm-1.16.1-feb759e7e0-b437fd3fd2.zip     |  Bin 73514 -> 0 bytes
 .../ssri-npm-10.0.5-1a7557d04d-453f9a1c24.zip      |  Bin 0 -> 12616 bytes
 ...tring-width-npm-5.1.2-bf60531341-7369deaa29.zip |  Bin 0 -> 3889 bytes
 .../strip-ansi-npm-7.1.0-7453b80b79-475f53e9c4.zip |  Bin 0 -> 3247 bytes
 .../cache/tar-npm-6.0.5-a5360f3389-6d851c92e3.zip  |  Bin 47114 -> 0 bytes
 .../cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip  |  Bin 0 -> 52291 bytes
 ...ough-cookie-npm-2.5.0-79a2fe43fe-024cb13a4d.zip |  Bin 31795 -> 0 bytes
 .../tweetnacl-npm-0.14.5-a3f766c0d1-04ee27901c.zip |  Bin 52104 -> 0 bytes
 ...ue-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip |  Bin 0 -> 2715 bytes
 ...unique-slug-npm-4.0.0-e6b08f28aa-40912a8963.zip |  Bin 0 -> 2397 bytes
 .../verror-npm-1.10.0-c3f839c579-da548149dd.zip    |  Bin 14053 -> 0 bytes
 .../which-npm-4.0.0-dd31cd4928-f17e84c042.zip      |  Bin 0 -> 4498 bytes
 .../wide-align-npm-1.1.3-48c7d4953c-187642e0bb.zip |  Bin 2800 -> 0 bytes
 .../wrap-ansi-npm-7.0.0-ad6e1a0554-cebdaeca3a.zip  |  Bin 0 -> 5104 bytes
 .../wrap-ansi-npm-8.1.0-26a4e6ae28-7b1e4b35e9.zip  |  Bin 0 -> 5882 bytes
 .../node_modules/node-gyp/.ready                   |    0
 .../node_modules/node-gyp/CHANGELOG.md             |  542 ++++++++--
 .../node_modules/node-gyp/CONTRIBUTING.md          |    2 +-
 .../node_modules/node-gyp/LICENSE                  |    0
 .../node_modules/node-gyp/README.md                |   99 +-
 .../node_modules/node-gyp/SECURITY.md              |    2 +
 .../node_modules/node-gyp/addon.gypi               |   43 +-
 .../node_modules/node-gyp/bin/node-gyp.js          |   56 +-
 .../node_modules/node-gyp/gyp/LICENSE              |    0
 .../node_modules/node-gyp/gyp/README.md            |   30 +
 .../node-gyp/gyp/data/win/large-pdb-shim.cc        |    0
 .../node_modules/node-gyp/gyp/gyp                  |    0
 .../node_modules/node-gyp/gyp/gyp.bat              |    0
 .../node_modules/node-gyp/gyp/gyp_main.py          |   14 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py |   39 +-
 .../node-gyp/gyp/pylib/gyp/MSVSProject.py          |    8 +-
 .../node-gyp/gyp/pylib/gyp/MSVSSettings.py         |   28 +-
 .../node-gyp/gyp/pylib/gyp/MSVSSettings_test.py    |    7 +-
 .../node-gyp/gyp/pylib/gyp/MSVSToolFile.py         |    2 +-
 .../node-gyp/gyp/pylib/gyp/MSVSUserFile.py         |    4 +-
 .../node-gyp/gyp/pylib/gyp/MSVSUtil.py             |    4 +-
 .../node-gyp/gyp/pylib/gyp/MSVSVersion.py          |   41 +-
 .../node-gyp/gyp/pylib/gyp/__init__.py             |   40 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/common.py  |   53 +-
 .../node-gyp/gyp/pylib/gyp/common_test.py          |    2 +-
 .../node-gyp/gyp/pylib/gyp/easy_xml.py             |   18 +-
 .../node-gyp/gyp/pylib/gyp/easy_xml_test.py        |   11 +-
 .../node-gyp/gyp/pylib/gyp/flock_tool.py           |    6 +-
 .../node-gyp/gyp/pylib/gyp/generator/__init__.py   |    0
 .../node-gyp/gyp/pylib/gyp/generator/analyzer.py   |   39 +-
 .../node-gyp/gyp/pylib/gyp/generator/android.py    |  229 ++--
 .../node-gyp/gyp/pylib/gyp/generator/cmake.py      |   35 +-
 .../pylib/gyp/generator/compile_commands_json.py   |    9 +-
 .../pylib/gyp/generator/dump_dependency_json.py    |    1 -
 .../node-gyp/gyp/pylib/gyp/generator/eclipse.py    |   17 +-
 .../node-gyp/gyp/pylib/gyp/generator/gypd.py       |    0
 .../node-gyp/gyp/pylib/gyp/generator/gypsh.py      |    2 +-
 .../node-gyp/gyp/pylib/gyp/generator/make.py       |  539 +++++++---
 .../node-gyp/gyp/pylib/gyp/generator/msvs.py       |  161 +--
 .../node-gyp/gyp/pylib/gyp/generator/msvs_test.py  |    7 +-
 .../node-gyp/gyp/pylib/gyp/generator/ninja.py      |  255 +++--
 .../node-gyp/gyp/pylib/gyp/generator/ninja_test.py |    2 +-
 .../node-gyp/gyp/pylib/gyp/generator/xcode.py      |   20 +-
 .../node-gyp/gyp/pylib/gyp/generator/xcode_test.py |    2 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/input.py   |  102 +-
 .../node-gyp/gyp/pylib/gyp/input_test.py           |    2 +-
 .../node-gyp/gyp/pylib/gyp/mac_tool.py             |   17 +-
 .../node-gyp/gyp/pylib/gyp/msvs_emulation.py       |  271 ++---
 .../node-gyp/gyp/pylib/gyp/ninja_syntax.py         |    6 +-
 .../node-gyp/gyp/pylib/gyp/simple_copy.py          |    5 +-
 .../node-gyp/gyp/pylib/gyp/win_tool.py             |   38 +-
 .../node-gyp/gyp/pylib/gyp/xcode_emulation.py      |  110 +-
 .../node-gyp/gyp/pylib/gyp/xcode_ninja.py          |    8 +-
 .../node-gyp/gyp/pylib/gyp/xcodeproj_file.py       |   94 +-
 .../node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py |    4 +-
 .../node-gyp/gyp/pylib/packaging/LICENSE           |    3 +
 .../node-gyp/gyp/pylib/packaging/LICENSE.APACHE    |  177 ++++
 .../node-gyp/gyp/pylib/packaging/LICENSE.BSD       |   23 +
 .../node-gyp/gyp/pylib/packaging/__init__.py       |   15 +
 .../node-gyp/gyp/pylib/packaging/_elffile.py       |  108 ++
 .../node-gyp/gyp/pylib/packaging/_manylinux.py     |  252 +++++
 .../node-gyp/gyp/pylib/packaging/_musllinux.py     |   83 ++
 .../node-gyp/gyp/pylib/packaging/_parser.py        |  359 +++++++
 .../node-gyp/gyp/pylib/packaging/_structures.py    |   61 ++
 .../node-gyp/gyp/pylib/packaging/_tokenizer.py     |  192 ++++
 .../node-gyp/gyp/pylib/packaging/markers.py        |  252 +++++
 .../node-gyp/gyp/pylib/packaging/metadata.py       |  825 +++++++++++++++
 .../node-gyp/gyp/pylib/packaging/py.typed          |    0
 .../node-gyp/gyp/pylib/packaging/requirements.py   |   90 ++
 .../node-gyp/gyp/pylib/packaging/specifiers.py     | 1030 ++++++++++++++++++
 .../node-gyp/gyp/pylib/packaging/tags.py           |  553 ++++++++++
 .../node-gyp/gyp/pylib/packaging/utils.py          |  172 +++
 .../node-gyp/gyp/pylib/packaging/version.py        |  563 ++++++++++
 .../node_modules/node-gyp/gyp/pyproject.toml       |  119 +++
 .../node_modules/node-gyp/gyp/test_gyp.py          |   31 +-
 .../node_modules/node-gyp/lib/Find-VisualStudio.cs |    0
 .../node_modules/node-gyp/lib/build.js             |  220 ++++
 .../node_modules/node-gyp/lib/clean.js             |   10 +-
 .../node_modules/node-gyp/lib/configure.js         |  282 +++++
 .../node-gyp/lib/create-config-gypi.js             |  150 +++
 .../node_modules/node-gyp/lib/download.js          |   39 +
 .../node-gyp/lib/find-node-directory.js            |   10 +-
 .../node_modules/node-gyp/lib/find-python.js       |  320 +++---
 .../node_modules/node-gyp/lib/find-visualstudio.js |  259 ++---
 .../node_modules/node-gyp/lib/install.js           |  415 ++++++++
 .../node_modules/node-gyp/lib/list.js              |   26 +
 .../node_modules/node-gyp/lib/log.js               |  169 +++
 .../node_modules/node-gyp/lib/node-gyp.js          |  188 ++++
 .../node_modules/node-gyp/lib/process-release.js   |   45 +-
 .../node_modules/node-gyp/lib/rebuild.js           |    3 +-
 .../node_modules/node-gyp/lib/remove.js            |   43 +
 .../node_modules/node-gyp/lib/util.js              |   81 ++
 .../node-gyp/macOS_Catalina_acid_test.sh           |    0
 .../node_modules/node-gyp/package.json             |   33 +-
 .../node-gyp/src/win_delay_load_hook.cc            |    0
 .../node-gyp/.github/ISSUE_TEMPLATE.md             |   49 -
 .../node-gyp/.github/PULL_REQUEST_TEMPLATE.md      |   17 -
 .../node-gyp/.github/workflows/tests.yml           |   51 -
 .../node_modules/node-gyp/gyp/.flake8              |    4 -
 .../gyp/.github/workflows/Python_tests.yml         |   31 -
 .../node-gyp/gyp/.github/workflows/node-gyp.yml    |   40 -
 .../gyp/.github/workflows/nodejs-windows.yml       |   27 -
 .../gyp/.github/workflows/release-please.yml       |   16 -
 .../node_modules/node-gyp/gyp/AUTHORS              |   16 -
 .../node_modules/node-gyp/gyp/CHANGELOG.md         |   70 --
 .../node_modules/node-gyp/gyp/CODE_OF_CONDUCT.md   |    4 -
 .../node_modules/node-gyp/gyp/CONTRIBUTING.md      |   32 -
 .../node_modules/node-gyp/gyp/README.md            |    7 -
 .../node_modules/node-gyp/gyp/requirements_dev.txt |    2 -
 .../node_modules/node-gyp/gyp/setup.py             |   44 -
 .../node_modules/node-gyp/gyp/tools/README         |   15 -
 .../node_modules/node-gyp/gyp/tools/Xcode/README   |    5 -
 .../gyp/tools/Xcode/Specifications/gyp.pbfilespec  |   27 -
 .../gyp/tools/Xcode/Specifications/gyp.xclangspec  |  226 ----
 .../node_modules/node-gyp/gyp/tools/emacs/README   |   12 -
 .../node-gyp/gyp/tools/emacs/gyp-tests.el          |   63 --
 .../node_modules/node-gyp/gyp/tools/emacs/gyp.el   |  275 -----
 .../node-gyp/gyp/tools/emacs/run-unit-tests.sh     |    7 -
 .../node-gyp/gyp/tools/emacs/testdata/media.gyp    | 1105 -------------------
 .../gyp/tools/emacs/testdata/media.gyp.fontified   | 1107 --------------------
 .../node_modules/node-gyp/gyp/tools/graphviz.py    |  103 --
 .../node_modules/node-gyp/gyp/tools/pretty_gyp.py  |  157 ---
 .../node_modules/node-gyp/gyp/tools/pretty_sln.py  |  182 ----
 .../node-gyp/gyp/tools/pretty_vcproj.py            |  345 ------
 .../node_modules/node-gyp/lib/build.js             |  204 ----
 .../node_modules/node-gyp/lib/configure.js         |  386 -------
 .../node_modules/node-gyp/lib/install.js           |  447 --------
 .../node_modules/node-gyp/lib/list.js              |   27 -
 .../node_modules/node-gyp/lib/node-gyp.js          |  210 ----
 .../node_modules/node-gyp/lib/proxy.js             |   92 --
 .../node_modules/node-gyp/lib/remove.js            |   46 -
 .../node_modules/node-gyp/lib/util.js              |   64 --
 .../node_modules/node-gyp/macOS_Catalina.md        |  104 --
 .../node_modules/node-gyp/test/common.js           |    3 -
 .../test/fixtures/VS_2017_BuildTools_minimal.txt   |    1 -
 .../test/fixtures/VS_2017_Community_workload.txt   |    1 -
 .../node-gyp/test/fixtures/VS_2017_Express.txt     |    1 -
 .../node-gyp/test/fixtures/VS_2017_Unusable.txt    |    1 -
 .../test/fixtures/VS_2019_BuildTools_minimal.txt   |    1 -
 .../test/fixtures/VS_2019_Community_workload.txt   |    1 -
 .../node-gyp/test/fixtures/VS_2019_Preview.txt     |    1 -
 .../node-gyp/test/fixtures/ca-bundle.crt           |   40 -
 .../node_modules/node-gyp/test/fixtures/ca.crt     |   21 -
 .../node_modules/node-gyp/test/fixtures/server.crt |   21 -
 .../node_modules/node-gyp/test/fixtures/server.key |   27 -
 .../node-gyp/test/fixtures/test-charmap.py         |   30 -
 .../node-gyp/test/process-exec-sync.js             |  140 ---
 .../node_modules/node-gyp/test/simple-proxy.js     |   27 -
 .../node_modules/node-gyp/test/test-addon.js       |  150 ---
 .../node-gyp/test/test-configure-python.js         |   79 --
 .../node_modules/node-gyp/test/test-download.js    |  268 -----
 .../node-gyp/test/test-find-accessible-sync.js     |   84 --
 .../node-gyp/test/test-find-node-directory.js      |  119 ---
 .../node_modules/node-gyp/test/test-find-python.js |  230 ----
 .../node-gyp/test/test-find-visualstudio.js        |  676 ------------
 .../node_modules/node-gyp/test/test-install.js     |   38 -
 .../node_modules/node-gyp/test/test-options.js     |   31 -
 .../node-gyp/test/test-process-release.js          |  434 --------
 .../node_modules/node-gyp/update-gyp.py            |   45 -
 antora-ui-camel/yarn.lock                          | 1007 ++++++++++--------
 yarn.lock                                          |  673 ++++++------
 514 files changed, 19212 insertions(+), 20920 deletions(-)

diff --git a/.pnp.cjs b/.pnp.cjs
index 9769a27c..450ef689 100755
--- a/.pnp.cjs
+++ b/.pnp.cjs
@@ -2827,7 +2827,7 @@ const RAW_RUNTIME_STATE =
           ["npmlog", "npm:5.0.1"],\
           ["rimraf", "npm:3.0.2"],\
           ["semver", "npm:7.3.5"],\
-          ["tar", "npm:6.1.11"]\
+          ["tar", "npm:6.2.0"]\
         ],\
         "linkType": "HARD"\
       }]\
@@ -3328,6 +3328,30 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["@npmcli/agent", [\
+      ["npm:2.2.0", {\
+        "packageLocation": "./.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-822ea07755.zip/node_modules/@npmcli/agent/",\
+        "packageDependencies": [\
+          ["@npmcli/agent", "npm:2.2.0"],\
+          ["agent-base", "npm:7.1.0"],\
+          ["http-proxy-agent", "npm:7.0.0"],\
+          ["https-proxy-agent", "npm:7.0.2"],\
+          ["lru-cache", "npm:10.1.0"],\
+          ["socks-proxy-agent", "npm:8.0.2"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
+    ["@npmcli/fs", [\
+      ["npm:3.1.0", {\
+        "packageLocation": "./.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip/node_modules/@npmcli/fs/",\
+        "packageDependencies": [\
+          ["@npmcli/fs", "npm:3.1.0"],\
+          ["semver", "npm:7.3.5"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["@oclif/color", [\
       ["npm:0.1.2", {\
         "packageLocation": "./.yarn/cache/@oclif-color-npm-0.1.2-ce883172b6-4b99ffed7f.zip/node_modules/@oclif/color/",\
@@ -4464,7 +4488,7 @@ const RAW_RUNTIME_STATE =
           ["bindings", "npm:1.5.0"],\
           ["estree-walker", "npm:2.0.2"],\
           ["glob", "npm:7.2.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["micromatch", "npm:4.0.5"],\
           ["mkdirp", "npm:0.5.5"],\
           ["node-gyp-build", "npm:4.3.0"],\
@@ -4519,6 +4543,13 @@ const RAW_RUNTIME_STATE =
           ["abbrev", "npm:1.1.1"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:2.0.0", {\
+        "packageLocation": "./.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip/node_modules/abbrev/",\
+        "packageDependencies": [\
+          ["abbrev", "npm:2.0.0"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["abort-controller", [\
@@ -4726,6 +4757,14 @@ const RAW_RUNTIME_STATE =
           ["debug", "virtual:2fd373201478a6aaf4bee356f075aecbf1e55a000c6f1745014ed3e7c5c23ee05b9645e942e828f9e250d9e58f2955bcccf155cc3b4ba8f9fb88cc78f49cae1b#npm:4.3.4"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:7.1.0", {\
+        "packageLocation": "./.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip/node_modules/agent-base/",\
+        "packageDependencies": [\
+          ["agent-base", "npm:7.1.0"],\
+          ["debug", "virtual:2fd373201478a6aaf4bee356f075aecbf1e55a000c6f1745014ed3e7c5c23ee05b9645e942e828f9e250d9e58f2955bcccf155cc3b4ba8f9fb88cc78f49cae1b#npm:4.3.4"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["aggregate-error", [\
@@ -5199,7 +5238,7 @@ const RAW_RUNTIME_STATE =
         "packageDependencies": [\
           ["archiver-utils", "npm:2.1.0"],\
           ["glob", "npm:7.2.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["lazystream", "npm:1.0.0"],\
           ["lodash.defaults", "npm:4.2.0"],\
           ["lodash.difference", "npm:4.5.0"],\
@@ -5540,16 +5579,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["asn1", [\
-      ["npm:0.2.4", {\
-        "packageLocation": "./.yarn/cache/asn1-npm-0.2.4-219dd49411-7e9ba05c58.zip/node_modules/asn1/",\
-        "packageDependencies": [\
-          ["asn1", "npm:0.2.4"],\
-          ["safer-buffer", "npm:2.1.2"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["asn1.js", [\
       ["npm:5.4.1", {\
         "packageLocation": "./.yarn/cache/asn1.js-npm-5.4.1-37c7edbcb0-63d57c766f.zip/node_modules/asn1.js/",\
@@ -5574,15 +5603,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["assert-plus", [\
-      ["npm:1.0.0", {\
-        "packageLocation": "./.yarn/cache/assert-plus-npm-1.0.0-cac95ef098-f4f991ae2d.zip/node_modules/assert-plus/",\
-        "packageDependencies": [\
-          ["assert-plus", "npm:1.0.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["assign-symbols", [\
       ["npm:1.0.0", {\
         "packageLocation": "./.yarn/cache/assign-symbols-npm-1.0.0-fd803ccdf1-c0eb895911.zip/node_modules/assign-symbols/",\
@@ -5753,24 +5773,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["aws-sign2", [\
-      ["npm:0.7.0", {\
-        "packageLocation": "./.yarn/cache/aws-sign2-npm-0.7.0-656c6cb84d-2ac497d739.zip/node_modules/aws-sign2/",\
-        "packageDependencies": [\
-          ["aws-sign2", "npm:0.7.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
-    ["aws4", [\
-      ["npm:1.11.0", {\
-        "packageLocation": "./.yarn/cache/aws4-npm-1.11.0-283476ad94-54886f07b3.zip/node_modules/aws4/",\
-        "packageDependencies": [\
-          ["aws4", "npm:1.11.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["axios", [\
       ["npm:0.21.4", {\
         "packageLocation": "./.yarn/cache/axios-npm-0.21.4-e278873748-da644592cb.zip/node_modules/axios/",\
@@ -5878,16 +5880,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["bcrypt-pbkdf", [\
-      ["npm:1.0.2", {\
-        "packageLocation": "./.yarn/cache/bcrypt-pbkdf-npm-1.0.2-80db8b16ed-13a4cde058.zip/node_modules/bcrypt-pbkdf/",\
-        "packageDependencies": [\
-          ["bcrypt-pbkdf", "npm:1.0.2"],\
-          ["tweetnacl", "npm:0.14.5"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["before-after-hook", [\
       ["npm:2.2.2", {\
         "packageLocation": "./.yarn/cache/before-after-hook-npm-2.2.2-b463f0552f-34c190def5.zip/node_modules/before-after-hook/",\
@@ -6600,6 +6592,27 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["cacache", [\
+      ["npm:18.0.2", {\
+        "packageLocation": "./.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip/node_modules/cacache/",\
+        "packageDependencies": [\
+          ["cacache", "npm:18.0.2"],\
+          ["@npmcli/fs", "npm:3.1.0"],\
+          ["fs-minipass", "npm:3.0.3"],\
+          ["glob", "npm:10.3.10"],\
+          ["lru-cache", "npm:10.1.0"],\
+          ["minipass", "npm:7.0.4"],\
+          ["minipass-collect", "npm:2.0.1"],\
+          ["minipass-flush", "npm:1.0.5"],\
+          ["minipass-pipeline", "npm:1.2.4"],\
+          ["p-map", "npm:4.0.0"],\
+          ["ssri", "npm:10.0.5"],\
+          ["tar", "npm:6.2.0"],\
+          ["unique-filename", "npm:3.0.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["cache-base", [\
       ["npm:1.0.1", {\
         "packageLocation": "./.yarn/cache/cache-base-npm-1.0.1-1538417cb9-50dd11af5c.zip/node_modules/cache-base/",\
@@ -6931,15 +6944,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["caseless", [\
-      ["npm:0.12.0", {\
-        "packageLocation": "./.yarn/cache/caseless-npm-0.12.0-e83bc5df83-ea1efdf430.zip/node_modules/caseless/",\
-        "packageDependencies": [\
-          ["caseless", "npm:0.12.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["caw", [\
       ["npm:2.0.1", {\
         "packageLocation": "./.yarn/cache/caw-npm-2.0.1-b39744e64f-8be9811b9b.zip/node_modules/caw/",\
@@ -7719,7 +7723,7 @@ const RAW_RUNTIME_STATE =
         "packageDependencies": [\
           ["configstore", "npm:5.0.1"],\
           ["dot-prop", "npm:5.3.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["make-dir", "npm:3.1.0"],\
           ["unique-string", "npm:2.0.0"],\
           ["write-file-atomic", "npm:3.0.3"],\
@@ -7922,7 +7926,7 @@ const RAW_RUNTIME_STATE =
         "packageDependencies": [\
           ["copy-template-dir", "npm:1.4.0"],\
           ["end-of-stream", "npm:1.4.4"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["maxstache", "npm:1.0.7"],\
           ["maxstache-stream", "npm:1.0.4"],\
           ["mkdirp", "npm:0.5.5"],\
@@ -8025,7 +8029,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/cp-file-npm-7.0.0-f8cf3451db-dd60ed8d86.zip/node_modules/cp-file/",\
         "packageDependencies": [\
           ["cp-file", "npm:7.0.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["make-dir", "npm:3.1.0"],\
           ["nested-error-stacks", "npm:2.1.0"],\
           ["p-event", "npm:4.2.0"]\
@@ -8036,7 +8040,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/cp-file-npm-9.1.0-358478e371-3251e3c895.zip/node_modules/cp-file/",\
         "packageDependencies": [\
           ["cp-file", "npm:9.1.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["make-dir", "npm:3.1.0"],\
           ["nested-error-stacks", "npm:2.1.0"],\
           ["p-event", "npm:4.2.0"]\
@@ -8477,16 +8481,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["dashdash", [\
-      ["npm:1.14.1", {\
-        "packageLocation": "./.yarn/cache/dashdash-npm-1.14.1-be8f10a286-137b287fa0.zip/node_modules/dashdash/",\
-        "packageDependencies": [\
-          ["dashdash", "npm:1.14.1"],\
-          ["assert-plus", "npm:1.0.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["date-fns", [\
       ["npm:1.30.1", {\
         "packageLocation": "./.yarn/cache/date-fns-npm-1.30.1-b974a8f1e1-24c0937f4e.zip/node_modules/date-fns/",\
@@ -8656,7 +8650,7 @@ const RAW_RUNTIME_STATE =
           ["decompress-tarbz2", "npm:4.1.1"],\
           ["decompress-targz", "npm:4.1.1"],\
           ["decompress-unzip", "npm:4.0.1"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["make-dir", "npm:1.3.0"],\
           ["pify", "npm:2.3.0"],\
           ["strip-dirs", "npm:2.1.0"]\
@@ -8874,7 +8868,7 @@ const RAW_RUNTIME_STATE =
         "packageDependencies": [\
           ["del", "npm:5.1.0"],\
           ["globby", "npm:10.0.2"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["is-glob", "npm:4.0.3"],\
           ["is-path-cwd", "npm:2.2.0"],\
           ["is-path-inside", "npm:3.0.2"],\
@@ -8889,7 +8883,7 @@ const RAW_RUNTIME_STATE =
         "packageDependencies": [\
           ["del", "npm:6.0.0"],\
           ["globby", "npm:11.1.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["is-glob", "npm:4.0.3"],\
           ["is-path-cwd", "npm:2.2.0"],\
           ["is-path-inside", "npm:3.0.2"],\
@@ -9440,17 +9434,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["ecc-jsbn", [\
-      ["npm:0.1.2", {\
-        "packageLocation": "./.yarn/cache/ecc-jsbn-npm-0.1.2-85b7a7be89-d43591f239.zip/node_modules/ecc-jsbn/",\
-        "packageDependencies": [\
-          ["ecc-jsbn", "npm:0.1.2"],\
-          ["jsbn", "npm:0.1.1"],\
-          ["safer-buffer", "npm:2.1.2"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["ee-first", [\
       ["npm:1.1.1", {\
         "packageLocation": "./.yarn/cache/ee-first-npm-1.1.1-33f8535b39-1b4cac778d.zip/node_modules/ee-first/",\
@@ -9544,6 +9527,16 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["encoding", [\
+      ["npm:0.1.13", {\
+        "packageLocation": "./.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip/node_modules/encoding/",\
+        "packageDependencies": [\
+          ["encoding", "npm:0.1.13"],\
+          ["iconv-lite", "npm:0.6.3"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["end-of-stream", [\
       ["npm:1.4.4", {\
         "packageLocation": "./.yarn/cache/end-of-stream-npm-1.4.4-497fc6dee1-530a5a5a1e.zip/node_modules/end-of-stream/",\
@@ -9630,6 +9623,15 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["err-code", [\
+      ["npm:2.0.3", {\
+        "packageLocation": "./.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip/node_modules/err-code/",\
+        "packageDependencies": [\
+          ["err-code", "npm:2.0.3"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["error", [\
       ["npm:7.2.1", {\
         "packageLocation": "./.yarn/cache/error-npm-7.2.1-628e82313a-9c790d20a3.zip/node_modules/error/",\
@@ -10445,7 +10447,7 @@ const RAW_RUNTIME_STATE =
         "packageDependencies": [\
           ["evp_bytestokey", "npm:1.0.3"],\
           ["md5.js", "npm:1.3.5"],\
-          ["node-gyp", "npm:7.1.2"],\
+          ["node-gyp", "npm:10.0.1"],\
           ["safe-buffer", "npm:5.2.1"]\
         ],\
         "linkType": "HARD"\
@@ -10572,6 +10574,15 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["exponential-backoff", [\
+      ["npm:3.1.1", {\
+        "packageLocation": "./.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip/node_modules/exponential-backoff/",\
+        "packageDependencies": [\
+          ["exponential-backoff", "npm:3.1.1"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["express", [\
       ["npm:4.17.1", {\
         "packageLocation": "./.yarn/cache/express-npm-4.17.1-6815ee6bf9-b4a03cdd6a.zip/node_modules/express/",\
@@ -10733,15 +10744,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["extsprintf", [\
-      ["npm:1.3.0", {\
-        "packageLocation": "./.yarn/cache/extsprintf-npm-1.3.0-61a92b324c-26967d6c7e.zip/node_modules/extsprintf/",\
-        "packageDependencies": [\
-          ["extsprintf", "npm:1.3.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["fancy-log", [\
       ["npm:1.3.3", {\
         "packageLocation": "./.yarn/cache/fancy-log-npm-1.3.3-340d54d1f6-855b229436.zip/node_modules/fancy-log/",\
@@ -11397,26 +11399,7 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["forever-agent", [\
-      ["npm:0.6.1", {\
-        "packageLocation": "./.yarn/cache/forever-agent-npm-0.6.1-01dae53bf9-c1e1644d5e.zip/node_modules/forever-agent/",\
-        "packageDependencies": [\
-          ["forever-agent", "npm:0.6.1"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["form-data", [\
-      ["npm:2.3.3", {\
-        "packageLocation": "./.yarn/cache/form-data-npm-2.3.3-c016cc11c0-1b6f3ccbf4.zip/node_modules/form-data/",\
-        "packageDependencies": [\
-          ["form-data", "npm:2.3.3"],\
-          ["asynckit", "npm:0.4.0"],\
-          ["combined-stream", "npm:1.0.8"],\
-          ["mime-types", "npm:2.1.26"]\
-        ],\
-        "linkType": "HARD"\
-      }],\
       ["npm:3.0.0", {\
         "packageLocation": "./.yarn/cache/form-data-npm-3.0.0-b01f488350-aea890ae3e.zip/node_modules/form-data/",\
         "packageDependencies": [\
@@ -11500,7 +11483,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/fs-extra-npm-11.2.0-6783080799-0579bf6726.zip/node_modules/fs-extra/",\
         "packageDependencies": [\
           ["fs-extra", "npm:11.2.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["jsonfile", "npm:6.1.0"],\
           ["universalify", "npm:2.0.0"]\
         ],\
@@ -11510,7 +11493,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/fs-extra-npm-3.0.1-9417aaf7f9-8e233f6200.zip/node_modules/fs-extra/",\
         "packageDependencies": [\
           ["fs-extra", "npm:3.0.1"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["jsonfile", "npm:3.0.1"],\
           ["universalify", "npm:0.1.2"]\
         ],\
@@ -11520,7 +11503,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/fs-extra-npm-7.0.1-b33a5e53e9-3fc6e56ba2.zip/node_modules/fs-extra/",\
         "packageDependencies": [\
           ["fs-extra", "npm:7.0.1"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["jsonfile", "npm:4.0.0"],\
           ["universalify", "npm:0.1.2"]\
         ],\
@@ -11530,7 +11513,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/fs-extra-npm-8.1.0-197473387f-6fb12449f5.zip/node_modules/fs-extra/",\
         "packageDependencies": [\
           ["fs-extra", "npm:8.1.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["jsonfile", "npm:4.0.0"],\
           ["universalify", "npm:0.1.2"]\
         ],\
@@ -11541,7 +11524,7 @@ const RAW_RUNTIME_STATE =
         "packageDependencies": [\
           ["fs-extra", "npm:9.0.1"],\
           ["at-least-node", "npm:1.0.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["jsonfile", "npm:6.1.0"],\
           ["universalify", "npm:1.0.0"]\
         ],\
@@ -11564,6 +11547,14 @@ const RAW_RUNTIME_STATE =
           ["minipass", "npm:3.1.3"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:3.0.3", {\
+        "packageLocation": "./.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip/node_modules/fs-minipass/",\
+        "packageDependencies": [\
+          ["fs-minipass", "npm:3.0.3"],\
+          ["minipass", "npm:7.0.4"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["fs-mkdirp-stream", [\
@@ -11571,7 +11562,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/fs-mkdirp-stream-npm-1.0.0-f5d083f71c-af3c817bff.zip/node_modules/fs-mkdirp-stream/",\
         "packageDependencies": [\
           ["fs-mkdirp-stream", "npm:1.0.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["through2", "npm:2.0.5"]\
         ],\
         "linkType": "HARD"\
@@ -11593,7 +11584,7 @@ const RAW_RUNTIME_STATE =
           ["fsevents", "patch:fsevents@npm%3A1.2.11#optional!builtin<compat/fsevents>::version=1.2.11&hash=d11327"],\
           ["bindings", "npm:1.5.0"],\
           ["nan", "npm:2.14.0"],\
-          ["node-gyp", "npm:7.1.2"],\
+          ["node-gyp", "npm:10.0.1"],\
           ["node-pre-gyp", "npm:0.16.0"]\
         ],\
         "linkType": "HARD"\
@@ -11602,7 +11593,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/unplugged/fsevents-patch-da71431527/node_modules/fsevents/",\
         "packageDependencies": [\
           ["fsevents", "patch:fsevents@npm%3A2.1.3#optional!builtin<compat/fsevents>::version=2.1.3&hash=31d12a"],\
-          ["node-gyp", "npm:7.1.2"]\
+          ["node-gyp", "npm:10.0.1"]\
         ],\
         "linkType": "HARD"\
       }],\
@@ -11610,7 +11601,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/unplugged/fsevents-patch-19706e7e35/node_modules/fsevents/",\
         "packageDependencies": [\
           ["fsevents", "patch:fsevents@npm%3A2.3.2#optional!builtin<compat/fsevents>::version=2.3.2&hash=df0bf1"],\
-          ["node-gyp", "npm:7.1.2"]\
+          ["node-gyp", "npm:10.0.1"]\
         ],\
         "linkType": "HARD"\
       }]\
@@ -11818,16 +11809,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["getpass", [\
-      ["npm:0.1.7", {\
-        "packageLocation": "./.yarn/cache/getpass-npm-0.1.7-519164a3be-ab18d55661.zip/node_modules/getpass/",\
-        "packageDependencies": [\
-          ["getpass", "npm:0.1.7"],\
-          ["assert-plus", "npm:1.0.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["gh-release-fetch", [\
       ["npm:2.0.4", {\
         "packageLocation": "./.yarn/cache/gh-release-fetch-npm-2.0.4-41d90fd71b-f0776c1d92.zip/node_modules/gh-release-fetch/",\
@@ -12315,10 +12296,10 @@ const RAW_RUNTIME_STATE =
       }]\
     ]],\
     ["graceful-fs", [\
-      ["npm:4.2.4", {\
-        "packageLocation": "./.yarn/cache/graceful-fs-npm-4.2.4-734467635f-4485e131bd.zip/node_modules/graceful-fs/",\
+      ["npm:4.2.11", {\
+        "packageLocation": "./.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip/node_modules/graceful-fs/",\
         "packageDependencies": [\
-          ["graceful-fs", "npm:4.2.4"]\
+          ["graceful-fs", "npm:4.2.11"]\
         ],\
         "linkType": "HARD"\
       }]\
@@ -12618,26 +12599,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["har-schema", [\
-      ["npm:2.0.0", {\
-        "packageLocation": "./.yarn/cache/har-schema-npm-2.0.0-3a318c0ca5-d8946348f3.zip/node_modules/har-schema/",\
-        "packageDependencies": [\
-          ["har-schema", "npm:2.0.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
-    ["har-validator", [\
-      ["npm:5.1.5", {\
-        "packageLocation": "./.yarn/cache/har-validator-npm-5.1.5-bd9ac162f5-b998a7269c.zip/node_modules/har-validator/",\
-        "packageDependencies": [\
-          ["har-validator", "npm:5.1.5"],\
-          ["ajv", "npm:6.12.6"],\
-          ["har-schema", "npm:2.0.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["hard-rejection", [\
       ["npm:2.1.0", {\
         "packageLocation": "./.yarn/cache/hard-rejection-npm-2.1.0-a80f2a977d-7baaf80a0c.zip/node_modules/hard-rejection/",\
@@ -13128,6 +13089,17 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["http-proxy-agent", [\
+      ["npm:7.0.0", {\
+        "packageLocation": "./.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-dbaaf3d9f3.zip/node_modules/http-proxy-agent/",\
+        "packageDependencies": [\
+          ["http-proxy-agent", "npm:7.0.0"],\
+          ["agent-base", "npm:7.1.0"],\
+          ["debug", "virtual:2fd373201478a6aaf4bee356f075aecbf1e55a000c6f1745014ed3e7c5c23ee05b9645e942e828f9e250d9e58f2955bcccf155cc3b4ba8f9fb88cc78f49cae1b#npm:4.3.4"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["http-proxy-middleware", [\
       ["npm:1.0.6", {\
         "packageLocation": "./.yarn/cache/http-proxy-middleware-npm-1.0.6-b532e3ab45-8041451f6f.zip/node_modules/http-proxy-middleware/",\
@@ -13142,18 +13114,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["http-signature", [\
-      ["npm:1.2.0", {\
-        "packageLocation": "./.yarn/cache/http-signature-npm-1.2.0-ee92426f34-2ff7112e6b.zip/node_modules/http-signature/",\
-        "packageDependencies": [\
-          ["http-signature", "npm:1.2.0"],\
-          ["assert-plus", "npm:1.0.0"],\
-          ["jsprim", "npm:1.4.1"],\
-          ["sshpk", "npm:1.16.1"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["http2-wrapper", [\
       ["npm:1.0.0-beta.5.2", {\
         "packageLocation": "./.yarn/cache/http2-wrapper-npm-1.0.0-beta.5.2-3ea360ab61-935d78c13e.zip/node_modules/http2-wrapper/",\
@@ -13192,6 +13152,15 @@ const RAW_RUNTIME_STATE =
           ["debug", "virtual:2fd373201478a6aaf4bee356f075aecbf1e55a000c6f1745014ed3e7c5c23ee05b9645e942e828f9e250d9e58f2955bcccf155cc3b4ba8f9fb88cc78f49cae1b#npm:4.3.4"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:7.0.2", {\
+        "packageLocation": "./.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-9ec844f78f.zip/node_modules/https-proxy-agent/",\
+        "packageDependencies": [\
+          ["https-proxy-agent", "npm:7.0.2"],\
+          ["agent-base", "npm:7.1.0"],\
+          ["debug", "virtual:2fd373201478a6aaf4bee356f075aecbf1e55a000c6f1745014ed3e7c5c23ee05b9645e942e828f9e250d9e58f2955bcccf155cc3b4ba8f9fb88cc78f49cae1b#npm:4.3.4"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["hugo-extended", [\
@@ -13239,6 +13208,14 @@ const RAW_RUNTIME_STATE =
           ["safer-buffer", "npm:2.1.2"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:0.6.3", {\
+        "packageLocation": "./.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip/node_modules/iconv-lite/",\
+        "packageDependencies": [\
+          ["iconv-lite", "npm:0.6.3"],\
+          ["safer-buffer", "npm:2.1.2"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["ieee754", [\
@@ -13283,7 +13260,7 @@ const RAW_RUNTIME_STATE =
           ["imagemin", "npm:7.0.1"],\
           ["file-type", "npm:12.4.2"],\
           ["globby", "npm:10.0.2"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["junk", "npm:3.1.0"],\
           ["make-dir", "npm:3.1.0"],\
           ["p-pipe", "npm:3.1.0"],\
@@ -13637,6 +13614,15 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["ip", [\
+      ["npm:2.0.0", {\
+        "packageLocation": "./.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip/node_modules/ip/",\
+        "packageDependencies": [\
+          ["ip", "npm:2.0.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["ip-regex", [\
       ["npm:4.2.0", {\
         "packageLocation": "./.yarn/cache/ip-regex-npm-4.2.0-374aabd514-d4aa9c8352.zip/node_modules/ip-regex/",\
@@ -14007,6 +13993,15 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["is-lambda", [\
+      ["npm:1.0.1", {\
+        "packageLocation": "./.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip/node_modules/is-lambda/",\
+        "packageDependencies": [\
+          ["is-lambda", "npm:1.0.1"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["is-module", [\
       ["npm:1.0.0", {\
         "packageLocation": "./.yarn/cache/is-module-npm-1.0.0-79ba918283-8cd5390730.zip/node_modules/is-module/",\
@@ -14464,6 +14459,13 @@ const RAW_RUNTIME_STATE =
           ["isexe", "npm:2.0.0"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:3.1.1", {\
+        "packageLocation": "./.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip/node_modules/isexe/",\
+        "packageDependencies": [\
+          ["isexe", "npm:3.1.1"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["isobject", [\
@@ -14503,15 +14505,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["isstream", [\
-      ["npm:0.1.2", {\
-        "packageLocation": "./.yarn/cache/isstream-npm-0.1.2-8581c75385-22d9c18101.zip/node_modules/isstream/",\
-        "packageDependencies": [\
-          ["isstream", "npm:0.1.2"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["isurl", [\
       ["npm:1.0.0", {\
         "packageLocation": "./.yarn/cache/isurl-npm-1.0.0-51543986df-28a96e0192.zip/node_modules/isurl/",\
@@ -14666,15 +14659,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["jsbn", [\
-      ["npm:0.1.1", {\
-        "packageLocation": "./.yarn/cache/jsbn-npm-0.1.1-0eb7132404-5450133242.zip/node_modules/jsbn/",\
-        "packageDependencies": [\
-          ["jsbn", "npm:0.1.1"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["jsesc", [\
       ["npm:0.5.0", {\
         "packageLocation": "./.yarn/cache/jsesc-npm-0.5.0-6827074492-fab949f585.zip/node_modules/jsesc/",\
@@ -14725,15 +14709,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["json-schema", [\
-      ["npm:0.2.3", {\
-        "packageLocation": "./.yarn/cache/json-schema-npm-0.2.3-018ee3dfc9-2f98d28db7.zip/node_modules/json-schema/",\
-        "packageDependencies": [\
-          ["json-schema", "npm:0.2.3"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["json-schema-traverse", [\
       ["npm:0.4.1", {\
         "packageLocation": "./.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip/node_modules/json-schema-traverse/",\
@@ -14759,15 +14734,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["json-stringify-safe", [\
-      ["npm:5.0.1", {\
-        "packageLocation": "./.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip/node_modules/json-stringify-safe/",\
-        "packageDependencies": [\
-          ["json-stringify-safe", "npm:5.0.1"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["json5", [\
       ["npm:2.2.0", {\
         "packageLocation": "./.yarn/cache/json5-npm-2.2.0-da49dc7cb5-d72ea87423.zip/node_modules/json5/",\
@@ -14783,7 +14749,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/jsonfile-npm-3.0.1-77649e47c9-c75a97c2d1.zip/node_modules/jsonfile/",\
         "packageDependencies": [\
           ["jsonfile", "npm:3.0.1"],\
-          ["graceful-fs", "npm:4.2.4"]\
+          ["graceful-fs", "npm:4.2.11"]\
         ],\
         "linkType": "HARD"\
       }],\
@@ -14791,7 +14757,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-17796f0ab1.zip/node_modules/jsonfile/",\
         "packageDependencies": [\
           ["jsonfile", "npm:4.0.0"],\
-          ["graceful-fs", "npm:4.2.4"]\
+          ["graceful-fs", "npm:4.2.11"]\
         ],\
         "linkType": "HARD"\
       }],\
@@ -14799,7 +14765,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/jsonfile-npm-6.1.0-20a4796cee-03014769e7.zip/node_modules/jsonfile/",\
         "packageDependencies": [\
           ["jsonfile", "npm:6.1.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["universalify", "npm:2.0.0"]\
         ],\
         "linkType": "HARD"\
@@ -14826,19 +14792,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["jsprim", [\
-      ["npm:1.4.1", {\
-        "packageLocation": "./.yarn/cache/jsprim-npm-1.4.1-948d2c9ec3-819f15255a.zip/node_modules/jsprim/",\
-        "packageDependencies": [\
-          ["jsprim", "npm:1.4.1"],\
-          ["assert-plus", "npm:1.0.0"],\
-          ["extsprintf", "npm:1.3.0"],\
-          ["json-schema", "npm:0.2.3"],\
-          ["verror", "npm:1.10.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["junk", [\
       ["npm:3.1.0", {\
         "packageLocation": "./.yarn/cache/junk-npm-3.1.0-aa1fa701c6-6c4d68e8f8.zip/node_modules/junk/",\
@@ -15195,7 +15148,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/load-json-file-npm-1.1.0-455d5470c2-bb16e169d8.zip/node_modules/load-json-file/",\
         "packageDependencies": [\
           ["load-json-file", "npm:1.1.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["parse-json", "npm:2.2.0"],\
           ["pify", "npm:2.3.0"],\
           ["pinkie-promise", "npm:2.0.1"],\
@@ -15207,7 +15160,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/load-json-file-npm-2.0.0-9317df26fa-7f212bbf08.zip/node_modules/load-json-file/",\
         "packageDependencies": [\
           ["load-json-file", "npm:2.0.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["parse-json", "npm:2.2.0"],\
           ["pify", "npm:2.3.0"],\
           ["strip-bom", "npm:3.0.0"]\
@@ -15218,7 +15171,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip/node_modules/load-json-file/",\
         "packageDependencies": [\
           ["load-json-file", "npm:4.0.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["parse-json", "npm:4.0.0"],\
           ["pify", "npm:3.0.0"],\
           ["strip-bom", "npm:3.0.0"]\
@@ -15229,7 +15182,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/load-json-file-npm-5.3.0-73edda140b-8bf15599db.zip/node_modules/load-json-file/",\
         "packageDependencies": [\
           ["load-json-file", "npm:5.3.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["parse-json", "npm:4.0.0"],\
           ["pify", "npm:4.0.1"],\
           ["strip-bom", "npm:3.0.0"],\
@@ -15838,6 +15791,26 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["make-fetch-happen", [\
+      ["npm:13.0.0", {\
+        "packageLocation": "./.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip/node_modules/make-fetch-happen/",\
+        "packageDependencies": [\
+          ["make-fetch-happen", "npm:13.0.0"],\
+          ["@npmcli/agent", "npm:2.2.0"],\
+          ["cacache", "npm:18.0.2"],\
+          ["http-cache-semantics", "npm:4.1.1"],\
+          ["is-lambda", "npm:1.0.1"],\
+          ["minipass", "npm:7.0.4"],\
+          ["minipass-fetch", "npm:3.0.4"],\
+          ["minipass-flush", "npm:1.0.5"],\
+          ["minipass-pipeline", "npm:1.2.4"],\
+          ["negotiator", "npm:0.6.3"],\
+          ["promise-retry", "npm:2.0.1"],\
+          ["ssri", "npm:10.0.5"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["make-iterator", [\
       ["npm:1.0.1", {\
         "packageLocation": "./.yarn/cache/make-iterator-npm-1.0.1-3f3e0a179c-d38afc388f.zip/node_modules/make-iterator/",\
@@ -16359,6 +16332,13 @@ const RAW_RUNTIME_STATE =
         ],\
         "linkType": "HARD"\
       }],\
+      ["npm:5.0.0", {\
+        "packageLocation": "./.yarn/cache/minipass-npm-5.0.0-c64fb63c92-61682162d2.zip/node_modules/minipass/",\
+        "packageDependencies": [\
+          ["minipass", "npm:5.0.0"]\
+        ],\
+        "linkType": "HARD"\
+      }],\
       ["npm:7.0.4", {\
         "packageLocation": "./.yarn/cache/minipass-npm-7.0.4-eacb4e042e-e864bd02ce.zip/node_modules/minipass/",\
         "packageDependencies": [\
@@ -16367,6 +16347,59 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["minipass-collect", [\
+      ["npm:2.0.1", {\
+        "packageLocation": "./.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip/node_modules/minipass-collect/",\
+        "packageDependencies": [\
+          ["minipass-collect", "npm:2.0.1"],\
+          ["minipass", "npm:7.0.4"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
+    ["minipass-fetch", [\
+      ["npm:3.0.4", {\
+        "packageLocation": "./.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-3edf72b900.zip/node_modules/minipass-fetch/",\
+        "packageDependencies": [\
+          ["minipass-fetch", "npm:3.0.4"],\
+          ["encoding", "npm:0.1.13"],\
+          ["minipass", "npm:7.0.4"],\
+          ["minipass-sized", "npm:1.0.3"],\
+          ["minizlib", "npm:2.1.2"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
+    ["minipass-flush", [\
+      ["npm:1.0.5", {\
+        "packageLocation": "./.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip/node_modules/minipass-flush/",\
+        "packageDependencies": [\
+          ["minipass-flush", "npm:1.0.5"],\
+          ["minipass", "npm:3.1.3"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
+    ["minipass-pipeline", [\
+      ["npm:1.2.4", {\
+        "packageLocation": "./.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip/node_modules/minipass-pipeline/",\
+        "packageDependencies": [\
+          ["minipass-pipeline", "npm:1.2.4"],\
+          ["minipass", "npm:3.1.3"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
+    ["minipass-sized", [\
+      ["npm:1.0.3", {\
+        "packageLocation": "./.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip/node_modules/minipass-sized/",\
+        "packageDependencies": [\
+          ["minipass-sized", "npm:1.0.3"],\
+          ["minipass", "npm:3.1.3"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["minizlib", [\
       ["npm:1.3.3", {\
         "packageLocation": "./.yarn/cache/minizlib-npm-1.3.3-b590e5bfb8-9c2c47e568.zip/node_modules/minizlib/",\
@@ -16602,7 +16635,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/unplugged/nan-npm-2.14.0-b880e7ae7d/node_modules/nan/",\
         "packageDependencies": [\
           ["nan", "npm:2.14.0"],\
-          ["node-gyp", "npm:7.1.2"]\
+          ["node-gyp", "npm:10.0.1"]\
         ],\
         "linkType": "HARD"\
       }]\
@@ -16686,6 +16719,13 @@ const RAW_RUNTIME_STATE =
           ["negotiator", "npm:0.6.2"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:0.6.3", {\
+        "packageLocation": "./.yarn/cache/negotiator-npm-0.6.3-9d50e36171-2723fb822a.zip/node_modules/negotiator/",\
+        "packageDependencies": [\
+          ["negotiator", "npm:0.6.3"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["neo-async", [\
@@ -16918,20 +16958,20 @@ const RAW_RUNTIME_STATE =
       }]\
     ]],\
     ["node-gyp", [\
-      ["npm:7.1.2", {\
-        "packageLocation": "./.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/",\
+      ["npm:10.0.1", {\
+        "packageLocation": "./.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/",\
         "packageDependencies": [\
-          ["node-gyp", "npm:7.1.2"],\
+          ["node-gyp", "npm:10.0.1"],\
           ["env-paths", "npm:2.2.0"],\
-          ["glob", "npm:7.2.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
-          ["nopt", "npm:5.0.0"],\
-          ["npmlog", "npm:4.1.2"],\
-          ["request", "npm:2.88.2"],\
-          ["rimraf", "npm:3.0.2"],\
+          ["exponential-backoff", "npm:3.1.1"],\
+          ["glob", "npm:10.3.10"],\
+          ["graceful-fs", "npm:4.2.11"],\
+          ["make-fetch-happen", "npm:13.0.0"],\
+          ["nopt", "npm:7.2.0"],\
+          ["proc-log", "npm:3.0.0"],\
           ["semver", "npm:7.3.5"],\
-          ["tar", "npm:6.1.11"],\
-          ["which", "npm:2.0.2"]\
+          ["tar", "npm:6.2.0"],\
+          ["which", "npm:4.0.0"]\
         ],\
         "linkType": "HARD"\
       }]\
@@ -17050,6 +17090,14 @@ const RAW_RUNTIME_STATE =
           ["abbrev", "npm:1.1.1"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:7.2.0", {\
+        "packageLocation": "./.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip/node_modules/nopt/",\
+        "packageDependencies": [\
+          ["nopt", "npm:7.2.0"],\
+          ["abbrev", "npm:2.0.0"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["normalize-node-version", [\
@@ -17295,15 +17343,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["oauth-sign", [\
-      ["npm:0.9.0", {\
-        "packageLocation": "./.yarn/cache/oauth-sign-npm-0.9.0-7aa9422221-1809a366d2.zip/node_modules/oauth-sign/",\
-        "packageDependencies": [\
-          ["oauth-sign", "npm:0.9.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["object-assign", [\
       ["npm:4.1.1", {\
         "packageLocation": "./.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip/node_modules/object-assign/",\
@@ -18347,7 +18386,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/path-type-npm-1.1.0-3949afd6c1-59a4b2c0e5.zip/node_modules/path-type/",\
         "packageDependencies": [\
           ["path-type", "npm:1.1.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["pify", "npm:2.3.0"],\
           ["pinkie-promise", "npm:2.0.1"]\
         ],\
@@ -18400,15 +18439,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["performance-now", [\
-      ["npm:2.1.0", {\
-        "packageLocation": "./.yarn/cache/performance-now-npm-2.1.0-45e3ce7e49-534e641aa8.zip/node_modules/performance-now/",\
-        "packageDependencies": [\
-          ["performance-now", "npm:2.1.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["picocolors", [\
       ["npm:1.0.0", {\
         "packageLocation": "./.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip/node_modules/picocolors/",\
@@ -19315,6 +19345,15 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["proc-log", [\
+      ["npm:3.0.0", {\
+        "packageLocation": "./.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip/node_modules/proc-log/",\
+        "packageDependencies": [\
+          ["proc-log", "npm:3.0.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["process", [\
       ["npm:0.11.10", {\
         "packageLocation": "./.yarn/cache/process-npm-0.11.10-aeb3b641ae-dbaa7e8d1d.zip/node_modules/process/",\
@@ -19360,6 +19399,17 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["promise-retry", [\
+      ["npm:2.0.1", {\
+        "packageLocation": "./.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip/node_modules/promise-retry/",\
+        "packageDependencies": [\
+          ["promise-retry", "npm:2.0.1"],\
+          ["err-code", "npm:2.0.3"],\
+          ["retry", "npm:0.12.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["prompts", [\
       ["npm:2.4.1", {\
         "packageLocation": "./.yarn/cache/prompts-npm-2.4.1-dd3df3be17-ee40d417a7.zip/node_modules/prompts/",\
@@ -19409,15 +19459,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["psl", [\
-      ["npm:1.8.0", {\
-        "packageLocation": "./.yarn/cache/psl-npm-1.8.0-226099d70e-5f62a8eca0.zip/node_modules/psl/",\
-        "packageDependencies": [\
-          ["psl", "npm:1.8.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["public-encrypt", [\
       ["npm:4.0.3", {\
         "packageLocation": "./.yarn/cache/public-encrypt-npm-4.0.3-b25e19fada-059d64da8b.zip/node_modules/public-encrypt/",\
@@ -19535,13 +19576,6 @@ const RAW_RUNTIME_STATE =
         ],\
         "linkType": "HARD"\
       }],\
-      ["npm:6.5.2", {\
-        "packageLocation": "./.yarn/cache/qs-npm-6.5.2-dbf9d8386b-ef17caa6e1.zip/node_modules/qs/",\
-        "packageDependencies": [\
-          ["qs", "npm:6.5.2"]\
-        ],\
-        "linkType": "HARD"\
-      }],\
       ["npm:6.7.0", {\
         "packageLocation": "./.yarn/cache/qs-npm-6.7.0-15161a344c-d8f4b216c6.zip/node_modules/qs/",\
         "packageDependencies": [\
@@ -19926,7 +19960,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/readdirp-npm-2.2.1-33cb5df2b8-14af3408ac.zip/node_modules/readdirp/",\
         "packageDependencies": [\
           ["readdirp", "npm:2.2.1"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["micromatch", "npm:3.1.10"],\
           ["readable-stream", "npm:2.3.7"]\
         ],\
@@ -20199,35 +20233,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["request", [\
-      ["npm:2.88.2", {\
-        "packageLocation": "./.yarn/cache/request-npm-2.88.2-f4a57c72c4-005b8b237b.zip/node_modules/request/",\
-        "packageDependencies": [\
-          ["request", "npm:2.88.2"],\
-          ["aws-sign2", "npm:0.7.0"],\
-          ["aws4", "npm:1.11.0"],\
-          ["caseless", "npm:0.12.0"],\
-          ["combined-stream", "npm:1.0.8"],\
-          ["extend", "npm:3.0.2"],\
-          ["forever-agent", "npm:0.6.1"],\
-          ["form-data", "npm:2.3.3"],\
-          ["har-validator", "npm:5.1.5"],\
-          ["http-signature", "npm:1.2.0"],\
-          ["is-typedarray", "npm:1.0.0"],\
-          ["isstream", "npm:0.1.2"],\
-          ["json-stringify-safe", "npm:5.0.1"],\
-          ["mime-types", "npm:2.1.26"],\
-          ["oauth-sign", "npm:0.9.0"],\
-          ["performance-now", "npm:2.1.0"],\
-          ["qs", "npm:6.5.2"],\
-          ["safe-buffer", "npm:5.2.1"],\
-          ["tough-cookie", "npm:2.5.0"],\
-          ["tunnel-agent", "npm:0.6.0"],\
-          ["uuid", "npm:3.4.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["require-directory", [\
       ["npm:2.1.1", {\
         "packageLocation": "./.yarn/cache/require-directory-npm-2.1.1-8608aee50b-a72468e258.zip/node_modules/require-directory/",\
@@ -20437,6 +20442,15 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["retry", [\
+      ["npm:0.12.0", {\
+        "packageLocation": "./.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip/node_modules/retry/",\
+        "packageDependencies": [\
+          ["retry", "npm:0.12.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["reusify", [\
       ["npm:1.0.4", {\
         "packageLocation": "./.yarn/cache/reusify-npm-1.0.4-95ac4aec11-14222c9e1d.zip/node_modules/reusify/",\
@@ -21158,6 +21172,15 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["smart-buffer", [\
+      ["npm:4.2.0", {\
+        "packageLocation": "./.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip/node_modules/smart-buffer/",\
+        "packageDependencies": [\
+          ["smart-buffer", "npm:4.2.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["snapdragon", [\
       ["npm:0.8.2", {\
         "packageLocation": "./.yarn/cache/snapdragon-npm-0.8.2-2bcc47d217-cbe35b25dc.zip/node_modules/snapdragon/",\
@@ -21247,6 +21270,29 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["socks", [\
+      ["npm:2.7.1", {\
+        "packageLocation": "./.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip/node_modules/socks/",\
+        "packageDependencies": [\
+          ["socks", "npm:2.7.1"],\
+          ["ip", "npm:2.0.0"],\
+          ["smart-buffer", "npm:4.2.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
+    ["socks-proxy-agent", [\
+      ["npm:8.0.2", {\
+        "packageLocation": "./.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-ea727734bd.zip/node_modules/socks-proxy-agent/",\
+        "packageDependencies": [\
+          ["socks-proxy-agent", "npm:8.0.2"],\
+          ["agent-base", "npm:7.1.0"],\
+          ["debug", "virtual:2fd373201478a6aaf4bee356f075aecbf1e55a000c6f1745014ed3e7c5c23ee05b9645e942e828f9e250d9e58f2955bcccf155cc3b4ba8f9fb88cc78f49cae1b#npm:4.3.4"],\
+          ["socks", "npm:2.7.1"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["sonic-boom", [\
       ["npm:3.3.0", {\
         "packageLocation": "./.yarn/cache/sonic-boom-npm-3.3.0-6a662502aa-16e197d1f6.zip/node_modules/sonic-boom/",\
@@ -21480,20 +21526,12 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["sshpk", [\
-      ["npm:1.16.1", {\
-        "packageLocation": "./.yarn/cache/sshpk-npm-1.16.1-feb759e7e0-b437fd3fd2.zip/node_modules/sshpk/",\
+    ["ssri", [\
+      ["npm:10.0.5", {\
+        "packageLocation": "./.yarn/cache/ssri-npm-10.0.5-1a7557d04d-453f9a1c24.zip/node_modules/ssri/",\
         "packageDependencies": [\
-          ["sshpk", "npm:1.16.1"],\
-          ["asn1", "npm:0.2.4"],\
-          ["assert-plus", "npm:1.0.0"],\
-          ["bcrypt-pbkdf", "npm:1.0.2"],\
-          ["dashdash", "npm:1.14.1"],\
-          ["ecc-jsbn", "npm:0.1.2"],\
-          ["getpass", "npm:0.1.7"],\
-          ["jsbn", "npm:0.1.1"],\
-          ["safer-buffer", "npm:2.1.2"],\
-          ["tweetnacl", "npm:0.14.5"]\
+          ["ssri", "npm:10.0.5"],\
+          ["minipass", "npm:7.0.4"]\
         ],\
         "linkType": "HARD"\
       }]\
@@ -22292,13 +22330,13 @@ const RAW_RUNTIME_STATE =
         ],\
         "linkType": "HARD"\
       }],\
-      ["npm:6.1.11", {\
-        "packageLocation": "./.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip/node_modules/tar/",\
+      ["npm:6.2.0", {\
+        "packageLocation": "./.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip/node_modules/tar/",\
         "packageDependencies": [\
-          ["tar", "npm:6.1.11"],\
+          ["tar", "npm:6.2.0"],\
           ["chownr", "npm:2.0.0"],\
           ["fs-minipass", "npm:2.1.0"],\
-          ["minipass", "npm:3.1.3"],\
+          ["minipass", "npm:5.0.0"],\
           ["minizlib", "npm:2.1.2"],\
           ["mkdirp", "npm:1.0.4"],\
           ["yallist", "npm:4.0.0"]\
@@ -22740,17 +22778,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["tough-cookie", [\
-      ["npm:2.5.0", {\
-        "packageLocation": "./.yarn/cache/tough-cookie-npm-2.5.0-79a2fe43fe-024cb13a4d.zip/node_modules/tough-cookie/",\
-        "packageDependencies": [\
-          ["tough-cookie", "npm:2.5.0"],\
-          ["psl", "npm:1.8.0"],\
-          ["punycode", "npm:2.1.1"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["tr46", [\
       ["npm:0.0.3", {\
         "packageLocation": "./.yarn/cache/tr46-npm-0.0.3-de53018915-8f1f5aa6cb.zip/node_modules/tr46/",\
@@ -22922,15 +22949,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["tweetnacl", [\
-      ["npm:0.14.5", {\
-        "packageLocation": "./.yarn/cache/tweetnacl-npm-0.14.5-a3f766c0d1-04ee27901c.zip/node_modules/tweetnacl/",\
-        "packageDependencies": [\
-          ["tweetnacl", "npm:0.14.5"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["type", [\
       ["npm:1.2.0", {\
         "packageLocation": "./.yarn/cache/type-npm-1.2.0-e67311c4b2-b4d4b27d19.zip/node_modules/type/",\
@@ -23280,6 +23298,26 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
+    ["unique-filename", [\
+      ["npm:3.0.0", {\
+        "packageLocation": "./.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip/node_modules/unique-filename/",\
+        "packageDependencies": [\
+          ["unique-filename", "npm:3.0.0"],\
+          ["unique-slug", "npm:4.0.0"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
+    ["unique-slug", [\
+      ["npm:4.0.0", {\
+        "packageLocation": "./.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-40912a8963.zip/node_modules/unique-slug/",\
+        "packageDependencies": [\
+          ["unique-slug", "npm:4.0.0"],\
+          ["imurmurhash", "npm:0.1.4"]\
+        ],\
+        "linkType": "HARD"\
+      }]\
+    ]],\
     ["unique-stream", [\
       ["npm:2.3.1", {\
         "packageLocation": "./.yarn/cache/unique-stream-npm-2.3.1-bb76c24710-65e433e68e.zip/node_modules/unique-stream/",\
@@ -23660,18 +23698,6 @@ const RAW_RUNTIME_STATE =
         "linkType": "HARD"\
       }]\
     ]],\
-    ["verror", [\
-      ["npm:1.10.0", {\
-        "packageLocation": "./.yarn/cache/verror-npm-1.10.0-c3f839c579-da548149dd.zip/node_modules/verror/",\
-        "packageDependencies": [\
-          ["verror", "npm:1.10.0"],\
-          ["assert-plus", "npm:1.0.0"],\
-          ["core-util-is", "npm:1.0.2"],\
-          ["extsprintf", "npm:1.3.0"]\
-        ],\
-        "linkType": "HARD"\
-      }]\
-    ]],\
     ["vinyl", [\
       ["npm:2.2.1", {\
         "packageLocation": "./.yarn/cache/vinyl-npm-2.2.1-6b14799ad3-6f7c034381.zip/node_modules/vinyl/",\
@@ -23703,7 +23729,7 @@ const RAW_RUNTIME_STATE =
         "packageLocation": "./.yarn/cache/vinyl-file-npm-3.0.0-4d55e6cd5d-e187a74d41.zip/node_modules/vinyl-file/",\
         "packageDependencies": [\
           ["vinyl-file", "npm:3.0.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["pify", "npm:2.3.0"],\
           ["strip-bom-buf", "npm:1.0.0"],\
           ["strip-bom-stream", "npm:2.0.0"],\
@@ -23719,7 +23745,7 @@ const RAW_RUNTIME_STATE =
           ["vinyl-fs", "npm:3.0.3"],\
           ["fs-mkdirp-stream", "npm:1.0.0"],\
           ["glob-stream", "npm:6.1.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["is-valid-glob", "npm:1.0.0"],\
           ["lazystream", "npm:1.0.0"],\
           ["lead", "npm:1.0.0"],\
@@ -23745,7 +23771,7 @@ const RAW_RUNTIME_STATE =
           ["vinyl-sourcemap", "npm:1.1.0"],\
           ["append-buffer", "npm:1.0.2"],\
           ["convert-source-map", "npm:1.7.0"],\
-          ["graceful-fs", "npm:4.2.4"],\
+          ["graceful-fs", "npm:4.2.11"],\
           ["normalize-path", "npm:2.1.1"],\
           ["now-and-later", "npm:2.0.1"],\
           ["remove-bom-buffer", "npm:3.0.0"],\
@@ -23889,6 +23915,14 @@ const RAW_RUNTIME_STATE =
           ["isexe", "npm:2.0.0"]\
         ],\
         "linkType": "HARD"\
+      }],\
+      ["npm:4.0.0", {\
+        "packageLocation": "./.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip/node_modules/which/",\
+        "packageDependencies": [\
+          ["which", "npm:4.0.0"],\
+          ["isexe", "npm:3.1.1"]\
+        ],\
+        "linkType": "HARD"\
       }]\
     ]],\
     ["which-module", [\
diff --git a/.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-822ea07755.zip b/.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-822ea07755.zip
new file mode 100644
index 00000000..6f5b2e50
Binary files /dev/null and b/.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-822ea07755.zip differ
diff --git a/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip b/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip
new file mode 100644
index 00000000..79245108
Binary files /dev/null and b/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip differ
diff --git a/.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip b/.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip
new file mode 100644
index 00000000..4b92f567
Binary files /dev/null and b/.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip differ
diff --git a/.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip b/.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip
new file mode 100644
index 00000000..cfa8ee7b
Binary files /dev/null and b/.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip differ
diff --git a/.yarn/cache/asn1-npm-0.2.4-219dd49411-7e9ba05c58.zip b/.yarn/cache/asn1-npm-0.2.4-219dd49411-7e9ba05c58.zip
deleted file mode 100644
index 1e8e0238..00000000
Binary files a/.yarn/cache/asn1-npm-0.2.4-219dd49411-7e9ba05c58.zip and /dev/null differ
diff --git a/.yarn/cache/assert-plus-npm-1.0.0-cac95ef098-f4f991ae2d.zip b/.yarn/cache/assert-plus-npm-1.0.0-cac95ef098-f4f991ae2d.zip
deleted file mode 100644
index 080260df..00000000
Binary files a/.yarn/cache/assert-plus-npm-1.0.0-cac95ef098-f4f991ae2d.zip and /dev/null differ
diff --git a/.yarn/cache/aws-sign2-npm-0.7.0-656c6cb84d-2ac497d739.zip b/.yarn/cache/aws-sign2-npm-0.7.0-656c6cb84d-2ac497d739.zip
deleted file mode 100644
index 0c7efe33..00000000
Binary files a/.yarn/cache/aws-sign2-npm-0.7.0-656c6cb84d-2ac497d739.zip and /dev/null differ
diff --git a/.yarn/cache/aws4-npm-1.11.0-283476ad94-54886f07b3.zip b/.yarn/cache/aws4-npm-1.11.0-283476ad94-54886f07b3.zip
deleted file mode 100644
index 462f4483..00000000
Binary files a/.yarn/cache/aws4-npm-1.11.0-283476ad94-54886f07b3.zip and /dev/null differ
diff --git a/.yarn/cache/bcrypt-pbkdf-npm-1.0.2-80db8b16ed-13a4cde058.zip b/.yarn/cache/bcrypt-pbkdf-npm-1.0.2-80db8b16ed-13a4cde058.zip
deleted file mode 100644
index e63b7f0d..00000000
Binary files a/.yarn/cache/bcrypt-pbkdf-npm-1.0.2-80db8b16ed-13a4cde058.zip and /dev/null differ
diff --git a/.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip b/.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip
new file mode 100644
index 00000000..10ac0374
Binary files /dev/null and b/.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip differ
diff --git a/.yarn/cache/caseless-npm-0.12.0-e83bc5df83-ea1efdf430.zip b/.yarn/cache/caseless-npm-0.12.0-e83bc5df83-ea1efdf430.zip
deleted file mode 100644
index 3ece9574..00000000
Binary files a/.yarn/cache/caseless-npm-0.12.0-e83bc5df83-ea1efdf430.zip and /dev/null differ
diff --git a/.yarn/cache/dashdash-npm-1.14.1-be8f10a286-137b287fa0.zip b/.yarn/cache/dashdash-npm-1.14.1-be8f10a286-137b287fa0.zip
deleted file mode 100644
index 54458bcf..00000000
Binary files a/.yarn/cache/dashdash-npm-1.14.1-be8f10a286-137b287fa0.zip and /dev/null differ
diff --git a/.yarn/cache/ecc-jsbn-npm-0.1.2-85b7a7be89-d43591f239.zip b/.yarn/cache/ecc-jsbn-npm-0.1.2-85b7a7be89-d43591f239.zip
deleted file mode 100644
index f5f17818..00000000
Binary files a/.yarn/cache/ecc-jsbn-npm-0.1.2-85b7a7be89-d43591f239.zip and /dev/null differ
diff --git a/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip b/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip
new file mode 100644
index 00000000..202e9318
Binary files /dev/null and b/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip differ
diff --git a/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip b/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip
new file mode 100644
index 00000000..7112b0a4
Binary files /dev/null and b/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip differ
diff --git a/.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip b/.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip
new file mode 100644
index 00000000..8c436166
Binary files /dev/null and b/.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip differ
diff --git a/.yarn/cache/extsprintf-npm-1.3.0-61a92b324c-26967d6c7e.zip b/.yarn/cache/extsprintf-npm-1.3.0-61a92b324c-26967d6c7e.zip
deleted file mode 100644
index 8f6723f3..00000000
Binary files a/.yarn/cache/extsprintf-npm-1.3.0-61a92b324c-26967d6c7e.zip and /dev/null differ
diff --git a/.yarn/cache/forever-agent-npm-0.6.1-01dae53bf9-c1e1644d5e.zip b/.yarn/cache/forever-agent-npm-0.6.1-01dae53bf9-c1e1644d5e.zip
deleted file mode 100644
index 01ab2ac9..00000000
Binary files a/.yarn/cache/forever-agent-npm-0.6.1-01dae53bf9-c1e1644d5e.zip and /dev/null differ
diff --git a/.yarn/cache/form-data-npm-2.3.3-c016cc11c0-1b6f3ccbf4.zip b/.yarn/cache/form-data-npm-2.3.3-c016cc11c0-1b6f3ccbf4.zip
deleted file mode 100644
index 0d6ac713..00000000
Binary files a/.yarn/cache/form-data-npm-2.3.3-c016cc11c0-1b6f3ccbf4.zip and /dev/null differ
diff --git a/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip b/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip
new file mode 100644
index 00000000..ee7e68e4
Binary files /dev/null and b/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip differ
diff --git a/.yarn/cache/getpass-npm-0.1.7-519164a3be-ab18d55661.zip b/.yarn/cache/getpass-npm-0.1.7-519164a3be-ab18d55661.zip
deleted file mode 100644
index c0a0abf6..00000000
Binary files a/.yarn/cache/getpass-npm-0.1.7-519164a3be-ab18d55661.zip and /dev/null differ
diff --git a/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip b/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip
new file mode 100644
index 00000000..62430427
Binary files /dev/null and b/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip differ
diff --git a/.yarn/cache/graceful-fs-npm-4.2.4-734467635f-4485e131bd.zip b/.yarn/cache/graceful-fs-npm-4.2.4-734467635f-4485e131bd.zip
deleted file mode 100644
index 4532008c..00000000
Binary files a/.yarn/cache/graceful-fs-npm-4.2.4-734467635f-4485e131bd.zip and /dev/null differ
diff --git a/.yarn/cache/har-schema-npm-2.0.0-3a318c0ca5-d8946348f3.zip b/.yarn/cache/har-schema-npm-2.0.0-3a318c0ca5-d8946348f3.zip
deleted file mode 100644
index e9ea1757..00000000
Binary files a/.yarn/cache/har-schema-npm-2.0.0-3a318c0ca5-d8946348f3.zip and /dev/null differ
diff --git a/.yarn/cache/har-validator-npm-5.1.5-bd9ac162f5-b998a7269c.zip b/.yarn/cache/har-validator-npm-5.1.5-bd9ac162f5-b998a7269c.zip
deleted file mode 100644
index 5ae256de..00000000
Binary files a/.yarn/cache/har-validator-npm-5.1.5-bd9ac162f5-b998a7269c.zip and /dev/null differ
diff --git a/.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-dbaaf3d9f3.zip b/.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-dbaaf3d9f3.zip
new file mode 100644
index 00000000..9f45513c
Binary files /dev/null and b/.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-dbaaf3d9f3.zip differ
diff --git a/.yarn/cache/http-signature-npm-1.2.0-ee92426f34-2ff7112e6b.zip b/.yarn/cache/http-signature-npm-1.2.0-ee92426f34-2ff7112e6b.zip
deleted file mode 100644
index 768ac957..00000000
Binary files a/.yarn/cache/http-signature-npm-1.2.0-ee92426f34-2ff7112e6b.zip and /dev/null differ
diff --git a/.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-9ec844f78f.zip b/.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-9ec844f78f.zip
new file mode 100644
index 00000000..525e91ea
Binary files /dev/null and b/.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-9ec844f78f.zip differ
diff --git a/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip b/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip
new file mode 100644
index 00000000..aab7a704
Binary files /dev/null and b/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip differ
diff --git a/.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip b/.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip
new file mode 100644
index 00000000..c751a851
Binary files /dev/null and b/.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip differ
diff --git a/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip b/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip
new file mode 100644
index 00000000..f981b1be
Binary files /dev/null and b/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip differ
diff --git a/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip b/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip
new file mode 100644
index 00000000..7ea54624
Binary files /dev/null and b/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip differ
diff --git a/.yarn/cache/isstream-npm-0.1.2-8581c75385-22d9c18101.zip b/.yarn/cache/isstream-npm-0.1.2-8581c75385-22d9c18101.zip
deleted file mode 100644
index 08ffe284..00000000
Binary files a/.yarn/cache/isstream-npm-0.1.2-8581c75385-22d9c18101.zip and /dev/null differ
diff --git a/.yarn/cache/jsbn-npm-0.1.1-0eb7132404-5450133242.zip b/.yarn/cache/jsbn-npm-0.1.1-0eb7132404-5450133242.zip
deleted file mode 100644
index 04ae1ba3..00000000
Binary files a/.yarn/cache/jsbn-npm-0.1.1-0eb7132404-5450133242.zip and /dev/null differ
diff --git a/.yarn/cache/json-schema-npm-0.2.3-018ee3dfc9-2f98d28db7.zip b/.yarn/cache/json-schema-npm-0.2.3-018ee3dfc9-2f98d28db7.zip
deleted file mode 100644
index 638bd788..00000000
Binary files a/.yarn/cache/json-schema-npm-0.2.3-018ee3dfc9-2f98d28db7.zip and /dev/null differ
diff --git a/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip b/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip
deleted file mode 100644
index 8b1c6138..00000000
Binary files a/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip and /dev/null differ
diff --git a/.yarn/cache/jsprim-npm-1.4.1-948d2c9ec3-819f15255a.zip b/.yarn/cache/jsprim-npm-1.4.1-948d2c9ec3-819f15255a.zip
deleted file mode 100644
index e90bdb15..00000000
Binary files a/.yarn/cache/jsprim-npm-1.4.1-948d2c9ec3-819f15255a.zip and /dev/null differ
diff --git a/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip b/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip
new file mode 100644
index 00000000..5b6ec16f
Binary files /dev/null and b/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip differ
diff --git a/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip b/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip
new file mode 100644
index 00000000..96df7034
Binary files /dev/null and b/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip differ
diff --git a/.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-3edf72b900.zip b/.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-3edf72b900.zip
new file mode 100644
index 00000000..22ae033d
Binary files /dev/null and b/.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-3edf72b900.zip differ
diff --git a/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip b/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip
new file mode 100644
index 00000000..913b687a
Binary files /dev/null and b/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip differ
diff --git a/.yarn/cache/minipass-npm-5.0.0-c64fb63c92-61682162d2.zip b/.yarn/cache/minipass-npm-5.0.0-c64fb63c92-61682162d2.zip
new file mode 100644
index 00000000..0151851f
Binary files /dev/null and b/.yarn/cache/minipass-npm-5.0.0-c64fb63c92-61682162d2.zip differ
diff --git a/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip b/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip
new file mode 100644
index 00000000..4deae416
Binary files /dev/null and b/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip differ
diff --git a/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip b/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip
new file mode 100644
index 00000000..8870af85
Binary files /dev/null and b/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip differ
diff --git a/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-2723fb822a.zip b/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-2723fb822a.zip
new file mode 100644
index 00000000..af804a05
Binary files /dev/null and b/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-2723fb822a.zip differ
diff --git a/.yarn/cache/node-gyp-npm-10.0.1-48708ce70b-578cf0c821.zip b/.yarn/cache/node-gyp-npm-10.0.1-48708ce70b-578cf0c821.zip
new file mode 100644
index 00000000..241a0aee
Binary files /dev/null and b/.yarn/cache/node-gyp-npm-10.0.1-48708ce70b-578cf0c821.zip differ
diff --git a/.yarn/cache/node-gyp-npm-7.1.2-002c5798eb-b29061c737.zip b/.yarn/cache/node-gyp-npm-7.1.2-002c5798eb-b29061c737.zip
deleted file mode 100644
index e8891bf9..00000000
Binary files a/.yarn/cache/node-gyp-npm-7.1.2-002c5798eb-b29061c737.zip and /dev/null differ
diff --git a/.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip b/.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip
new file mode 100644
index 00000000..1fc2fd6f
Binary files /dev/null and b/.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip differ
diff --git a/.yarn/cache/oauth-sign-npm-0.9.0-7aa9422221-1809a366d2.zip b/.yarn/cache/oauth-sign-npm-0.9.0-7aa9422221-1809a366d2.zip
deleted file mode 100644
index 297cc1ec..00000000
Binary files a/.yarn/cache/oauth-sign-npm-0.9.0-7aa9422221-1809a366d2.zip and /dev/null differ
diff --git a/.yarn/cache/performance-now-npm-2.1.0-45e3ce7e49-534e641aa8.zip b/.yarn/cache/performance-now-npm-2.1.0-45e3ce7e49-534e641aa8.zip
deleted file mode 100644
index fa9ee04f..00000000
Binary files a/.yarn/cache/performance-now-npm-2.1.0-45e3ce7e49-534e641aa8.zip and /dev/null differ
diff --git a/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip b/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip
new file mode 100644
index 00000000..0436b176
Binary files /dev/null and b/.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip differ
diff --git a/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip b/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip
new file mode 100644
index 00000000..a361d796
Binary files /dev/null and b/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip differ
diff --git a/.yarn/cache/psl-npm-1.8.0-226099d70e-5f62a8eca0.zip b/.yarn/cache/psl-npm-1.8.0-226099d70e-5f62a8eca0.zip
deleted file mode 100644
index 426d5011..00000000
Binary files a/.yarn/cache/psl-npm-1.8.0-226099d70e-5f62a8eca0.zip and /dev/null differ
diff --git a/.yarn/cache/qs-npm-6.5.2-dbf9d8386b-ef17caa6e1.zip b/.yarn/cache/qs-npm-6.5.2-dbf9d8386b-ef17caa6e1.zip
deleted file mode 100644
index 6bc244a0..00000000
Binary files a/.yarn/cache/qs-npm-6.5.2-dbf9d8386b-ef17caa6e1.zip and /dev/null differ
diff --git a/.yarn/cache/request-npm-2.88.2-f4a57c72c4-005b8b237b.zip b/.yarn/cache/request-npm-2.88.2-f4a57c72c4-005b8b237b.zip
deleted file mode 100644
index c2ec3596..00000000
Binary files a/.yarn/cache/request-npm-2.88.2-f4a57c72c4-005b8b237b.zip and /dev/null differ
diff --git a/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip b/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip
new file mode 100644
index 00000000..4b0d8797
Binary files /dev/null and b/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip differ
diff --git a/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip b/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip
new file mode 100644
index 00000000..aeec6f4b
Binary files /dev/null and b/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip differ
diff --git a/.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip b/.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip
new file mode 100644
index 00000000..51cba2db
Binary files /dev/null and b/.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip differ
diff --git a/.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-ea727734bd.zip b/.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-ea727734bd.zip
new file mode 100644
index 00000000..59122895
Binary files /dev/null and b/.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-ea727734bd.zip differ
diff --git a/.yarn/cache/sshpk-npm-1.16.1-feb759e7e0-b437fd3fd2.zip b/.yarn/cache/sshpk-npm-1.16.1-feb759e7e0-b437fd3fd2.zip
deleted file mode 100644
index 3a237086..00000000
Binary files a/.yarn/cache/sshpk-npm-1.16.1-feb759e7e0-b437fd3fd2.zip and /dev/null differ
diff --git a/.yarn/cache/ssri-npm-10.0.5-1a7557d04d-453f9a1c24.zip b/.yarn/cache/ssri-npm-10.0.5-1a7557d04d-453f9a1c24.zip
new file mode 100644
index 00000000..e300bb6d
Binary files /dev/null and b/.yarn/cache/ssri-npm-10.0.5-1a7557d04d-453f9a1c24.zip differ
diff --git a/.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip b/.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip
deleted file mode 100644
index d7f57a7b..00000000
Binary files a/.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip and /dev/null differ
diff --git a/.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip b/.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip
new file mode 100644
index 00000000..194ce125
Binary files /dev/null and b/.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip differ
diff --git a/.yarn/cache/tough-cookie-npm-2.5.0-79a2fe43fe-024cb13a4d.zip b/.yarn/cache/tough-cookie-npm-2.5.0-79a2fe43fe-024cb13a4d.zip
deleted file mode 100644
index 9caa7a88..00000000
Binary files a/.yarn/cache/tough-cookie-npm-2.5.0-79a2fe43fe-024cb13a4d.zip and /dev/null differ
diff --git a/.yarn/cache/tweetnacl-npm-0.14.5-a3f766c0d1-04ee27901c.zip b/.yarn/cache/tweetnacl-npm-0.14.5-a3f766c0d1-04ee27901c.zip
deleted file mode 100644
index b072ec62..00000000
Binary files a/.yarn/cache/tweetnacl-npm-0.14.5-a3f766c0d1-04ee27901c.zip and /dev/null differ
diff --git a/.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip b/.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip
new file mode 100644
index 00000000..bb91bbf9
Binary files /dev/null and b/.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip differ
diff --git a/.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-40912a8963.zip b/.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-40912a8963.zip
new file mode 100644
index 00000000..f22fc3b9
Binary files /dev/null and b/.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-40912a8963.zip differ
diff --git a/.yarn/cache/verror-npm-1.10.0-c3f839c579-da548149dd.zip b/.yarn/cache/verror-npm-1.10.0-c3f839c579-da548149dd.zip
deleted file mode 100644
index a58d9d72..00000000
Binary files a/.yarn/cache/verror-npm-1.10.0-c3f839c579-da548149dd.zip and /dev/null differ
diff --git a/.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip b/.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip
new file mode 100644
index 00000000..093e6f57
Binary files /dev/null and b/.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip differ
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/.ready b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/.ready
similarity index 100%
copy from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/.ready
copy to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/.ready
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/CHANGELOG.md b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/CHANGELOG.md
similarity index 62%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/CHANGELOG.md
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/CHANGELOG.md
index 733a4b5d..98315add 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/CHANGELOG.md
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/CHANGELOG.md
@@ -1,11 +1,434 @@
-v7.1.2 2020-10-17
-=================
+# Changelog
+
+### [10.0.1](https://www.github.com/nodejs/node-gyp/compare/v10.0.0...v10.0.1) (2023-11-02)
+
+
+### Bug Fixes
+
+* use local `util` for `findAccessibleSync()` ([b39e681](https://www.github.com/nodejs/node-gyp/commit/b39e6819aa9e2c45107d6e60a4913ca036ebfbfd))
+
+
+### Miscellaneous
+
+* add parallel test logging ([7de1f5f](https://www.github.com/nodejs/node-gyp/commit/7de1f5f32d550d26d48fe4f76aed5866744edcba))
+* lint fixes ([4e0ed99](https://www.github.com/nodejs/node-gyp/commit/4e0ed992566f43abc6e988af091ad07fde04acbf))
+* use platform specific timeouts in tests ([a68586a](https://www.github.com/nodejs/node-gyp/commit/a68586a67d0af238300662cc062422b42820044d))
+
+## [10.0.0](https://www.github.com/nodejs/node-gyp/compare/v9.4.0...v10.0.0) (2023-10-28)
+
+
+### ⚠ BREAKING CHANGES
+
+* use .npmignore file to limit which files are published (#2921)
+* the `Gyp` class exported is now created using ECMAScript classes and therefore might have small differences to classes that were previously created with `util.inherits`.
+* All internal functions have been coverted to return promises and no longer accept callbacks. This is not a breaking change for users but may be breaking to consumers of `node-gyp` if you are requiring internal functions directly.
+* `node-gyp` now supports node `^16.14.0 || >=18.0.0`
+* update engines.node to ^14.17.0 || ^16.13.0 || >=18.0.0
+
+### Features
+
+* convert all internal functions to async/await ([355622f](https://www.github.com/nodejs/node-gyp/commit/355622f4aac3bd3056b9e03aac5fa2f42a4b3576))
+* convert internal classes from util.inherits to classes ([d52997e](https://www.github.com/nodejs/node-gyp/commit/d52997e975b9da6e0cea3d9b99873e9ddc768679))
+* drop node 14 support ([#2929](https://www.github.com/nodejs/node-gyp/issues/2929)) ([1b3bd34](https://www.github.com/nodejs/node-gyp/commit/1b3bd341b40f384988d03207ce8187e93ba609bc))
+* drop rimraf dependency ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* **gyp:** update gyp to v0.16.1 ([#2923](https://www.github.com/nodejs/node-gyp/issues/2923)) ([707927c](https://www.github.com/nodejs/node-gyp/commit/707927cd579205ef2b4b17e61c1cce24c056b452))
+* replace npmlog with proc-log ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* update engines.node to ^14.17.0 || ^16.13.0 || >=18.0.0 ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* use .npmignore file to limit which files are published ([#2921](https://www.github.com/nodejs/node-gyp/issues/2921)) ([864a979](https://www.github.com/nodejs/node-gyp/commit/864a979930cf0ef5ad64bc887b901fa8955d058f))
+
+
+### Bug Fixes
+
+* create Python symlink only during builds, and clean it up after ([#2721](https://www.github.com/nodejs/node-gyp/issues/2721)) ([0f1f667](https://www.github.com/nodejs/node-gyp/commit/0f1f667b737d21905e283df100a2cb639993562a))
+* promisify build command ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* use fs/promises in favor of fs.promises ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+
+
+### Tests
+
+* increase mocha timeout ([#2887](https://www.github.com/nodejs/node-gyp/issues/2887)) ([445c28f](https://www.github.com/nodejs/node-gyp/commit/445c28fabc5fbdf9c3bb3341fb70660a3530f6ad))
+* update expired certs ([#2908](https://www.github.com/nodejs/node-gyp/issues/2908)) ([5746691](https://www.github.com/nodejs/node-gyp/commit/5746691a36f7b37019d4b8d4e9616aec43d20410))
+
+
+### Doc
+
+* Add note about Python symlinks (PR 2362) to CHANGELOG.md for 9.1.0 ([#2783](https://www.github.com/nodejs/node-gyp/issues/2783)) ([b3d41ae](https://www.github.com/nodejs/node-gyp/commit/b3d41aeb737ddd54cc292f363abc561dcc0a614e))
+* README.md Do not hardcode the supported versions of Python ([#2880](https://www.github.com/nodejs/node-gyp/issues/2880)) ([bb93b94](https://www.github.com/nodejs/node-gyp/commit/bb93b946a9c74934b59164deb52128cf913c97d5))
+* update applicable GitHub links from master to main ([#2843](https://www.github.com/nodejs/node-gyp/issues/2843)) ([d644ce4](https://www.github.com/nodejs/node-gyp/commit/d644ce48311edf090d0e920ad449e5766c757933))
+* Update windows installation instructions in README.md ([#2882](https://www.github.com/nodejs/node-gyp/issues/2882)) ([c9caa2e](https://www.github.com/nodejs/node-gyp/commit/c9caa2ecf3c7deae68444ce8fabb32d2dca651cd))
+
+
+### Core
+
+* find python checks order changed on windows ([#2872](https://www.github.com/nodejs/node-gyp/issues/2872)) ([b030555](https://www.github.com/nodejs/node-gyp/commit/b030555cdb754d9c23906e7e707115cd077bbf76))
+* glob@10.3.10 ([#2926](https://www.github.com/nodejs/node-gyp/issues/2926)) ([4bef1ec](https://www.github.com/nodejs/node-gyp/commit/4bef1ecc7554097d92beb397fbe1a546c5227545))
+* glob@8.0.3 ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* make-fetch-happen@13.0.0 ([#2927](https://www.github.com/nodejs/node-gyp/issues/2927)) ([059bb6f](https://www.github.com/nodejs/node-gyp/commit/059bb6fd41bb50955a9efbd97887773d60d53221))
+* nopt@^7.0.0 ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* standard@17.0.0 and fix linting errors ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* which@3.0.0 ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* which@4.0.0 ([#2928](https://www.github.com/nodejs/node-gyp/issues/2928)) ([e388255](https://www.github.com/nodejs/node-gyp/commit/e38825531403aabeae7abe58e76867f31b832f36))
+
+
+### Miscellaneous
+
+* add check engines script to CI ([#2922](https://www.github.com/nodejs/node-gyp/issues/2922)) ([21a7249](https://www.github.com/nodejs/node-gyp/commit/21a7249b40d8f95e7721e450fd18764adb1648a7))
+* empty commit to add changelog entries from [#2770](https://www.github.com/nodejs/node-gyp/issues/2770) ([4a50fe3](https://www.github.com/nodejs/node-gyp/commit/4a50fe31574217c4b2a798fc72b19947a64ceea1))
+* GitHub Workflows security hardening ([#2740](https://www.github.com/nodejs/node-gyp/issues/2740)) ([26683e9](https://www.github.com/nodejs/node-gyp/commit/26683e993df038fb94d89f2276f3535e4522d79a))
+* misc testing fixes ([#2930](https://www.github.com/nodejs/node-gyp/issues/2930)) ([4e493d4](https://www.github.com/nodejs/node-gyp/commit/4e493d4fb262d12ac52c84979071ccc79e666a1a))
+* run tests after release please PR ([3032e10](https://www.github.com/nodejs/node-gyp/commit/3032e1061cc2b7b49f83c397d385bafddc6b0214))
+
+## [9.4.0](https://www.github.com/nodejs/node-gyp/compare/v9.3.1...v9.4.0) (2023-06-12)
+
+
+### Features
+
+* add support for native windows arm64 build tools ([bb76021](https://www.github.com/nodejs/node-gyp/commit/bb76021d35964d2bb125bc6214286f35ae4e6cad))
+* Upgrade Python linting from flake8 to ruff ([#2815](https://www.github.com/nodejs/node-gyp/issues/2815)) ([fc0ddc6](https://www.github.com/nodejs/node-gyp/commit/fc0ddc6523c62b10e5ca1257500b3ceac01450a7))
+
+
+### Bug Fixes
+
+* extract tarball to temp directory on Windows ([#2846](https://www.github.com/nodejs/node-gyp/issues/2846)) ([aaa117c](https://www.github.com/nodejs/node-gyp/commit/aaa117c514430aa2c1e568b95df1b6ed1c1fd3b6))
+* log statement is for devDir not nodedir ([#2840](https://www.github.com/nodejs/node-gyp/issues/2840)) ([55048f8](https://www.github.com/nodejs/node-gyp/commit/55048f8be5707c295fb0876306aded75638a8b63))
+
+
+### Miscellaneous
+
+* get update-gyp.py to work with Python >= v3.5 ([#2826](https://www.github.com/nodejs/node-gyp/issues/2826)) ([337e8e6](https://www.github.com/nodejs/node-gyp/commit/337e8e68209bd2481cbb11dacce61234dc5c9419))
+
+
+### Doc
+
+* docs/README.md add advise about deprecated node-sass ([#2828](https://www.github.com/nodejs/node-gyp/issues/2828)) ([6f3c2d3](https://www.github.com/nodejs/node-gyp/commit/6f3c2d3c6c0de0dbf8c7245f34c2e0b3eea53812))
+* Update README.md ([#2822](https://www.github.com/nodejs/node-gyp/issues/2822)) ([c7927e2](https://www.github.com/nodejs/node-gyp/commit/c7927e228dfde059c93e08c26b54dd8026144583))
+
+
+### Tests
+
+* remove deprecated Node.js and Python ([#2868](https://www.github.com/nodejs/node-gyp/issues/2868)) ([a0b3d1c](https://www.github.com/nodejs/node-gyp/commit/a0b3d1c3afed71a74501476fcbc6ee3fface4d13))
+
+### [9.3.1](https://www.github.com/nodejs/node-gyp/compare/v9.3.0...v9.3.1) (2022-12-16)
+
+
+### Bug Fixes
+
+* increase node 12 support to ^12.13 ([#2771](https://www.github.com/nodejs/node-gyp/issues/2771)) ([888efb9](https://www.github.com/nodejs/node-gyp/commit/888efb9055857afee6a6b54550722cf9ae3ee323))
+
+
+### Miscellaneous
+
+* update python test matrix ([#2774](https://www.github.com/nodejs/node-gyp/issues/2774)) ([38f01fa](https://www.github.com/nodejs/node-gyp/commit/38f01fa57d10fdb3db7697121d957bc2e0e96508))
+
+## [9.3.0](https://www.github.com/nodejs/node-gyp/compare/v9.2.0...v9.3.0) (2022-10-10)
+
+
+### Features
+
+* **gyp:** update gyp to v0.14.0 ([#2749](https://www.github.com/nodejs/node-gyp/issues/2749)) ([713b8dc](https://www.github.com/nodejs/node-gyp/commit/713b8dcdbf44532ca9453a127da266386cc737f8))
+* remove support for VS2015 in Node.js >=19 ([#2746](https://www.github.com/nodejs/node-gyp/issues/2746)) ([131d1a4](https://www.github.com/nodejs/node-gyp/commit/131d1a463baf034a04154bcda753a8295f112a34))
+* support IBM Open XL C/C++ on z/OS ([#2743](https://www.github.com/nodejs/node-gyp/issues/2743)) ([7d0c83d](https://www.github.com/nodejs/node-gyp/commit/7d0c83d2a95aca743dff972826d0da26203acfc4))
+
+## [9.2.0](https://www.github.com/nodejs/node-gyp/compare/v9.1.0...v9.2.0) (2022-10-02)
+
+
+### Features
+
+* Add proper support for IBM i ([a26494f](https://www.github.com/nodejs/node-gyp/commit/a26494fbb8883d9ef784503979e115dec3e2791e))
+* **gyp:** update gyp to v0.13.0 ([3e2a532](https://www.github.com/nodejs/node-gyp/commit/3e2a5324f1c24f3a04bca04cf54fe23d5c4d5e50))
+
+
+### Bug Fixes
+
+* node.js debugger adds stderr (but exit code is 0) -> shouldn't throw ([#2719](https://www.github.com/nodejs/node-gyp/issues/2719)) ([c379a74](https://www.github.com/nodejs/node-gyp/commit/c379a744c65c7ab07c2c3193d9c7e8f25ae1b05e))
+
+
+### Core
+
+* enable support for zoslib on z/OS ([#2600](https://www.github.com/nodejs/node-gyp/issues/2600)) ([83c0a12](https://www.github.com/nodejs/node-gyp/commit/83c0a12bf23b4cbf3125d41f9e2d4201db76c9ae))
+
+
+### Miscellaneous
+
+* update dependency - nopt@6.0.0 ([#2707](https://www.github.com/nodejs/node-gyp/issues/2707)) ([8958ecf](https://www.github.com/nodejs/node-gyp/commit/8958ecf2bb719227bbcbf155891c3186ee219a2e))
+
+## [9.1.0](https://www.github.com/nodejs/node-gyp/compare/v9.0.0...v9.1.0) (2022-07-13)
+
+
+### Features
+
+* Update function getSDK() to support Windows 11 SDK ([#2565](https://www.github.com/nodejs/node-gyp/issues/2565)) ([ea8520e](https://www.github.com/nodejs/node-gyp/commit/ea8520e3855374bd15b6d001fe112d58a8d7d737))
+
+
+### Bug Fixes
+
+* extend tap timeout length to allow for slow CI ([6f74c76](https://www.github.com/nodejs/node-gyp/commit/6f74c762fe3c19bdd20245cb5c02e2dfa65d9451))
+* new ca & server certs, bundle in .js file and unpack for testing ([147e3d3](https://www.github.com/nodejs/node-gyp/commit/147e3d34f44a97deb7aa507207680cf0f4e662a2))
+* re-label ([#2689](https://www.github.com/nodejs/node-gyp/issues/2689)) ([f0b7863](https://www.github.com/nodejs/node-gyp/commit/f0b7863dadfa365afc173025ae95351aec79abd9))
+* typo on readme ([bf81cd4](https://www.github.com/nodejs/node-gyp/commit/bf81cd452b931dd4dfa82762c23dd530a075d992))
+
+
+### Doc
+
+* update docs/README.md with latest version number ([62d2815](https://www.github.com/nodejs/node-gyp/commit/62d28151bf8266a34e1bcceeb25b4e6e2ae5ca5d))
+
+
+### Core
+
+* update due to rename of primary branch ([ca1f068](https://www.github.com/nodejs/node-gyp/commit/ca1f0681a5567ca8cd51acebccd37a633f19bc6a))
+* Add Python symlink to path (for non-Windows OSes only) ([#2362](https://github.com/nodejs/node-gyp/pull/2362)) ([b9ddcd5](https://github.com/nodejs/node-gyp/commit/b9ddcd5bbd93b05b03674836b6ebdae2c2e74c8c))
+
+
+### Tests
+
+* Try msvs-version: [2016, 2019, 2022] ([#2700](https://www.github.com/nodejs/node-gyp/issues/2700)) ([68b5b5b](https://www.github.com/nodejs/node-gyp/commit/68b5b5be9c94ac20c55e88654ff6f55234d7130a))
+* Upgrade GitHub Actions ([#2623](https://www.github.com/nodejs/node-gyp/issues/2623)) ([245cd5b](https://www.github.com/nodejs/node-gyp/commit/245cd5bbe4441d4f05e88f2fa20a86425419b6af))
+* Upgrade GitHub Actions ([#2701](https://www.github.com/nodejs/node-gyp/issues/2701)) ([1c64ca7](https://www.github.com/nodejs/node-gyp/commit/1c64ca7f4702c6eb43ecd16fbd67b5d939041621))
+
+## [9.0.0](https://www.github.com/nodejs/node-gyp/compare/v8.4.1...v9.0.0) (2022-02-24)
+
+
+### ⚠ BREAKING CHANGES
+
+* increase "engines" to "node" : "^12.22 || ^14.13 || >=16" (#2601)
+
+### Bug Fixes
+
+* _ in npm_config_ env variables ([eef4eef](https://www.github.com/nodejs/node-gyp/commit/eef4eefccb13ff6a32db862709ee5b2d4edf7e95))
+* update make-fetch-happen to a minimum of 10.0.3 ([839e414](https://www.github.com/nodejs/node-gyp/commit/839e414b63790c815a4a370d0feee8f24a94d40f))
+
+
+### Miscellaneous
+
+* add minimal SECURITY.md ([#2560](https://www.github.com/nodejs/node-gyp/issues/2560)) ([c2a1850](https://www.github.com/nodejs/node-gyp/commit/c2a185056e2e589b520fbc0bcc59c2935cd07ede))
+
+
+### Doc
+
+* Add notes/disclaimers for upgrading the copy of node-gyp that npm uses ([#2585](https://www.github.com/nodejs/node-gyp/issues/2585)) ([faf6d48](https://www.github.com/nodejs/node-gyp/commit/faf6d48f8a77c08a313baf9332358c4b1231c73c))
+* Rename and update Common-issues.md --> docs/README.md ([#2567](https://www.github.com/nodejs/node-gyp/issues/2567)) ([2ef5fb8](https://www.github.com/nodejs/node-gyp/commit/2ef5fb86277c4d81baffc0b9f642a8d86be1bfa5))
+* rephrase explanation of which node-gyp is used by npm ([#2587](https://www.github.com/nodejs/node-gyp/issues/2587)) ([a2f2988](https://www.github.com/nodejs/node-gyp/commit/a2f298870692022302fa27a1d42363c4a72df407))
+* title match content ([#2574](https://www.github.com/nodejs/node-gyp/issues/2574)) ([6e8f93b](https://www.github.com/nodejs/node-gyp/commit/6e8f93be0443f2649d4effa7bc773a9da06a33b4))
+* Update Python versions ([#2571](https://www.github.com/nodejs/node-gyp/issues/2571)) ([e069f13](https://www.github.com/nodejs/node-gyp/commit/e069f13658a8bfb5fd60f74708cf8be0856d92e3))
+
+
+### Core
+
+* add lib.target as path for searching libnode on z/OS ([1d499dd](https://www.github.com/nodejs/node-gyp/commit/1d499dd5606f39de2d34fa822fd0fa5ce17fbd06))
+* increase "engines" to "node" : "^12.22 || ^14.13 || >=16" ([#2601](https://www.github.com/nodejs/node-gyp/issues/2601)) ([6562f92](https://www.github.com/nodejs/node-gyp/commit/6562f92a6f2e67aeae081ddf5272ff117f1fab07))
+* make-fetch-happen@10.0.1 ([78f6660](https://www.github.com/nodejs/node-gyp/commit/78f66604e0df480d4f36a8fa4f3618c046a6fbdc))
+
+### [8.4.1](https://www.github.com/nodejs/node-gyp/compare/v8.4.0...v8.4.1) (2021-11-19)
+
+
+### Bug Fixes
+
+* windows command missing space ([#2553](https://www.github.com/nodejs/node-gyp/issues/2553)) ([cc37b88](https://www.github.com/nodejs/node-gyp/commit/cc37b880690706d3c5d04d5a68c76c392a0a23ed))
+
+
+### Doc
+
+* fix typo in powershell node-gyp update ([787cf7f](https://www.github.com/nodejs/node-gyp/commit/787cf7f8e5ddd5039e02b64ace6b7b15e06fe0a4))
+
+
+### Core
+
+* npmlog@6.0.0 ([8083f6b](https://www.github.com/nodejs/node-gyp/commit/8083f6b855bd7f3326af04c5f5269fc28d7f2508))
+
+## [8.4.0](https://www.github.com/nodejs/node-gyp/compare/v8.3.0...v8.4.0) (2021-11-05)
+
+
+### Features
+
+* build with config.gypi from node headers ([a27dc08](https://www.github.com/nodejs/node-gyp/commit/a27dc08696911c6d81e76cc228697243069103c1))
+* support vs2022 ([#2533](https://www.github.com/nodejs/node-gyp/issues/2533)) ([5a00387](https://www.github.com/nodejs/node-gyp/commit/5a00387e5f8018264a1822f6c4d5dbf425f21cf6))
+
+## [8.3.0](https://www.github.com/nodejs/node-gyp/compare/v8.2.0...v8.3.0) (2021-10-11)
+
+
+### Features
+
+* **gyp:** update gyp to v0.10.0 ([#2521](https://www.github.com/nodejs/node-gyp/issues/2521)) ([5585792](https://www.github.com/nodejs/node-gyp/commit/5585792922a97f0629f143c560efd74470eae87f))
+
+
+### Tests
+
+* Python 3.10 was release on Oct. 4th ([#2504](https://www.github.com/nodejs/node-gyp/issues/2504)) ([0a67dcd](https://www.github.com/nodejs/node-gyp/commit/0a67dcd1307f3560495219253241eafcbf4e2a69))
+
+
+### Miscellaneous
+
+* **deps:** bump make-fetch-happen from 8.0.14 to 9.1.0 ([b05b4fe](https://www.github.com/nodejs/node-gyp/commit/b05b4fe9891f718f40edf547e9b50e982826d48a))
+* refactor the creation of config.gypi file ([f2ad87f](https://www.github.com/nodejs/node-gyp/commit/f2ad87ff65f98ad66daa7225ad59d99b759a2b07))
+
+## [8.2.0](https://www.github.com/nodejs/node-gyp/compare/v8.1.0...v8.2.0) (2021-08-23)
+
+
+### Features
+
+* **gyp:** update gyp to v0.9.6 ([#2481](https://www.github.com/nodejs/node-gyp/issues/2481)) ([ed9a9ed](https://www.github.com/nodejs/node-gyp/commit/ed9a9ed653a17c84afa3c327161992d0da7d0cea))
+
+
+### Bug Fixes
+
+* add error arg back into catch block for older Node.js users ([5cde818](https://www.github.com/nodejs/node-gyp/commit/5cde818aac715477e9e9747966bb6b4c4ed070a8))
+* change default gyp update message ([#2420](https://www.github.com/nodejs/node-gyp/issues/2420)) ([cfd12ff](https://www.github.com/nodejs/node-gyp/commit/cfd12ff3bb0eb4525173413ef6a94b3cd8398cad))
+* doc how to update node-gyp independently from npm ([c8c0af7](https://www.github.com/nodejs/node-gyp/commit/c8c0af72e78141a02b5da4cd4d704838333a90bd))
+* missing spaces ([f0882b1](https://www.github.com/nodejs/node-gyp/commit/f0882b1264b2fa701adbc81a3be0b3cba80e333d))
+
+
+### Core
+
+* deep-copy process.config during configure ([#2368](https://www.github.com/nodejs/node-gyp/issues/2368)) ([5f1a06c](https://www.github.com/nodejs/node-gyp/commit/5f1a06c50f3b0c3d292f64948f85a004cfcc5c87))
+
+
+### Miscellaneous
+
+* **deps:** bump tar from 6.1.0 to 6.1.2 ([#2474](https://www.github.com/nodejs/node-gyp/issues/2474)) ([ec15a3e](https://www.github.com/nodejs/node-gyp/commit/ec15a3e5012004172713c11eebcc9d852d32d380))
+* fix typos discovered by codespell ([#2442](https://www.github.com/nodejs/node-gyp/issues/2442)) ([2d0ce55](https://www.github.com/nodejs/node-gyp/commit/2d0ce5595e232a3fc7c562cdf39efb77e2312cc1))
+* GitHub Actions Test on node: [12.x, 14.x, 16.x] ([#2439](https://www.github.com/nodejs/node-gyp/issues/2439)) ([b7bccdb](https://www.github.com/nodejs/node-gyp/commit/b7bccdb527d93b0bb0ce99713f083ce2985fe85c))
+
+
+### Doc
+
+* correct link to "binding.gyp files out in the wild" ([#2483](https://www.github.com/nodejs/node-gyp/issues/2483)) ([660dd7b](https://www.github.com/nodejs/node-gyp/commit/660dd7b2a822c184be8027b300e68be67b366772))
+* **wiki:** Add a link to the node-midi binding.gyp file. ([b354711](https://www.github.com/nodejs/node-gyp/commit/b3547115f6e356358138310e857c7f1ec627a8a7))
+* **wiki:** add bcrypt ([e199cfa](https://www.github.com/nodejs/node-gyp/commit/e199cfa8fc6161492d2a6ade2190510d0ebf7c0f))
+* **wiki:** Add helpful information ([4eda827](https://www.github.com/nodejs/node-gyp/commit/4eda8275c03dae6d2f5c40f3c1dbe930d84b0f2b))
+* **wiki:** Add node-canvas ([13a9553](https://www.github.com/nodejs/node-gyp/commit/13a955317b39caf98fd1f412d8d3f41599e979fd))
+* **wiki:** Add node-openvg-canvas and node-openvg. ([61f709e](https://www.github.com/nodejs/node-gyp/commit/61f709ec4d9f256a6467e9ff84430a48eeb629d1))
+* **wiki:** add one more example ([77f3632](https://www.github.com/nodejs/node-gyp/commit/77f363272930d3d4d24fd3973be22e6237128fcc))
+* **wiki:** add topcube, node-osmium, and node-osrm ([1a75d2b](https://www.github.com/nodejs/node-gyp/commit/1a75d2bf2f562ba50846893a516e111cfbb50885))
+* **wiki:** Added details for properly fixing ([3d4d9d5](https://www.github.com/nodejs/node-gyp/commit/3d4d9d52d6b5b49de06bb0bb5b68e2686d2b7ebd))
+* **wiki:** Added Ghostscript4JS ([bf4bed1](https://www.github.com/nodejs/node-gyp/commit/bf4bed1b96a7d22fba6f97f4552ad09f32ac3737))
+* **wiki:** added levelup ([1575bce](https://www.github.com/nodejs/node-gyp/commit/1575bce3a53db628bfb023fd6f3258fdf98c3195))
+* **wiki:** Added nk-mysql (nodamysql) ([5b4f2d0](https://www.github.com/nodejs/node-gyp/commit/5b4f2d0e1d5d3eadfd03aaf9c1668340f76c4bea))
+* **wiki:** Added nk-xrm-installer .gyp references, including .py scripts for providing complete reference to examples of fetching source via http, extracting, and moving files (as opposed to copying) ([ceb3088](https://www.github.com/nodejs/node-gyp/commit/ceb30885b74f6789374ef52267b84767be93ebe4))
+* **wiki:** Added tip about resolving frustrating LNK1181 error ([e64798d](https://www.github.com/nodejs/node-gyp/commit/e64798de8cac6031ad598a86d7599e81b4d20b17))
+* **wiki:** ADDED: Node.js binding to OpenCV ([e2dc777](https://www.github.com/nodejs/node-gyp/commit/e2dc77730b09d7ee8682d7713a7603a2d7aacabd))
+* **wiki:** Adding link to node-cryptopp's gyp file ([875adbe](https://www.github.com/nodejs/node-gyp/commit/875adbe2a4669fa5f2be0250ffbf98fb55e800fd))
+* **wiki:** Adding the sharp library to the list ([9dce0e4](https://www.github.com/nodejs/node-gyp/commit/9dce0e41650c3fa973e6135a79632d022c662a1d))
+* **wiki:** Adds node-fann ([23e3d48](https://www.github.com/nodejs/node-gyp/commit/23e3d485ed894ba7c631e9c062f5e366b50c416c))
+* **wiki:** Adds node-inotify and v8-profiler ([b6e542f](https://www.github.com/nodejs/node-gyp/commit/b6e542f644dbbfe22b88524ec500696e06ee4af7))
+* **wiki:** Bumping Python version from 2.3 to 2.7 as per the node-gyp readme ([55ebd6e](https://www.github.com/nodejs/node-gyp/commit/55ebd6ebacde975bf84f7bf4d8c66e64cc7cd0da))
+* **wiki:** C++ build tools version upgraded ([5b899b7](https://www.github.com/nodejs/node-gyp/commit/5b899b70db729c392ced7c98e8e17590c6499fc3))
+* **wiki:** change bcrypt url to binding.gyp file ([e11bdd8](https://www.github.com/nodejs/node-gyp/commit/e11bdd84de6144492d3eb327d67cbf2d62da1a76))
+* **wiki:** Clarification + direct link to VS2010 ([531c724](https://www.github.com/nodejs/node-gyp/commit/531c724561d947b5d870de8d52dd8c3c51c5ec2d))
+* **wiki:** Correcting the link to node-osmium ([fae7516](https://www.github.com/nodejs/node-gyp/commit/fae7516a1d2829b6e234eaded74fb112ebd79a05))
+* **wiki:** Created "binding.gyp" files out in the wild (markdown) ([d4fd143](https://www.github.com/nodejs/node-gyp/commit/d4fd14355bbe57f229f082f47bb2b3670868203f))
+* **wiki:** Created Common issues (markdown) ([a38299e](https://www.github.com/nodejs/node-gyp/commit/a38299ea340ceb0e732c6dc6a1b4760257644839))
+* **wiki:** Created Error: "pre" versions of node cannot be installed (markdown) ([98bc80d](https://www.github.com/nodejs/node-gyp/commit/98bc80d7a62ba70c881f3c39d94f804322e57852))
+* **wiki:** Created Linking to OpenSSL (markdown) ([c46d00d](https://www.github.com/nodejs/node-gyp/commit/c46d00d83bac5173dea8bbbb175a1a7de74fdaca))
+* **wiki:** Created Updating npm's bundled node gyp (markdown) ([e0ac8d1](https://www.github.com/nodejs/node-gyp/commit/e0ac8d15af46aadd1c220599e63199b154a514e6))
+* **wiki:** Created use of undeclared identifier 'TypedArray' (markdown) ([65ba711](https://www.github.com/nodejs/node-gyp/commit/65ba71139e9b7f64ac823e575ee9dbf17d937ce4))
+* **wiki:** Created Visual Studio 2010 Setup (markdown) ([5b80e83](https://www.github.com/nodejs/node-gyp/commit/5b80e834c8f79dda9fb2770a876ff3cf649c06f3))
+* **wiki:** Created Visual studio 2012 setup (markdown) ([becef31](https://www.github.com/nodejs/node-gyp/commit/becef316b6c46a33e783667720ee074a0141d1a5))
+* **wiki:** Destroyed Visual Studio 2010 Setup (markdown) ([93423b4](https://www.github.com/nodejs/node-gyp/commit/93423b43606de9664aeb79635825f5e9941ec9bc))
+* **wiki:** Destroyed Visual studio 2012 setup (markdown) ([3601508](https://www.github.com/nodejs/node-gyp/commit/3601508bb10fa05da0ddc7e70d57e4b4dd679657))
+* **wiki:** Different commands for Windows npm v6 vs. v7 ([0fce46b](https://www.github.com/nodejs/node-gyp/commit/0fce46b53340c85e8091cde347d5ed23a443c82f))
+* **wiki:** Drop  in favor of ([9285ff6](https://www.github.com/nodejs/node-gyp/commit/9285ff6e451c52c070a05f05f0a9602621d91d53))
+* **wiki:** Explicit link to Visual C++ 2010 Express ([378c363](https://www.github.com/nodejs/node-gyp/commit/378c3632f02c096ed819ec8f2611c65bef0c0554))
+* **wiki:** fix link to gyp file used to build libsqlite3 ([54db8d7](https://www.github.com/nodejs/node-gyp/commit/54db8d7ac33e3f98220960b5d86cfa18a75b53cb))
+* **wiki:** Fix link to node-zipfile ([92e49a8](https://www.github.com/nodejs/node-gyp/commit/92e49a858ed69cb4847a26a5676ab56ef5e2de33))
+* **wiki:** fixed node-serialport link ([954ee53](https://www.github.com/nodejs/node-gyp/commit/954ee530b3972d1db591fce32368e4e31b5a25d8))
+* **wiki:** I highly missing it in common issue as every windows biggner face that issue ([d617fae](https://www.github.com/nodejs/node-gyp/commit/d617faee29c40871ca5c8f93efd0ce929a40d541))
+* **wiki:** if ouns that the -h did not help. I founs on github that there was support for visual studio 2015, while i couldn't install node-red beacuse it kept telling me the key 2015 was missing. looking in he gyp python code i found the local file was bot up t dat with the github repo. updating took several efforts before i tried to drop the -g option. ([408b72f](https://www.github.com/nodejs/node-gyp/commit/408b72f561329408daeb17834436e381406efcc8))
+* **wiki:** If permissions error, please try  and then the command. ([ee8e1c1](https://www.github.com/nodejs/node-gyp/commit/ee8e1c1e5334096d58e0d6bca6c006f2ee9c88cb))
+* **wiki:** Improve Unix instructions ([c3e5487](https://www.github.com/nodejs/node-gyp/commit/c3e548736645b535ea5bce613d74ca3e98598243))
+* **wiki:** link to docs/ from README ([b52e487](https://www.github.com/nodejs/node-gyp/commit/b52e487eac1eb421573d1e67114a242eeff45a00))
+* **wiki:** Lower case L ([3aa2c6b](https://www.github.com/nodejs/node-gyp/commit/3aa2c6bdb07971b87505e32e32548d75264bd19f))
+* **wiki:** Make changes discussed in https://github.com/nodejs/node-gyp/issues/2416 ([1dcad87](https://www.github.com/nodejs/node-gyp/commit/1dcad873539027511a5f0243baf770ea90f6f4e2))
+* **wiki:** move wiki docs into doc/ ([f0a4835](https://www.github.com/nodejs/node-gyp/commit/f0a48355d86534ec3bdabcdb3ce3340fa2e17f39))
+* **wiki:** node-sass in the wild ([d310a73](https://www.github.com/nodejs/node-gyp/commit/d310a73d64d0065050377baac7047472f7424a1b))
+* **wiki:** node-srs was a 404 ([bbca21a](https://www.github.com/nodejs/node-gyp/commit/bbca21a1e1ede4c473aff365ca71989a5bda7b57))
+* **wiki:** Note: VS2010 seems to be no longer available!  VS2013 or nothing! ([7b5dcaf](https://www.github.com/nodejs/node-gyp/commit/7b5dcafafccdceae4b8f2b53ac9081a694b6ade8))
+* **wiki:** safer doc names, remove unnecessary TypedArray doc ([161c235](https://www.github.com/nodejs/node-gyp/commit/161c2353ef5b562f4acfb2fd77608fcbd0800fc0))
+* **wiki:** sorry, forgot to mention a specific windows version. ([d69dffc](https://www.github.com/nodejs/node-gyp/commit/d69dffc16c2b1e3c60dcb5d1c35a49270ba22a35))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([7444b47](https://www.github.com/nodejs/node-gyp/commit/7444b47a7caac1e14d1da474a7fcfcf88d328017))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([d766b74](https://www.github.com/nodejs/node-gyp/commit/d766b7427851e6c2edc02e2504a7be9be7e330c0))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([d319b0e](https://www.github.com/nodejs/node-gyp/commit/d319b0e98c7085de8e51bc5595eba4264b99a7d5))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([3c6692d](https://www.github.com/nodejs/node-gyp/commit/3c6692d538f0ce973869aa237118b7d2483feccd))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([93392d5](https://www.github.com/nodejs/node-gyp/commit/93392d559ce6f250b9c7fe8177e6c88603809dc1))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([8841158](https://www.github.com/nodejs/node-gyp/commit/88411588f300e9b7c00fe516ecd977a1feeeb15c))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([81bfa1f](https://www.github.com/nodejs/node-gyp/commit/81bfa1f1b63d522a9f8a9ae9ca0c7ae90fe75140))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([d1cd237](https://www.github.com/nodejs/node-gyp/commit/d1cd237bad06fa507adb354b9e2181a14dc63d24))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([3de9e17](https://www.github.com/nodejs/node-gyp/commit/3de9e17e0b8a387eafe7bd18d0ec1e3191d118e8))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([a9b7096](https://www.github.com/nodejs/node-gyp/commit/a9b70968fb956eab3b95672048b94350e1565ca3))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([3236069](https://www.github.com/nodejs/node-gyp/commit/3236069689e7e0eb15b324fce74ab58158956f98))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([1462755](https://www.github.com/nodejs/node-gyp/commit/14627556966e5d513bdb8e5208f0e1300f68991f))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([7ab1337](https://www.github.com/nodejs/node-gyp/commit/7ab133752a6c402bb96dcd3d671d73e03e9487ad))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([640895d](https://www.github.com/nodejs/node-gyp/commit/640895d36b7448c646a3b850c1e159106f83c724))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([ced8c96](https://www.github.com/nodejs/node-gyp/commit/ced8c968457f285ab8989c291d28173d7730833c))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([27b883a](https://www.github.com/nodejs/node-gyp/commit/27b883a350ad0db6b9130d7b996f35855ec34c7a))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([d29fb13](https://www.github.com/nodejs/node-gyp/commit/d29fb134f1c4b9dd729ba95f2979e69e0934809f))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([2765891](https://www.github.com/nodejs/node-gyp/commit/27658913e6220cf0371b4b73e25a0e4ab11108a1))
+* **wiki:** Updated "binding.gyp" files out in the wild (markdown) ([dc97766](https://www.github.com/nodejs/node-gyp/commit/dc9776648d432bca6775c176641f16da14522d4c))
+* **wiki:** Updated Error: "pre" versions of node cannot be installed (markdown) ([e9f8b33](https://www.github.com/nodejs/node-gyp/commit/e9f8b33d1f87d04f22cb09a814d7c55d0fa38446))
+* **wiki:** Updated Home (markdown) ([3407109](https://www.github.com/nodejs/node-gyp/commit/3407109325cf7ba1e925656b9eb75feffab0557c))
+* **wiki:** Updated Home (markdown) ([6e392bc](https://www.github.com/nodejs/node-gyp/commit/6e392bcdd3dd1691773e6e16e1dffc35931b81e0))
+* **wiki:** Updated Home (markdown) ([65efe32](https://www.github.com/nodejs/node-gyp/commit/65efe32ccb8d446ce569453364f922dd9d27c945))
+* **wiki:** Updated Home (markdown) ([ea28f09](https://www.github.com/nodejs/node-gyp/commit/ea28f0947af91fa638be355143f5df89d2e431c8))
+* **wiki:** Updated Home (markdown) ([0e37ff4](https://www.github.com/nodejs/node-gyp/commit/0e37ff48b306c12149661b375895741d3d710da7))
+* **wiki:** Updated Home (markdown) ([b398ef4](https://www.github.com/nodejs/node-gyp/commit/b398ef46f660d2b1506508550dadfb4c35639e4b))
+* **wiki:** Updated Linking to OpenSSL (markdown) ([8919028](https://www.github.com/nodejs/node-gyp/commit/8919028921fd304f08044098434f0dc6071fb7cf))
+* **wiki:** Updated Linking to OpenSSL (markdown) ([c00eb77](https://www.github.com/nodejs/node-gyp/commit/c00eb778fc7dc27e4dab3a9219035ea20458b33b))
+* **wiki:** Updated node-levelup to node-leveldown (broken links) ([59668bb](https://www.github.com/nodejs/node-gyp/commit/59668bb0b904feccf3c09afa2fd37378c77af967))
+* **wiki:** Updated Updating npm's bundled node gyp (markdown) ([d314854](https://www.github.com/nodejs/node-gyp/commit/d31485415ef69d46effa6090c95698341965de1b))
+* **wiki:** Updated Updating npm's bundled node gyp (markdown) ([11858b0](https://www.github.com/nodejs/node-gyp/commit/11858b0655d1eee00c62ad628e719d4378803d14))
+* **wiki:** Updated Updating npm's bundled node gyp (markdown) ([33561e9](https://www.github.com/nodejs/node-gyp/commit/33561e9cbf5f4eb46111318503c77df2c6eb484a))
+* **wiki:** Updated Updating npm's bundled node gyp (markdown) ([4a7f2d0](https://www.github.com/nodejs/node-gyp/commit/4a7f2d0d869a65c99a78504976567017edadf657))
+* **wiki:** Updated Updating npm's bundled node gyp (markdown) ([979a706](https://www.github.com/nodejs/node-gyp/commit/979a7063b950c088a7f4896fc3a48e1d00dfd231))
+* **wiki:** Updated Updating npm's bundled node gyp (markdown) ([e50e04d](https://www.github.com/nodejs/node-gyp/commit/e50e04d7b6a3754ea0aa11fe8cef491b3bc5bdd4))
+
+## [8.1.0](https://www.github.com/nodejs/node-gyp/compare/v8.0.0...v8.1.0) (2021-05-28)
+
+
+### Features
+
+* **gyp:** update gyp to v0.9.1 ([#2402](https://www.github.com/nodejs/node-gyp/issues/2402)) ([814b1b0](https://www.github.com/nodejs/node-gyp/commit/814b1b0eda102afb9fc87e81638a9cf5b650bb10))
+
+
+### Miscellaneous
+
+* add `release-please-action` for automated releases ([#2395](https://www.github.com/nodejs/node-gyp/issues/2395)) ([07e9d7c](https://www.github.com/nodejs/node-gyp/commit/07e9d7c7ee80ba119ea760c635f72fd8e7efe198))
+
+
+### Core
+
+* fail gracefully if we can't find the username ([#2375](https://www.github.com/nodejs/node-gyp/issues/2375)) ([fca4795](https://www.github.com/nodejs/node-gyp/commit/fca4795512c67dc8420aaa0d913b5b89a4b147f3))
+* log as yes/no whether build dir was created ([#2370](https://www.github.com/nodejs/node-gyp/issues/2370)) ([245dee5](https://www.github.com/nodejs/node-gyp/commit/245dee5b62581309946872ae253226ea3a42c0e3))
+
+
+### Doc
+
+* fix v8.0.0 release date ([4b83c3d](https://www.github.com/nodejs/node-gyp/commit/4b83c3de7300457919d53f26d96ea9ad6f6bedd8))
+* remove redundant version info ([#2403](https://www.github.com/nodejs/node-gyp/issues/2403)) ([1423670](https://www.github.com/nodejs/node-gyp/commit/14236709de64b100a424396b91a5115639daa0ef))
+* Update README.md Visual Studio Community page polski to auto ([#2371](https://www.github.com/nodejs/node-gyp/issues/2371)) ([1b4697a](https://www.github.com/nodejs/node-gyp/commit/1b4697abf69ef574a48faf832a7098f4c6c224a5))
+
+## v8.0.0 2021-04-03
+
+* [[`0d8a6f1b19`](https://github.com/nodejs/node-gyp/commit/0d8a6f1b19)] - **ci**: update actions/setup-node to v2 (#2302) (Sora Morimoto) [#2302](https://github.com/nodejs/node-gyp/pull/2302)
+* [[`15a5c7d45b`](https://github.com/nodejs/node-gyp/commit/15a5c7d45b)] - **ci**: migrate deprecated grammar (#2285) (Jiawen Geng) [#2285](https://github.com/nodejs/node-gyp/pull/2285)
+* [[`06ddde27f9`](https://github.com/nodejs/node-gyp/commit/06ddde27f9)] - **deps**: sync mutual dependencies with npm (DeeDeeG) [#2348](https://github.com/nodejs/node-gyp/pull/2348)
+* [[`a5fd1f41e3`](https://github.com/nodejs/node-gyp/commit/a5fd1f41e3)] - **doc**: add downloads badge (#2352) (Jiawen Geng) [#2352](https://github.com/nodejs/node-gyp/pull/2352)
+* [[`cc1cbce056`](https://github.com/nodejs/node-gyp/commit/cc1cbce056)] - **doc**: update macOS\_Catalina.md (#2293) (iMrLopez) [#2293](https://github.com/nodejs/node-gyp/pull/2293)
+* [[`6287118fc4`](https://github.com/nodejs/node-gyp/commit/6287118fc4)] - **doc**: updated README.md to copy easily (#2281) (மனோஜ்குமார் பழனிச்சாமி) [#2281](https://github.com/nodejs/node-gyp/pull/2281)
+* [[`66c0f04467`](https://github.com/nodejs/node-gyp/commit/66c0f04467)] - **doc**: add missing `sudo` to Catalina doc (Karl Horky) [#2244](https://github.com/nodejs/node-gyp/pull/2244)
+* [[`0da2e0140d`](https://github.com/nodejs/node-gyp/commit/0da2e0140d)] - **gyp**: update gyp to v0.8.1 (#2355) (DeeDeeG) [#2355](https://github.com/nodejs/node-gyp/pull/2355)
+* [[`0093ec8646`](https://github.com/nodejs/node-gyp/commit/0093ec8646)] - **gyp**: Improve our flake8 linting tests (Christian Clauss) [#2356](https://github.com/nodejs/node-gyp/pull/2356)
+* [[`a78b584236`](https://github.com/nodejs/node-gyp/commit/a78b584236)] - **(SEMVER-MAJOR)** **gyp**: remove support for Python 2 (#2300) (Christian Clauss) [#2300](https://github.com/nodejs/node-gyp/pull/2300)
+* [[`c3c510d89e`](https://github.com/nodejs/node-gyp/commit/c3c510d89e)] - **gyp**: update gyp to v0.8.0 (#2318) (Christian Clauss) [#2318](https://github.com/nodejs/node-gyp/pull/2318)
+* [[`9e1397c52e`](https://github.com/nodejs/node-gyp/commit/9e1397c52e)] - **(SEMVER-MAJOR)** **gyp**: update gyp to v0.7.0 (#2284) (Jiawen Geng) [#2284](https://github.com/nodejs/node-gyp/pull/2284)
+* [[`1bd18f3e77`](https://github.com/nodejs/node-gyp/commit/1bd18f3e77)] - **(SEMVER-MAJOR)** **lib**: drop Python 2 support in find-python.js (#2333) (DeeDeeG) [#2333](https://github.com/nodejs/node-gyp/pull/2333)
+* [[`e81602ef55`](https://github.com/nodejs/node-gyp/commit/e81602ef55)] - **(SEMVER-MAJOR)** **lib**: migrate requests to fetch (#2220) (Matias Lopez) [#2220](https://github.com/nodejs/node-gyp/pull/2220)
+* [[`392b7760b4`](https://github.com/nodejs/node-gyp/commit/392b7760b4)] - **lib**: avoid changing process.config (#2322) (Michaël Zasso) [#2322](https://github.com/nodejs/node-gyp/pull/2322)
+
+## v7.1.2 2020-10-17
 
 * [[`096e3aded5`](https://github.com/nodejs/node-gyp/commit/096e3aded5)] - **gyp**: update gyp to 0.6.2 (Myles Borins) [#2241](https://github.com/nodejs/node-gyp/pull/2241)
 * [[`54f97cd243`](https://github.com/nodejs/node-gyp/commit/54f97cd243)] - **doc**: add cmd to reset `xcode-select` to initial state (Valera Rozuvan) [#2235](https://github.com/nodejs/node-gyp/pull/2235)
 
-v7.1.1 2020-10-15
-=================
+## v7.1.1 2020-10-15
 
 This release restores the location of shared library builds to the pre-v7
 location. In v7.0.0 until this release, shared library outputs were placed
@@ -22,8 +445,7 @@ We consider this a bug-fix rather than semver-major change.
 * [[`2317dc400c`](https://github.com/nodejs/node-gyp/commit/2317dc400c)] - **ci**: switch to GitHub Actions (Shelley Vohr) [#2210](https://github.com/nodejs/node-gyp/pull/2210)
 * [[`2cca9b74f7`](https://github.com/nodejs/node-gyp/commit/2cca9b74f7)] - **doc**: drop the --production flag for installing windows-build-tools (DeeDeeG) [#2206](https://github.com/nodejs/node-gyp/pull/2206)
 
-v7.1.0 2020-08-12
-=================
+## v7.1.0 2020-08-12
 
 * [[`aaf33c3029`](https://github.com/nodejs/node-gyp/commit/aaf33c3029)] - **build**: add update-gyp script (Samuel Attard) [#2167](https://github.com/nodejs/node-gyp/pull/2167)
 * * [[`3baa4e4172`](https://github.com/nodejs/node-gyp/commit/3baa4e4172)] - **(SEMVER-MINOR)** **gyp**: update gyp to 0.4.0 (Samuel Attard) [#2165](https://github.com/nodejs/node-gyp/pull/2165)
@@ -32,8 +454,7 @@ v7.1.0 2020-08-12
 * * [[`4fc8ff179d`](https://github.com/nodejs/node-gyp/commit/4fc8ff179d)] - **doc**: silence curl for macOS Catalina acid test (Chia Wei Ong) [#2150](https://github.com/nodejs/node-gyp/pull/2150)
 * * [[`7857cb2eb1`](https://github.com/nodejs/node-gyp/commit/7857cb2eb1)] - **deps**: increase "engines" to "node" : "\>= 10.12.0" (DeeDeeG) [#2153](https://github.com/nodejs/node-gyp/pull/2153)
 
-v7.0.0 2020-06-03
-=================
+## v7.0.0 2020-06-03
 
 * [[`e18a61afc1`](https://github.com/nodejs/node-gyp/commit/e18a61afc1)] - **build**: shrink bloated addon binaries on windows (Shelley Vohr) [#2060](https://github.com/nodejs/node-gyp/pull/2060)
 * [[`4937722cf5`](https://github.com/nodejs/node-gyp/commit/4937722cf5)] - **(SEMVER-MAJOR)** **deps**: replace mkdirp with {recursive} mkdir (Rod Vagg) [#2123](https://github.com/nodejs/node-gyp/pull/2123)
@@ -42,7 +463,7 @@ v7.0.0 2020-06-03
 * [[`f7bfce96ed`](https://github.com/nodejs/node-gyp/commit/f7bfce96ed)] - **doc**: update acid test and introduce curl|bash test script (Dario Vladovic) [#2105](https://github.com/nodejs/node-gyp/pull/2105)
 * [[`e529f3309d`](https://github.com/nodejs/node-gyp/commit/e529f3309d)] - **doc**: update README to reflect upgrade to gyp-next (Ujjwal Sharma) [#2092](https://github.com/nodejs/node-gyp/pull/2092)
 * [[`9aed6286a3`](https://github.com/nodejs/node-gyp/commit/9aed6286a3)] - **doc**: give more attention to Catalina issues doc (Matheus Marchini) [#2134](https://github.com/nodejs/node-gyp/pull/2134)
-* [[`963f2a7b48`](https://github.com/nodejs/node-gyp/commit/963f2a7b48)] - **doc**: improve cataline discoverability for search engines (Matheus Marchini) [#2135](https://github.com/nodejs/node-gyp/pull/2135)
+* [[`963f2a7b48`](https://github.com/nodejs/node-gyp/commit/963f2a7b48)] - **doc**: improve Catalina discoverability for search engines (Matheus Marchini) [#2135](https://github.com/nodejs/node-gyp/pull/2135)
 * [[`7b75af349b`](https://github.com/nodejs/node-gyp/commit/7b75af349b)] - **doc**: add macOS Catalina software update info (Karl Horky) [#2078](https://github.com/nodejs/node-gyp/pull/2078)
 * [[`4f23c7bee2`](https://github.com/nodejs/node-gyp/commit/4f23c7bee2)] - **doc**: update link to the code of conduct (#2073) (Michaël Zasso) [#2073](https://github.com/nodejs/node-gyp/pull/2073)
 * [[`473cfa283f`](https://github.com/nodejs/node-gyp/commit/473cfa283f)] - **doc**: note in README that Python 3.8 is supported (#2072) (Michaël Zasso) [#2072](https://github.com/nodejs/node-gyp/pull/2072)
@@ -60,8 +481,7 @@ v7.0.0 2020-06-03
 * [[`741ab096d5`](https://github.com/nodejs/node-gyp/commit/741ab096d5)] - **test**: remove support for EOL versions of Node.js (Shelley Vohr)
 * [[`ca86ef2539`](https://github.com/nodejs/node-gyp/commit/ca86ef2539)] - **test**: bump actions/checkout from v1 to v2 (BSKY) [#2063](https://github.com/nodejs/node-gyp/pull/2063)
 
-v6.1.0 2020-01-08
-=================
+## v6.1.0 2020-01-08
 
 * [[`9a7dd16b76`](https://github.com/nodejs/node-gyp/commit/9a7dd16b76)] - **doc**: remove backticks from Python version list (Rod Vagg) [#2011](https://github.com/nodejs/node-gyp/pull/2011)
 * [[`26cd6eaea6`](https://github.com/nodejs/node-gyp/commit/26cd6eaea6)] - **doc**: add GitHub Actions badge (#1994) (Rod Vagg) [#1994](https://github.com/nodejs/node-gyp/pull/1994)
@@ -82,8 +502,7 @@ v6.1.0 2020-01-08
 * [[`0670e5189d`](https://github.com/nodejs/node-gyp/commit/0670e5189d)] - **test**: add header download test (Rod Vagg) [#1796](https://github.com/nodejs/node-gyp/pull/1796)
 * [[`c506a6a150`](https://github.com/nodejs/node-gyp/commit/c506a6a150)] - **test**: configure proper devDir for invoking configure() (Rod Vagg) [#1796](https://github.com/nodejs/node-gyp/pull/1796)
 
-v6.0.1 2019-11-01
-=================
+## v6.0.1 2019-11-01
 
 * [[`8ec2e681d5`](https://github.com/nodejs/node-gyp/commit/8ec2e681d5)] - **doc**: add macOS\_Catalina.md document (cclauss) [#1940](https://github.com/nodejs/node-gyp/pull/1940)
 * [[`1b11be63cc`](https://github.com/nodejs/node-gyp/commit/1b11be63cc)] - **gyp**: python3 fixes: utf8 decode, use of 'None' in eval (Wilfried Goesgens) [#1925](https://github.com/nodejs/node-gyp/pull/1925)
@@ -100,8 +519,7 @@ v6.0.1 2019-11-01
 * [[`032db2a2d0`](https://github.com/nodejs/node-gyp/commit/032db2a2d0)] - **lib,install**: always download SHA sums on Windows (Sam Hughes) [#1926](https://github.com/nodejs/node-gyp/pull/1926)
 * [[`5a83630c33`](https://github.com/nodejs/node-gyp/commit/5a83630c33)] - **travis**: add Windows + Python 3.8 to the mix (Rod Vagg) [#1921](https://github.com/nodejs/node-gyp/pull/1921)
 
-v6.0.0 2019-10-04
-=================
+## v6.0.0 2019-10-04
 
 * [[`dd0e97ef0b`](https://github.com/nodejs/node-gyp/commit/dd0e97ef0b)] - **(SEMVER-MAJOR)** **lib**: try to find `python` after `python3` (Sam Roberts) [#1907](https://github.com/nodejs/node-gyp/pull/1907)
 * [[`f60ed47d14`](https://github.com/nodejs/node-gyp/commit/f60ed47d14)] - **travis**: add Python 3.5 and 3.6 tests on Linux (Christian Clauss) [#1903](https://github.com/nodejs/node-gyp/pull/1903)
@@ -109,8 +527,7 @@ v6.0.0 2019-10-04
 * [[`3d1c60ab81`](https://github.com/nodejs/node-gyp/commit/3d1c60ab81)] - **(SEMVER-MAJOR)** **lib**: accept Python 3 by default (João Reis) [#1844](https://github.com/nodejs/node-gyp/pull/1844)
 * [[`c6e3b65a23`](https://github.com/nodejs/node-gyp/commit/c6e3b65a23)] - **(SEMVER-MAJOR)** **lib**: raise the minimum Python version from 2.6 to 2.7 (cclauss) [#1818](https://github.com/nodejs/node-gyp/pull/1818)
 
-v5.1.1 2020-05-25
-=================
+## v5.1.1 2020-05-25
 
 * [[`bdd3a79abe`](https://github.com/nodejs/node-gyp/commit/bdd3a79abe)] - **build**: shrink bloated addon binaries on windows (Shelley Vohr) [#2060](https://github.com/nodejs/node-gyp/pull/2060)
 * [[`1f2ba75bc0`](https://github.com/nodejs/node-gyp/commit/1f2ba75bc0)] - **doc**: add macOS Catalina software update info (Karl Horky) [#2078](https://github.com/nodejs/node-gyp/pull/2078)
@@ -123,8 +540,7 @@ v5.1.1 2020-05-25
 * [[`2b6fc3c8d6`](https://github.com/nodejs/node-gyp/commit/2b6fc3c8d6)] - **doc, bin**: stop suggesting opening  node-gyp issues (Bartosz Sosnowski) [#2096](https://github.com/nodejs/node-gyp/pull/2096)
 * [[`a876ae58ad`](https://github.com/nodejs/node-gyp/commit/a876ae58ad)] - **test**: bump actions/checkout from v1 to v2 (BSKY) [#2063](https://github.com/nodejs/node-gyp/pull/2063)
 
-v5.1.0 2020-02-05
-=================
+## v5.1.0 2020-02-05
 
 * [[`f37a8b40d0`](https://github.com/nodejs/node-gyp/commit/f37a8b40d0)] - **doc**: add GitHub Actions badge (#1994) (Rod Vagg) [#1994](https://github.com/nodejs/node-gyp/pull/1994)
 * [[`cb3f6aae5e`](https://github.com/nodejs/node-gyp/commit/cb3f6aae5e)] - **doc**: update macOS\_Catalina.md (#1992) (James Home) [#1992](https://github.com/nodejs/node-gyp/pull/1992)
@@ -141,13 +557,11 @@ v5.1.0 2020-02-05
 * [[`32c8744b34`](https://github.com/nodejs/node-gyp/commit/32c8744b34)] - **test**: fix macOS Travis on Python 2.7 & 3.7 (Christian Clauss) [#1979](https://github.com/nodejs/node-gyp/pull/1979)
 * [[`fd4b1351e4`](https://github.com/nodejs/node-gyp/commit/fd4b1351e4)] - **test**: initial Github Actions with Ubuntu & macOS (Christian Clauss) [#1985](https://github.com/nodejs/node-gyp/pull/1985)
 
-v5.0.7 2019-12-16
-=================
+## v5.0.7 2019-12-16
 
 Republish of v5.0.6 with unnecessary tarball removed from pack file.
 
-v5.0.6 2019-12-16
-=================
+## v5.0.6 2019-12-16
 
 * [[`cdec00286f`](https://github.com/nodejs/node-gyp/commit/cdec00286f)] - **doc**: adjustments to the README.md for new users (Dan Pike) [#1919](https://github.com/nodejs/node-gyp/pull/1919)
 * [[`b7c8233ef2`](https://github.com/nodejs/node-gyp/commit/b7c8233ef2)] - **test**: fix Python unittests (cclauss) [#1961](https://github.com/nodejs/node-gyp/pull/1961)
@@ -168,8 +582,7 @@ v5.0.6 2019-12-16
 * [[`7edf7658fa`](https://github.com/nodejs/node-gyp/commit/7edf7658fa)] - **lib,install**: always download SHA sums on Windows (Sam Hughes) [#1926](https://github.com/nodejs/node-gyp/pull/1926)
 * [[`69056d04fe`](https://github.com/nodejs/node-gyp/commit/69056d04fe)] - **travis**: add Windows + Python 3.8 to the mix (Rod Vagg) [#1921](https://github.com/nodejs/node-gyp/pull/1921)
 
-v5.0.5 2019-10-04
-=================
+## v5.0.5 2019-10-04
 
 * [[`3891391746`](https://github.com/nodejs/node-gyp/commit/3891391746)] - **doc**: reconcile README with Python 3 compat changes (Rod Vagg) [#1911](https://github.com/nodejs/node-gyp/pull/1911)
 * [[`07f81f1920`](https://github.com/nodejs/node-gyp/commit/07f81f1920)] - **lib**: accept Python 3 after Python 2 (Sam Roberts) [#1910](https://github.com/nodejs/node-gyp/pull/1910)
@@ -181,8 +594,7 @@ v5.0.5 2019-10-04
 * [[`53ee7dfe89`](https://github.com/nodejs/node-gyp/commit/53ee7dfe89)] - **gyp**: fix undefined name: cflags --\> ldflags (Christian Clauss) [#1901](https://github.com/nodejs/node-gyp/pull/1901)
 * [[`5871dcf6c9`](https://github.com/nodejs/node-gyp/commit/5871dcf6c9)] - **src,win**: add support for fetching arm64 node.lib (Richard Townsend) [#1875](https://github.com/nodejs/node-gyp/pull/1875)
 
-v5.0.4 2019-09-27
-=================
+## v5.0.4 2019-09-27
 
 * [[`1236869ffc`](https://github.com/nodejs/node-gyp/commit/1236869ffc)] - **gyp**: modify XcodeVersion() to convert "4.2" to "0420" and "10.0" to "1000" (Christian Clauss) [#1895](https://github.com/nodejs/node-gyp/pull/1895)
 * [[`36638afe48`](https://github.com/nodejs/node-gyp/commit/36638afe48)] - **gyp**: more decode stdout on Python 3 (cclauss) [#1894](https://github.com/nodejs/node-gyp/pull/1894)
@@ -205,8 +617,7 @@ v5.0.4 2019-09-27
 * [[`fa0ed4aa42`](https://github.com/nodejs/node-gyp/commit/fa0ed4aa42)] - **build**: more Python 3 compat, replace compile with ast (cclauss) [#1820](https://github.com/nodejs/node-gyp/pull/1820)
 * [[`18d5c7c9d0`](https://github.com/nodejs/node-gyp/commit/18d5c7c9d0)] - **win,src**: update win\_delay\_load\_hook.cc to work with /clr (Ivan Petrovic) [#1819](https://github.com/nodejs/node-gyp/pull/1819)
 
-v5.0.3 2019-07-17
-=================
+## v5.0.3 2019-07-17
 
 * [[`66ad305775`](https://github.com/nodejs/node-gyp/commit/66ad305775)] - **python**: accept Python 3 conditionally (João Reis) [#1815](https://github.com/nodejs/node-gyp/pull/1815)
 * [[`7e7fce3fed`](https://github.com/nodejs/node-gyp/commit/7e7fce3fed)] - **python**: move Python detection to its own file (João Reis) [#1815](https://github.com/nodejs/node-gyp/pull/1815)
@@ -217,8 +628,7 @@ v5.0.3 2019-07-17
 * [[`24109148df`](https://github.com/nodejs/node-gyp/commit/24109148df)] - **test**: downgrade to tap@^12 for continued Node 6 support (Rod Vagg) [#1808](https://github.com/nodejs/node-gyp/pull/1808)
 * [[`656117cc4a`](https://github.com/nodejs/node-gyp/commit/656117cc4a)] - **win**: make VS path match case-insensitive (João Reis) [#1806](https://github.com/nodejs/node-gyp/pull/1806)
 
-v5.0.2 2019-06-27
-=================
+## v5.0.2 2019-06-27
 
 * [[`2761afbf73`](https://github.com/nodejs/node-gyp/commit/2761afbf73)] - **build,test**: add duplicate symbol test (Gabriel Schulhof) [#1689](https://github.com/nodejs/node-gyp/pull/1689)
 * [[`82f129d6de`](https://github.com/nodejs/node-gyp/commit/82f129d6de)] - **gyp**: replace optparse to argparse (KiYugadgeter) [#1591](https://github.com/nodejs/node-gyp/pull/1591)
@@ -237,14 +647,12 @@ v5.0.2 2019-06-27
 * [[`1597c84aad`](https://github.com/nodejs/node-gyp/commit/1597c84aad)] - **test**: use Travis CI to run tests on every pull request (cclauss) [#1752](https://github.com/nodejs/node-gyp/pull/1752)
 * [[`dd9bf929ac`](https://github.com/nodejs/node-gyp/commit/dd9bf929ac)] - **zos**: update compiler options (Shuowang (Wayne) Zhang) [#1768](https://github.com/nodejs/node-gyp/pull/1768)
 
-v5.0.1 2019-06-20
-=================
+## v5.0.1 2019-06-20
 
 * [[`e3861722ed`](https://github.com/nodejs/node-gyp/commit/e3861722ed)] - **doc**: document --jobs max (David Sanders) [#1770](https://github.com/nodejs/node-gyp/pull/1770)
 * [[`1cfdb28886`](https://github.com/nodejs/node-gyp/commit/1cfdb28886)] - **lib**: reintroduce support for iojs file naming for releases \>= 1 && \< 4 (Samuel Attard) [#1777](https://github.com/nodejs/node-gyp/pull/1777)
 
-v5.0.0 2019-06-13
-=================
+## v5.0.0 2019-06-13
 
 * [[`8a83972743`](https://github.com/nodejs/node-gyp/commit/8a83972743)] - **(SEMVER-MAJOR)** **bin**: follow XDG OS conventions for storing data (Selwyn) [#1570](https://github.com/nodejs/node-gyp/pull/1570)
 * [[`9e46872ea3`](https://github.com/nodejs/node-gyp/commit/9e46872ea3)] - **bin,lib**: remove extra comments/lines/spaces (Jon Moss) [#1508](https://github.com/nodejs/node-gyp/pull/1508)
@@ -282,16 +690,14 @@ v5.0.0 2019-06-13
 * [[`721dc7d314`](https://github.com/nodejs/node-gyp/commit/721dc7d314)] - Add ARM64 to MSBuild /Platform logic (Jon Kunkee) [#1655](https://github.com/nodejs/node-gyp/pull/1655)
 * [[`a5b7410497`](https://github.com/nodejs/node-gyp/commit/a5b7410497)] - Add ESLint no-unused-vars rule (Jon Moss) [#1497](https://github.com/nodejs/node-gyp/pull/1497)
 
-v4.0.0 2019-04-24
-=================
+## v4.0.0 2019-04-24
 
 * [[`ceed5cbe10`](https://github.com/nodejs/node-gyp/commit/ceed5cbe10)] - **deps**: updated tar package version to 4.4.8 (Pobegaylo Maksim) [#1713](https://github.com/nodejs/node-gyp/pull/1713)
 * [[`374519e066`](https://github.com/nodejs/node-gyp/commit/374519e066)] - **(SEMVER-MAJOR)** Upgrade to tar v3 (isaacs) [#1212](https://github.com/nodejs/node-gyp/pull/1212)
 * [[`e6699d13cd`](https://github.com/nodejs/node-gyp/commit/e6699d13cd)] - **test**: fix addon test for Node.js 12 and V8 7.4 (Richard Lau) [#1705](https://github.com/nodejs/node-gyp/pull/1705)
 * [[`0c6bf530a0`](https://github.com/nodejs/node-gyp/commit/0c6bf530a0)] - **lib**: use print() for python version detection (GreenAddress) [#1534](https://github.com/nodejs/node-gyp/pull/1534)
 
-v3.8.0 2018-08-09
-=================
+## v3.8.0 2018-08-09
 
 * [[`c5929cb4fe`](https://github.com/nodejs/node-gyp/commit/c5929cb4fe)] - **doc**: update Xcode preferences tab name. (Ivan Daniluk) [#1330](https://github.com/nodejs/node-gyp/pull/1330)
 * [[`8b488da8b9`](https://github.com/nodejs/node-gyp/commit/8b488da8b9)] - **doc**: update link to commit guidelines (Jonas Hermsmeier) [#1456](https://github.com/nodejs/node-gyp/pull/1456)
@@ -310,8 +716,7 @@ v3.8.0 2018-08-09
 * [[`969447c5bd`](https://github.com/nodejs/node-gyp/commit/969447c5bd)] - **deps**: bump request to 2.8.7, fixes heok/hawk issues (Rohit Hazra) [#1492](https://github.com/nodejs/node-gyp/pull/1492)
 * [[`340403ccfe`](https://github.com/nodejs/node-gyp/commit/340403ccfe)] - **win**: improve parsing of SDK version (Alessandro Vergani) [#1516](https://github.com/nodejs/node-gyp/pull/1516)
 
-v3.7.0 2018-06-08
-=================
+## v3.7.0 2018-06-08
 
 * [[`84cea7b30d`](https://github.com/nodejs/node-gyp/commit/84cea7b30d)] - Remove unused gyp test scripts. (Ben Noordhuis) [#1458](https://github.com/nodejs/node-gyp/pull/1458)
 * [[`0540e4ec63`](https://github.com/nodejs/node-gyp/commit/0540e4ec63)] - **gyp**: escape spaces in filenames in make generator (Jeff Senn) [#1436](https://github.com/nodejs/node-gyp/pull/1436)
@@ -335,14 +740,12 @@ v3.7.0 2018-06-08
 * [[`f27599193a`](https://github.com/nodejs/node-gyp/commit/f27599193a)] - **gyp**: update xml string encoding conversion (Liu Chao) [#1203](https://github.com/nodejs/node-gyp/pull/1203)
 * [[`0a07e481f7`](https://github.com/nodejs/node-gyp/commit/0a07e481f7)] - **configure**: don't set ensure if tarball is set (Gibson Fahnestock) [#1220](https://github.com/nodejs/node-gyp/pull/1220)
 
-v3.6.3 2018-06-08
-=================
+## v3.6.3 2018-06-08
 
 * [[`90cd2e8da9`](https://github.com/nodejs/node-gyp/commit/90cd2e8da9)] - **gyp**: fix regex to match multi-digit versions (Jonas Hermsmeier) [#1455](https://github.com/nodejs/node-gyp/pull/1455)
 * [[`7900122337`](https://github.com/nodejs/node-gyp/commit/7900122337)] - deps: pin `request` version range (Refael Ackerman) [#1300](https://github.com/nodejs/node-gyp/pull/1300)
 
-v3.6.2 2017-06-01
-=================
+## v3.6.2 2017-06-01
 
 * [[`72afdd62cd`](https://github.com/nodejs/node-gyp/commit/72afdd62cd)] - **build**: rename copyNodeLib() to doBuild() (Liu Chao) [#1206](https://github.com/nodejs/node-gyp/pull/1206)
 * [[`bad903ac70`](https://github.com/nodejs/node-gyp/commit/bad903ac70)] - **win**: more robust parsing of SDK version (Refael Ackermann) [#1198](https://github.com/nodejs/node-gyp/pull/1198)
@@ -351,8 +754,7 @@ v3.6.2 2017-06-01
 * [[`0913b2dd99`](https://github.com/nodejs/node-gyp/commit/0913b2dd99)] - **build, win**: use target_arch to link with node.lib (Pavel Medvedev) [#964](https://github.com/nodejs/node-gyp/pull/964)
 * [[`c307b302f7`](https://github.com/nodejs/node-gyp/commit/c307b302f7)] - **doc**: blorb about setting `npm_config_OPTION_NAME` (Refael Ackermann) [#1185](https://github.com/nodejs/node-gyp/pull/1185)
 
-v3.6.1 2017-04-30
-=================
+## v3.6.1 2017-04-30
 
 * [[`49801716c2`](https://github.com/nodejs/node-gyp/commit/49801716c2)] - **test**: fix test-find-python on v0.10.x buildbot. (Ben Noordhuis) [#1172](https://github.com/nodejs/node-gyp/pull/1172)
 * [[`a83a3801fc`](https://github.com/nodejs/node-gyp/commit/a83a3801fc)] - **test**: fix test/test-configure-python on AIX (Richard Lau) [#1131](https://github.com/nodejs/node-gyp/pull/1131)
@@ -360,8 +762,7 @@ v3.6.1 2017-04-30
 * [[`c09cf7671e`](https://github.com/nodejs/node-gyp/commit/c09cf7671e)] - **doc**: add a note for using `configure` on Windows (Vse Mozhet Byt) [#1152](https://github.com/nodejs/node-gyp/pull/1152)
 * [[`da9cb5f411`](https://github.com/nodejs/node-gyp/commit/da9cb5f411)] - Delete superfluous .patch files. (Ben Noordhuis) [#1122](https://github.com/nodejs/node-gyp/pull/1122)
 
-v3.6.0 2017-03-16
-=================
+## v3.6.0 2017-03-16
 
 * [[`ae141e1906`](https://github.com/nodejs/node-gyp/commit/ae141e1906)] - **win**: find and setup for VS2017 (Refael Ackermann) [#1130](https://github.com/nodejs/node-gyp/pull/1130)
 * [[`ec5fc36a80`](https://github.com/nodejs/node-gyp/commit/ec5fc36a80)] - Add support to build node.js with chakracore for ARM. (Kunal Pathak) [#873](https://github.com/nodejs/node-gyp/pull/873)
@@ -369,9 +770,7 @@ v3.6.0 2017-03-16
 * [[`93d7fa83c8`](https://github.com/nodejs/node-gyp/commit/93d7fa83c8)] - Upgrade semver dependency. (Ben Noordhuis) [#1107](https://github.com/nodejs/node-gyp/pull/1107)
 * [[`ff9a6fadfd`](https://github.com/nodejs/node-gyp/commit/ff9a6fadfd)] - Update link of gyp as Google code is shutting down (Peter Dave Hello) [#1061](https://github.com/nodejs/node-gyp/pull/1061)
 
-
-v3.5.0 2017-01-10
-=================
+## v3.5.0 2017-01-10
 
 * [[`762d19a39e`](https://github.com/nodejs/node-gyp/commit/762d19a39e)] - \[doc\] merge History.md and CHANGELOG.md (Rod Vagg) 
 * [[`80fc5c3d31`](https://github.com/nodejs/node-gyp/commit/80fc5c3d31)] - Fix deprecated dependency warning (Simone Primarosa) [#1069](https://github.com/nodejs/node-gyp/pull/1069)
@@ -385,8 +784,7 @@ v3.5.0 2017-01-10
 * [[`9c8d275526`](https://github.com/nodejs/node-gyp/commit/9c8d275526)] - Add --devdir flag. (Ben Noordhuis) [#916](https://github.com/nodejs/node-gyp/pull/916)
 * [[`f6eab1f9e4`](https://github.com/nodejs/node-gyp/commit/f6eab1f9e4)] - **doc**: add windows-build-tools to readme (Felix Rieseberg) [#970](https://github.com/nodejs/node-gyp/pull/970)
 
-v3.4.0 2016-06-28
-=================
+## v3.4.0 2016-06-28
 
 * [[`ce5fd04e94`](https://github.com/nodejs/node-gyp/commit/ce5fd04e94)] - **deps**: update minimatch version (delphiactual) [#961](https://github.com/nodejs/node-gyp/pull/961)
 * [[`77383ddd85`](https://github.com/nodejs/node-gyp/commit/77383ddd85)] - Replace fs.accessSync call to fs.statSync (Richard Lau) [#955](https://github.com/nodejs/node-gyp/pull/955)
@@ -406,13 +804,11 @@ v3.4.0 2016-06-28
 * [[`625c1515f9`](https://github.com/nodejs/node-gyp/commit/625c1515f9)] - **gyp**: inherit CC/CXX for CC/CXX.host (Johan Bergström) [#908](https://github.com/nodejs/node-gyp/pull/908)
 * [[`3bcb1720e4`](https://github.com/nodejs/node-gyp/commit/3bcb1720e4)] - Add support for the Python launcher on Windows (Patrick Westerhoff) [#894](https://github.com/nodejs/node-gyp/pull/894
 
-v3.3.1 2016-03-04
-=================
+## v3.3.1 2016-03-04
 
 * [[`a981ef847a`](https://github.com/nodejs/node-gyp/commit/a981ef847a)] - **gyp**: fix android generator (Robert Chiras) [#889](https://github.com/nodejs/node-gyp/pull/889)
 
-v3.3.0 2016-02-16
-=================
+## v3.3.0 2016-02-16
 
 * [[`818d854a4d`](https://github.com/nodejs/node-gyp/commit/818d854a4d)] - Introduce NODEJS_ORG_MIRROR and IOJS_ORG_MIRROR (Rod Vagg) [#878](https://github.com/nodejs/node-gyp/pull/878)
 * [[`d1e4cc4b62`](https://github.com/nodejs/node-gyp/commit/d1e4cc4b62)] - **(SEMVER-MINOR)** Download headers tarball for ~0.12.10 || ~0.10.42 (Rod Vagg) [#877](https://github.com/nodejs/node-gyp/pull/877)
@@ -421,14 +817,12 @@ v3.3.0 2016-02-16
 * [[`8c4b0ffa50`](https://github.com/nodejs/node-gyp/commit/8c4b0ffa50)] - **(SEMVER-MINOR)** Add --cafile command line option. (Ben Noordhuis) [#837](https://github.com/nodejs/node-gyp/pull/837)
 * [[`b3ad43498e`](https://github.com/nodejs/node-gyp/commit/b3ad43498e)] - **(SEMVER-MINOR)** Make download() function testable. (Ben Noordhuis) [#837](https://github.com/nodejs/node-gyp/pull/837)
 
-v3.2.1 2015-12-03
-=================
+## v3.2.1 2015-12-03
 
 * [[`ab89b477c4`](https://github.com/nodejs/node-gyp/commit/ab89b477c4)] - Upgrade gyp to b3cef02. (Ben Noordhuis) [#831](https://github.com/nodejs/node-gyp/pull/831)
 * [[`90078ecb17`](https://github.com/nodejs/node-gyp/commit/90078ecb17)] - Define WIN32_LEAN_AND_MEAN conditionally. (Ben Noordhuis) [#824](https://github.com/nodejs/node-gyp/pull/824)
 
-v3.2.0 2015-11-25
-=================
+## v3.2.0 2015-11-25
 
 * [[`268f1ca4c7`](https://github.com/nodejs/node-gyp/commit/268f1ca4c7)] - Use result of `which` when searching for python. (Refael Ackermann) [#668](https://github.com/nodejs/node-gyp/pull/668)
 * [[`817ed9bd78`](https://github.com/nodejs/node-gyp/commit/817ed9bd78)] - Add test for python executable search logic. (Ben Noordhuis) [#756](https://github.com/nodejs/node-gyp/pull/756)
@@ -437,8 +831,7 @@ v3.2.0 2015-11-25
 * [[`a8d441a0a2`](https://github.com/nodejs/node-gyp/commit/a8d441a0a2)] - Update README for Windows 10 support. (Jason Williams) [#766](https://github.com/nodejs/node-gyp/pull/766)
 * [[`d1d6015276`](https://github.com/nodejs/node-gyp/commit/d1d6015276)] - Update broken links and switch to HTTPS. (andrew morton) 
 
-v3.1.0 2015-11-14
-=================
+## v3.1.0 2015-11-14
 
 * [[`9049241f91`](https://github.com/nodejs/node-gyp/commit/9049241f91)] - **gyp**: don't use links at all, just copy the files instead (Nathan Zadoks)
 * [[`8ef90348d1`](https://github.com/nodejs/node-gyp/commit/8ef90348d1)] - **gyp**: apply https://codereview.chromium.org/11361103/ (Nathan Rajlich)
@@ -448,24 +841,20 @@ v3.1.0 2015-11-14
 * [[`2ac7de02c4`](https://github.com/nodejs/node-gyp/commit/2ac7de02c4)] - Fix infinite loop with zero-length options. (Ben Noordhuis) [#745](https://github.com/nodejs/node-gyp/pull/745)
 * [[`101bed639b`](https://github.com/nodejs/node-gyp/commit/101bed639b)] - This platform value came from debian package, and now the value (Jérémy Lal) [#738](https://github.com/nodejs/node-gyp/pull/738)
 
-v3.0.3 2015-09-14
-=================
+## v3.0.3 2015-09-14
 
 * [[`ad827cda30`](https://github.com/nodejs/node-gyp/commit/ad827cda30)] - tarballUrl global and && when checking for iojs (Lars-Magnus Skog) [#729](https://github.com/nodejs/node-gyp/pull/729)
 
-v3.0.2 2015-09-12
-=================
+## v3.0.2 2015-09-12
 
 * [[`6e8c3bf3c6`](https://github.com/nodejs/node-gyp/commit/6e8c3bf3c6)] - add back support for passing additional cmdline args (Rod Vagg) [#723](https://github.com/nodejs/node-gyp/pull/723)
 * [[`ff82f2f3b9`](https://github.com/nodejs/node-gyp/commit/ff82f2f3b9)] - fixed broken link in docs to Visual Studio 2013 download (simon-p-r) [#722](https://github.com/nodejs/node-gyp/pull/722)
 
-v3.0.1 2015-09-08
-=================
+## v3.0.1 2015-09-08
 
 * [[`846337e36b`](https://github.com/nodejs/node-gyp/commit/846337e36b)] - normalise versions for target == this comparison (Rod Vagg) [#716](https://github.com/nodejs/node-gyp/pull/716)
 
-v3.0.0 2015-09-08
-=================
+## v3.0.0 2015-09-08
 
 * [[`9720d0373c`](https://github.com/nodejs/node-gyp/commit/9720d0373c)] - remove node_modules from tree (Rod Vagg) [#711](https://github.com/nodejs/node-gyp/pull/711)
 * [[`6dcf220db7`](https://github.com/nodejs/node-gyp/commit/6dcf220db7)] - test version major directly, don't use semver.satisfies() (Rod Vagg) [#711](https://github.com/nodejs/node-gyp/pull/711)
@@ -477,8 +866,7 @@ v3.0.0 2015-09-08
 * [[`85ed107565`](https://github.com/nodejs/node-gyp/commit/85ed107565)] - Merge pull request #664 from othiym23/othiym23/allow-semver-5 (Nathan Rajlich)
 * [[`0c720d234c`](https://github.com/nodejs/node-gyp/commit/0c720d234c)] - allow semver@5 (Forrest L Norvell)
 
-2.0.2 / 2015-07-14
-==================
+## 2.0.2 / 2015-07-14
 
   * Use HTTPS for dist url (#656, @SonicHedgehog)
   * Merge pull request #648 from nevosegal/master
@@ -491,14 +879,12 @@ v3.0.0 2015-09-08
     src/win_delay_load_hook.c, and fixes of the long relative path issue on Win32.
     Fixes #636 (#637, @lygstate).
 
-2.0.1 / 2015-05-28
-==================
+## 2.0.1 / 2015-05-28
 
   * configure: try/catch the semver range.test() call
   * README: update for visual studio 2013 (#510, @samccone)
 
-2.0.0 / 2015-05-24
-==================
+## 2.0.0 / 2015-05-24
 
   * configure: check for python2 executable by default, fallback to python
   * configure: don't clobber existing $PYTHONPATH
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/CONTRIBUTING.md b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/CONTRIBUTING.md
similarity index 94%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/CONTRIBUTING.md
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/CONTRIBUTING.md
index c1c50eab..5b977898 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/CONTRIBUTING.md
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/CONTRIBUTING.md
@@ -3,7 +3,7 @@
 ## Code of Conduct
 
 Please read the
-[Code of Conduct](https://github.com/nodejs/admin/blob/master/CODE_OF_CONDUCT.md)
+[Code of Conduct](https://github.com/nodejs/admin/blob/main/CODE_OF_CONDUCT.md)
 which explains the minimum behavior expectations for node-gyp contributors.
 
 <a id="developers-certificate-of-origin"></a>
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/LICENSE b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/LICENSE
similarity index 100%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/LICENSE
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/LICENSE
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/README.md b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/README.md
similarity index 65%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/README.md
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/README.md
index e06b01a7..f46ee063 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/README.md
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/README.md
@@ -1,11 +1,13 @@
 # `node-gyp` - Node.js native addon build tool
 
-[![Build Status](https://github.com/nodejs/node-gyp/workflows/Tests/badge.svg?branch=master)](https://github.com/nodejs/node-gyp/actions?query=workflow%3ATests+branch%3Amaster)
+[![Build Status](https://github.com/nodejs/node-gyp/workflows/Tests/badge.svg?branch=main)](https://github.com/nodejs/node-gyp/actions?query=workflow%3ATests+branch%3Amain)
+![npm](https://img.shields.io/npm/dm/node-gyp)
 
 `node-gyp` is a cross-platform command-line tool written in Node.js for
 compiling native addon modules for Node.js. It contains a vendored copy of the
 [gyp-next](https://github.com/nodejs/gyp-next) project that was previously used
-by the Chromium team, extended to support the development of Node.js native addons.
+by the Chromium team and extended to support the development of Node.js native
+addons.
 
 Note that `node-gyp` is _not_ used to build Node.js itself.
 
@@ -23,92 +25,108 @@ etc.), regardless of what version of Node.js is actually installed on your syste
 You can install `node-gyp` using `npm`:
 
 ``` bash
-$ npm install -g node-gyp
+npm install -g node-gyp
 ```
 
 Depending on your operating system, you will need to install:
 
 ### On Unix
 
-   * Python v2.7, v3.5, v3.6, v3.7, or v3.8
+   * [A supported version of Python](https://devguide.python.org/versions/)
    * `make`
    * A proper C/C++ compiler toolchain, like [GCC](https://gcc.gnu.org)
 
 ### On macOS
 
-**ATTENTION**: If your Mac has been _upgraded_ to macOS Catalina (10.15), please read [macOS_Catalina.md](macOS_Catalina.md).
+   * [A supported version of Python](https://devguide.python.org/versions/)
+   * `Xcode Command Line Tools` which will install `clang`, `clang++`, and `make`.
+     * Install the `Xcode Command Line Tools` standalone by running `xcode-select --install`. -- OR --
+     * Alternatively, if you already have the [full Xcode installed](https://developer.apple.com/xcode/download/), you can install the Command Line Tools under the menu `Xcode -> Open Developer Tool -> More Developer Tools...`.
 
-   * Python v2.7, v3.5, v3.6, v3.7, or v3.8
-   * [Xcode](https://developer.apple.com/xcode/download/)
-     * You also need to install the `XCode Command Line Tools` by running `xcode-select --install`. Alternatively, if you already have the full Xcode installed, you can find them under the menu `Xcode -> Open Developer Tool -> More Developer Tools...`. This step will install `clang`, `clang++`, and `make`.
 
 ### On Windows
 
-Install the current version of Python from the [Microsoft Store package](https://docs.python.org/3/using/windows.html#the-microsoft-store-package).
-
-#### Option 1
-
-Install all the required tools and configurations using Microsoft's [windows-build-tools](https://github.com/felixrieseberg/windows-build-tools) using `npm install --global windows-build-tools` from an elevated PowerShell or CMD.exe (run as Administrator).
-
-#### Option 2
+Install the current [version of Python](https://devguide.python.org/versions/) from the
+[Microsoft Store](https://apps.microsoft.com/store/search?publisher=Python+Software+Foundation).
 
 Install tools and configuration manually:
    * Install Visual C++ Build Environment: [Visual Studio Build Tools](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools)
-   (using "Visual C++ build tools" workload) or [Visual Studio 2017 Community](https://visualstudio.microsoft.com/pl/thank-you-downloading-visual-studio/?sku=Community)
+   (using "Visual C++ build tools" if using a version older than VS2019, otherwise use "Desktop development with C++" workload) or [Visual Studio Community](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community)
    (using the "Desktop development with C++" workload)
-   * Launch cmd, `npm config set msvs_version 2017`
 
    If the above steps didn't work for you, please visit [Microsoft's Node.js Guidelines for Windows](https://github.com/Microsoft/nodejs-guidelines/blob/master/windows-environment.md#compiling-native-addon-modules) for additional tips.
 
-   To target native ARM64 Node.js on Windows 10 on ARM, add the components "Visual C++ compilers and libraries for ARM64" and "Visual C++ ATL for ARM64".
+   To target native ARM64 Node.js on Windows on ARM, add the components "Visual C++ compilers and libraries for ARM64" and "Visual C++ ATL for ARM64".
+
+   To use the native ARM64 C++ compiler on Windows on ARM, ensure that you have Visual Studio 2022 [17.4 or later](https://devblogs.microsoft.com/visualstudio/arm64-visual-studio-is-officially-here/) installed.
 
 ### Configuring Python Dependency
 
-`node-gyp` requires that you have installed a compatible version of Python, one of: v2.7, v3.5, v3.6,
-v3.7, or v3.8. If you have multiple Python versions installed, you can identify which Python
-version `node-gyp` should use in one of the following ways:
+`node-gyp` requires that you have installed a [supported version of Python](https://devguide.python.org/versions/).
+If you have multiple versions of Python installed, you can identify which version
+`node-gyp` should use in one of the following ways:
 
 1. by setting the `--python` command-line option, e.g.:
 
 ``` bash
-$ node-gyp <command> --python /path/to/executable/python
+node-gyp <command> --python /path/to/executable/python
 ```
 
 2. If `node-gyp` is called by way of `npm`, *and* you have multiple versions of
-Python installed, then you can set `npm`'s 'python' config key to the appropriate
-value:
-
+Python installed, then you can set the `npm_config_python` environment variable
+to the appropriate path:
 ``` bash
-$ npm config set python /path/to/executable/python
+export npm_config_python=/path/to/executable/python
+```
+&nbsp;&nbsp;&nbsp;&nbsp;Or on Windows:
+```console
+py --list-paths  # To see the installed Python versions
+set npm_config_python=C:\path\to\python.exe
 ```
 
 3. If the `PYTHON` environment variable is set to the path of a Python executable,
-then that version will be used, if it is a compatible version.
+then that version will be used if it is a supported version.
 
 4. If the `NODE_GYP_FORCE_PYTHON` environment variable is set to the path of a
 Python executable, it will be used instead of any of the other configured or
-builtin Python search paths. If it's not a compatible version, no further
+built-in Python search paths. If it's not a compatible version, no further
 searching will be done.
 
+### Build for Third Party Node.js Runtimes
+
+When building modules for third-party Node.js runtimes like Electron, which have
+different build configurations from the official Node.js distribution, you
+should use `--dist-url` or `--nodedir` flags to specify the headers of the
+runtime to build for.
+
+Also when `--dist-url` or `--nodedir` flags are passed, node-gyp will use the
+`config.gypi` shipped in the headers distribution to generate build
+configurations, which is different from the default mode that would use the
+`process.config` object of the running Node.js instance.
+
+Some old versions of Electron shipped malformed `config.gypi` in their headers
+distributions, and you might need to pass `--force-process-config` to node-gyp
+to work around configuration errors.
+
 ## How to Use
 
-To compile your native addon, first go to its root directory:
+To compile your native addon first go to its root directory:
 
 ``` bash
-$ cd my_node_addon
+cd my_node_addon
 ```
 
 The next step is to generate the appropriate project build files for the current
 platform. Use `configure` for that:
 
 ``` bash
-$ node-gyp configure
+node-gyp configure
 ```
 
 Auto-detection fails for Visual C++ Build Tools 2015, so `--msvs_version=2015`
 needs to be added (not needed when run by npm as configured above):
 ``` bash
-$ node-gyp configure --msvs_version=2015
+node-gyp configure --msvs_version=2015
 ```
 
 __Note__: The `configure` step looks for a `binding.gyp` file in the current
@@ -118,7 +136,7 @@ Now you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file
 (on Windows) in the `build/` directory. Next, invoke the `build` command:
 
 ``` bash
-$ node-gyp build
+node-gyp build
 ```
 
 Now you have your compiled `.node` bindings file! The compiled bindings end up
@@ -149,13 +167,15 @@ A barebones `gyp` file appropriate for building a Node.js addon could look like:
 
 ## Further reading
 
+The **[docs](./docs/)** directory contains additional documentation on specific node-gyp topics that may be useful if you are experiencing problems installing or building addons using node-gyp.
+
 Some additional resources for Node.js native addons and writing `gyp` configuration files:
 
  * ["Going Native" a nodeschool.io tutorial](http://nodeschool.io/#goingnative)
- * ["Hello World" node addon example](https://github.com/nodejs/node/tree/master/test/addons/hello-world)
+ * ["Hello World" node addon example](https://github.com/nodejs/node/tree/main/test/addons/hello-world)
  * [gyp user documentation](https://gyp.gsrc.io/docs/UserDocumentation.md)
  * [gyp input format reference](https://gyp.gsrc.io/docs/InputFormatReference.md)
- * [*"binding.gyp" files out in the wild* wiki page](https://github.com/nodejs/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild)
+ * [*"binding.gyp" files out in the wild* wiki page](./docs/binding.gyp-files-in-the-wild.md)
 
 ## Commands
 
@@ -201,6 +221,7 @@ Some additional resources for Node.js native addons and writing `gyp` configurat
 | `--python=$path`                  | Set path to the Python binary
 | `--msvs_version=$version`         | Set Visual Studio version (Windows only)
 | `--solution=$solution`            | Set Visual Studio Solution version (Windows only)
+| `--force-process-config`          | Force using runtime's `process.config` object to generate `config.gypi` file
 
 ## Configuration
 
@@ -214,23 +235,23 @@ For example, to set `devdir` equal to `/tmp/.gyp`, you would:
 Run this on Unix:
 
 ```bash
-$ export npm_config_devdir=/tmp/.gyp
+export npm_config_devdir=/tmp/.gyp
 ```
 
 Or this on Windows:
 
 ```console
-> set npm_config_devdir=c:\temp\.gyp
+set npm_config_devdir=c:\temp\.gyp
 ```
 
-### `npm` configuration
+### `npm` configuration for npm versions before v9
 
 Use the form `OPTION_NAME` for any of the command options listed above.
 
 For example, to set `devdir` equal to `/tmp/.gyp`, you would run:
 
 ```bash
-$ npm config set [--global] devdir /tmp/.gyp
+npm config set [--global] devdir /tmp/.gyp
 ```
 
 **Note:** Configuration set via `npm` will only be used when `node-gyp`
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/SECURITY.md b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/SECURITY.md
new file mode 100644
index 00000000..1e168d76
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/SECURITY.md
@@ -0,0 +1,2 @@
+If you believe you have found a security issue in the software in this
+repository, please consult https://github.com/nodejs/node/blob/HEAD/SECURITY.md.
\ No newline at end of file
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/addon.gypi b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/addon.gypi
similarity index 87%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/addon.gypi
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/addon.gypi
index 9327b0d7..b4ac369a 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/addon.gypi
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/addon.gypi
@@ -103,22 +103,41 @@
           '-Wl,-bimport:<(node_exp_file)'
         ],
       }],
+      [ 'OS=="os400"', {
+        'ldflags': [
+          '-Wl,-bimport:<(node_exp_file)'
+        ],
+      }],
       [ 'OS=="zos"', {
-        'cflags': [
-          '-q64',
-          '-Wc,DLL',
-          '-qlonglong',
-          '-qenum=int',
-          '-qxclang=-fexec-charset=ISO8859-1'
+        'conditions': [
+          [ '"<!(echo $CC)" != "clang" and \
+             "<!(echo $CC)" != "ibm-clang64" and \
+             "<!(echo $CC)" != "ibm-clang"', {
+            'cflags': [
+              '-q64',
+              '-Wc,DLL',
+              '-qlonglong',
+              '-qenum=int',
+              '-qxclang=-fexec-charset=ISO8859-1'
+            ],
+            'ldflags': [
+              '-q64',
+              '<(node_exp_file)',
+            ],
+          }, {
+            'cflags': [
+              '-m64',
+            ],
+            'ldflags': [
+              '-m64',
+              '<(node_exp_file)',
+            ],
+          }],
         ],
         'defines': [
-          '_ALL_SOURCE=1',
+          '_ALL_SOURCE',
           'MAP_FAILED=-1',
-          '_UNIX03_SOURCE=1'
-        ],
-        'ldflags': [
-          '-q64',
-          '<(node_exp_file)'
+          '_UNIX03_SOURCE',
         ],
       }],
       [ 'OS=="win"', {
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/bin/node-gyp.js b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/bin/node-gyp.js
similarity index 73%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/bin/node-gyp.js
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/bin/node-gyp.js
index 8652ea21..f8317b47 100755
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/bin/node-gyp.js
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/bin/node-gyp.js
@@ -6,7 +6,7 @@ process.title = 'node-gyp'
 
 const envPaths = require('env-paths')
 const gyp = require('../')
-const log = require('npmlog')
+const log = require('../lib/log')
 const os = require('os')
 
 /**
@@ -14,11 +14,11 @@ const os = require('os')
  */
 
 const prog = gyp()
-var completed = false
+let completed = false
 prog.parseArgv(process.argv)
 prog.devDir = prog.opts.devdir
 
-var homeDir = os.homedir()
+const homeDir = os.homedir()
 if (prog.devDir) {
   prog.devDir = prog.devDir.replace(/^~/, homeDir)
 } else if (homeDir) {
@@ -32,9 +32,9 @@ if (prog.devDir) {
 
 if (prog.todo.length === 0) {
   if (~process.argv.indexOf('-v') || ~process.argv.indexOf('--version')) {
-    console.log('v%s', prog.version)
+    log.stdout('v%s', prog.version)
   } else {
-    console.log('%s', prog.usage())
+    log.stdout('%s', prog.usage())
   }
   process.exit(0)
 }
@@ -48,11 +48,11 @@ log.info('using', 'node@%s | %s | %s', process.versions.node, process.platform,
  * Change dir if -C/--directory was passed.
  */
 
-var dir = prog.opts.directory
+const dir = prog.opts.directory
 if (dir) {
-  var fs = require('fs')
+  const fs = require('fs')
   try {
-    var stat = fs.statSync(dir)
+    const stat = fs.statSync(dir)
     if (stat.isDirectory()) {
       log.info('chdir', dir)
       process.chdir(dir)
@@ -68,8 +68,8 @@ if (dir) {
   }
 }
 
-function run () {
-  var command = prog.todo.shift()
+async function run () {
+  const command = prog.todo.shift()
   if (!command) {
     // done!
     completed = true
@@ -77,30 +77,28 @@ function run () {
     return
   }
 
-  prog.commands[command.name](command.args, function (err) {
-    if (err) {
-      log.error(command.name + ' error')
-      log.error('stack', err.stack)
-      errorMessage()
-      log.error('not ok')
-      return process.exit(1)
-    }
+  try {
+    const args = await prog.commands[command.name](command.args) ?? []
+
     if (command.name === 'list') {
-      var versions = arguments[1]
-      if (versions.length > 0) {
-        versions.forEach(function (version) {
-          console.log(version)
-        })
+      if (args.length) {
+        args.forEach((version) => log.stdout(version))
       } else {
-        console.log('No node development files installed. Use `node-gyp install` to install a version.')
+        log.stdout('No node development files installed. Use `node-gyp install` to install a version.')
       }
-    } else if (arguments.length >= 2) {
-      console.log.apply(console, [].slice.call(arguments, 1))
+    } else if (args.length >= 1) {
+      log.stdout(...args.slice(1))
     }
 
     // now run the next command in the queue
-    process.nextTick(run)
-  })
+    return run()
+  } catch (err) {
+    log.error(command.name + ' error')
+    log.error('stack', err.stack)
+    errorMessage()
+    log.error('not ok')
+    return process.exit(1)
+  }
 }
 
 process.on('exit', function (code) {
@@ -120,7 +118,7 @@ process.on('uncaughtException', function (err) {
 
 function errorMessage () {
   // copied from npm's lib/utils/error-handler.js
-  var os = require('os')
+  const os = require('os')
   log.error('System', os.type() + ' ' + os.release())
   log.error('command', process.argv
     .map(JSON.stringify).join(' '))
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/LICENSE b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/LICENSE
similarity index 100%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/LICENSE
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/LICENSE
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/README.md b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/README.md
new file mode 100644
index 00000000..be1d7b9e
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/README.md
@@ -0,0 +1,30 @@
+GYP can Generate Your Projects.
+===================================
+
+Documents are available at [gyp.gsrc.io](https://gyp.gsrc.io), or you can check out ```md-pages``` branch to read those documents offline.
+
+__gyp-next__ is [released](https://github.com/nodejs/gyp-next/releases) to the [__Python Packaging Index__](https://pypi.org/project/gyp-next) (PyPI) and can be installed with the command:
+* `python3 -m pip install gyp-next`
+
+When used as a command line utility, __gyp-next__ can also be installed with [pipx](https://pypa.github.io/pipx):
+* `pipx install gyp-next`
+```
+Installing to a new venv 'gyp-next'
+  installed package gyp-next 0.13.0, installed using Python 3.10.6
+  These apps are now globally available
+    - gyp
+done! ✨ 🌟 ✨
+```
+
+Or to run __gyp-next__ directly without installing it:
+* `pipx run gyp-next --help`
+```
+NOTE: running app 'gyp' from 'gyp-next'
+usage: usage: gyp [options ...] [build_file ...]
+
+options:
+  -h, --help            show this help message and exit
+  --build CONFIGS       configuration for build after project generation
+  --check               check format of gyp files
+  [ ... ]
+```
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc
similarity index 100%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/gyp b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/gyp
similarity index 100%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/gyp
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/gyp
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/gyp.bat b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/gyp.bat
similarity index 100%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/gyp.bat
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/gyp.bat
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/gyp_main.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/gyp_main.py
similarity index 80%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/gyp_main.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/gyp_main.py
index da696cfc..f23dcdf8 100755
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/gyp_main.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/gyp_main.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2009 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -8,8 +8,6 @@ import os
 import sys
 import subprocess
 
-PY3 = bytes != str
-
 
 def IsCygwin():
     # Function copied from pylib/gyp/common.py
@@ -17,10 +15,8 @@ def IsCygwin():
         out = subprocess.Popen(
             "uname", stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
-        stdout, stderr = out.communicate()
-        if PY3:
-            stdout = stdout.decode("utf-8")
-        return "CYGWIN" in str(stdout)
+        stdout, _ = out.communicate()
+        return "CYGWIN" in stdout.decode("utf-8")
     except Exception:
         return False
 
@@ -33,9 +29,7 @@ def UnixifyPath(path):
             ["cygpath", "-u", path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
         stdout, _ = out.communicate()
-        if PY3:
-            stdout = stdout.decode("utf-8")
-        return str(stdout)
+        return stdout.decode("utf-8")
     except Exception:
         return path
 
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py
similarity index 92%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py
index 04bbb3df..bc0e93d0 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py
@@ -11,12 +11,9 @@ from operator import attrgetter
 
 import gyp.common
 
-try:
-    cmp
-except NameError:
 
-    def cmp(x, y):
-        return (x > y) - (x < y)
+def cmp(x, y):
+    return (x > y) - (x < y)
 
 
 # Initialize random number generator
@@ -69,7 +66,7 @@ def MakeGuid(name, seed="msvs_new"):
 # ------------------------------------------------------------------------------
 
 
-class MSVSSolutionEntry(object):
+class MSVSSolutionEntry:
     def __cmp__(self, other):
         # Sort by name then guid (so things are in order on vs2008).
         return cmp((self.name, self.get_guid()), (other.name, other.get_guid()))
@@ -190,7 +187,7 @@ class MSVSProject(MSVSSolutionEntry):
 # ------------------------------------------------------------------------------
 
 
-class MSVSSolution(object):
+class MSVSSolution:
     """Visual Studio solution."""
 
     def __init__(
@@ -288,19 +285,17 @@ class MSVSSolution(object):
                     "\tEndProjectSection\r\n"
                 )
 
-            if isinstance(e, MSVSFolder):
-                if e.items:
-                    f.write("\tProjectSection(SolutionItems) = preProject\r\n")
-                    for i in e.items:
-                        f.write("\t\t%s = %s\r\n" % (i, i))
-                    f.write("\tEndProjectSection\r\n")
+            if isinstance(e, MSVSFolder) and e.items:
+                f.write("\tProjectSection(SolutionItems) = preProject\r\n")
+                for i in e.items:
+                    f.write(f"\t\t{i} = {i}\r\n")
+                f.write("\tEndProjectSection\r\n")
 
-            if isinstance(e, MSVSProject):
-                if e.dependencies:
-                    f.write("\tProjectSection(ProjectDependencies) = postProject\r\n")
-                    for d in e.dependencies:
-                        f.write("\t\t%s = %s\r\n" % (d.get_guid(), d.get_guid()))
-                    f.write("\tEndProjectSection\r\n")
+            if isinstance(e, MSVSProject) and e.dependencies:
+                f.write("\tProjectSection(ProjectDependencies) = postProject\r\n")
+                for d in e.dependencies:
+                    f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n")
+                f.write("\tEndProjectSection\r\n")
 
             f.write("EndProject\r\n")
 
@@ -310,7 +305,7 @@ class MSVSSolution(object):
         # Configurations (variants)
         f.write("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n")
         for v in self.variants:
-            f.write("\t\t%s = %s\r\n" % (v, v))
+            f.write(f"\t\t{v} = {v}\r\n")
         f.write("\tEndGlobalSection\r\n")
 
         # Sort config guids for easier diffing of solution changes.
@@ -356,13 +351,13 @@ class MSVSSolution(object):
 
         # Folder mappings
         # Omit this section if there are no folders
-        if any([e.entries for e in all_entries if isinstance(e, MSVSFolder)]):
+        if any(e.entries for e in all_entries if isinstance(e, MSVSFolder)):
             f.write("\tGlobalSection(NestedProjects) = preSolution\r\n")
             for e in all_entries:
                 if not isinstance(e, MSVSFolder):
                     continue  # Does not apply to projects, only folders
                 for subentry in e.entries:
-                    f.write("\t\t%s = %s\r\n" % (subentry.get_guid(), e.get_guid()))
+                    f.write(f"\t\t{subentry.get_guid()} = {e.get_guid()}\r\n")
             f.write("\tEndGlobalSection\r\n")
 
         f.write("EndGlobal\r\n")
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py
similarity index 98%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py
index f953d52c..629f3f61 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py
@@ -9,7 +9,7 @@ import gyp.easy_xml as easy_xml
 # ------------------------------------------------------------------------------
 
 
-class Tool(object):
+class Tool:
     """Visual Studio tool."""
 
     def __init__(self, name, attrs=None):
@@ -31,7 +31,7 @@ class Tool(object):
         return ["Tool", self._attrs]
 
 
-class Filter(object):
+class Filter:
     """Visual Studio filter - that is, a virtual folder."""
 
     def __init__(self, name, contents=None):
@@ -48,7 +48,7 @@ class Filter(object):
 # ------------------------------------------------------------------------------
 
 
-class Writer(object):
+class Writer:
     """Visual Studio XML project writer."""
 
     def __init__(self, project_path, version, name, guid=None, platforms=None):
@@ -79,7 +79,7 @@ class Writer(object):
         self.files_section = ["Files"]
 
         # Keep a dict keyed on filename to speed up access.
-        self.files_dict = dict()
+        self.files_dict = {}
 
     def AddToolFile(self, path):
         """Adds a tool file to the project.
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py
similarity index 98%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py
index 6ef16f2a..93633dbc 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py
@@ -14,12 +14,8 @@ The MSBuild schemas were also considered.  They are typically found in the
 MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild
 """
 
-from __future__ import print_function
-
-from gyp import string_types
-
-import sys
 import re
+import sys
 
 # Dictionaries of settings validators. The key is the tool name, the value is
 # a dictionary mapping setting names to validation functions.
@@ -36,7 +32,7 @@ _msvs_to_msbuild_converters = {}
 _msbuild_name_of_tool = {}
 
 
-class _Tool(object):
+class _Tool:
     """Represents a tool used by MSVS or MSBuild.
 
   Attributes:
@@ -68,7 +64,7 @@ def _GetMSBuildToolSettings(msbuild_settings, tool):
     return msbuild_settings.setdefault(tool.msbuild_name, {})
 
 
-class _Type(object):
+class _Type:
     """Type of settings (Base class)."""
 
     def ValidateMSVS(self, value):
@@ -110,11 +106,11 @@ class _String(_Type):
     """A setting that's just a string."""
 
     def ValidateMSVS(self, value):
-        if not isinstance(value, string_types):
+        if not isinstance(value, str):
             raise ValueError("expected string; got %r" % value)
 
     def ValidateMSBuild(self, value):
-        if not isinstance(value, string_types):
+        if not isinstance(value, str):
             raise ValueError("expected string; got %r" % value)
 
     def ConvertToMSBuild(self, value):
@@ -126,11 +122,11 @@ class _StringList(_Type):
     """A settings that's a list of strings."""
 
     def ValidateMSVS(self, value):
-        if not isinstance(value, string_types) and not isinstance(value, list):
+        if not isinstance(value, (list, str)):
             raise ValueError("expected string list; got %r" % value)
 
     def ValidateMSBuild(self, value):
-        if not isinstance(value, string_types) and not isinstance(value, list):
+        if not isinstance(value, (list, str)):
             raise ValueError("expected string list; got %r" % value)
 
     def ConvertToMSBuild(self, value):
@@ -145,7 +141,7 @@ class _Boolean(_Type):
     """Boolean settings, can have the values 'false' or 'true'."""
 
     def _Validate(self, value):
-        if value != "true" and value != "false":
+        if value not in {"true", "false"}:
             raise ValueError("expected bool; got %r" % value)
 
     def ValidateMSVS(self, value):
@@ -195,7 +191,7 @@ class _Enumeration(_Type):
     def __init__(self, label_list, new=None):
         _Type.__init__(self)
         self._label_list = label_list
-        self._msbuild_values = set(value for value in label_list if value is not None)
+        self._msbuild_values = {value for value in label_list if value is not None}
         if new is not None:
             self._msbuild_values.update(new)
 
@@ -342,7 +338,7 @@ def _ConvertedToAdditionalOption(tool, msvs_name, flag):
         if value == "true":
             tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
             if "AdditionalOptions" in tool_settings:
-                new_flags = "%s %s" % (tool_settings["AdditionalOptions"], flag)
+                new_flags = "{} {}".format(tool_settings["AdditionalOptions"], flag)
             else:
                 new_flags = flag
             tool_settings["AdditionalOptions"] = new_flags
@@ -536,14 +532,14 @@ def _ValidateSettings(validators, settings, stderr):
                         tool_validators[setting](value)
                     except ValueError as e:
                         print(
-                            "Warning: for %s/%s, %s" % (tool_name, setting, e),
+                            f"Warning: for {tool_name}/{setting}, {e}",
                             file=stderr,
                         )
                 else:
                     _ValidateExclusionSetting(
                         setting,
                         tool_validators,
-                        ("Warning: unrecognized setting %s/%s" % (tool_name, setting)),
+                        (f"Warning: unrecognized setting {tool_name}/{setting}"),
                         stderr,
                     )
 
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py
similarity index 99%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py
index 99860c88..6ca09687 100755
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2012 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -9,10 +9,7 @@
 import unittest
 import gyp.MSVSSettings as MSVSSettings
 
-try:
-    from StringIO import StringIO  # Python 2
-except ImportError:
-    from io import StringIO  # Python 3
+from io import StringIO
 
 
 class TestSequenceFunctions(unittest.TestCase):
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py
similarity index 98%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py
index 2c08589e..2e5c811b 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py
@@ -7,7 +7,7 @@
 import gyp.easy_xml as easy_xml
 
 
-class Writer(object):
+class Writer:
     """Visual Studio XML tool file writer."""
 
     def __init__(self, tool_file_path, name):
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py
similarity index 97%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py
index de0896e6..e580c00f 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py
@@ -53,7 +53,7 @@ def _QuoteWin32CommandLineArgs(args):
     return new_args
 
 
-class Writer(object):
+class Writer:
     """Visual Studio XML user user file writer."""
 
     def __init__(self, user_file_path, version, name):
@@ -93,7 +93,7 @@ class Writer(object):
         abs_command = _FindCommandInPath(command[0])
 
         if environment and isinstance(environment, dict):
-            env_list = ['%s="%s"' % (key, val) for (key, val) in environment.items()]
+            env_list = [f'{key}="{val}"' for (key, val) in environment.items()]
             environment = " ".join(env_list)
         else:
             environment = ""
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py
similarity index 98%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py
index 83a9c297..36bb782b 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py
@@ -55,7 +55,7 @@ def _SuffixName(name, suffix):
     Target name with suffix added (foo_suffix#target)
   """
     parts = name.rsplit("#", 1)
-    parts[0] = "%s_%s" % (parts[0], suffix)
+    parts[0] = f"{parts[0]}_{suffix}"
     return "#".join(parts)
 
 
@@ -160,7 +160,7 @@ def _GetPdbPath(target_dict, config_name, vars):
         return pdb_path
 
     pdb_base = target_dict.get("product_name", target_dict["target_name"])
-    pdb_base = "%s.%s.pdb" % (pdb_base, TARGET_TYPE_EXT[target_dict["type"]])
+    pdb_base = "{}.{}.pdb".format(pdb_base, TARGET_TYPE_EXT[target_dict["type"]])
     pdb_path = vars["PRODUCT_DIR"] + "/" + pdb_base
 
     return pdb_path
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py
similarity index 95%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py
index 36b006aa..8d7f21e8 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py
@@ -11,14 +11,12 @@ import subprocess
 import sys
 import glob
 
-PY3 = bytes != str
-
 
 def JoinPath(*args):
     return os.path.normpath(os.path.join(*args))
 
 
-class VisualStudioVersion(object):
+class VisualStudioVersion:
     """Information regarding a version of Visual Studio."""
 
     def __init__(
@@ -176,9 +174,7 @@ def _RegistryQueryBase(sysdir, key, value):
     p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     # Obtain the stdout from reg.exe, reading to the end so p.returncode is valid
     # Note that the error text may be in [1] in some cases
-    text = p.communicate()[0]
-    if PY3:
-        text = text.decode("utf-8")
+    text = p.communicate()[0].decode("utf-8")
     # Check return code from reg.exe; officially 0==success and 1==error
     if p.returncode:
         return None
@@ -221,21 +217,15 @@ def _RegistryGetValueUsingWinReg(key, value):
     value: The particular registry value to read.
   Return:
     contents of the registry key's value, or None on failure.  Throws
-    ImportError if _winreg is unavailable.
+    ImportError if winreg is unavailable.
   """
-    try:
-        # Python 2
-        from _winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx
-    except ImportError:
-        # Python 3
-        from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx
-
+    from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx
     try:
         root, subkey = key.split("\\", 1)
         assert root == "HKLM"  # Only need HKLM for now.
         with OpenKey(HKEY_LOCAL_MACHINE, subkey) as hkey:
             return QueryValueEx(hkey, value)[0]
-    except WindowsError:
+    except OSError:
         return None
 
 
@@ -279,6 +269,18 @@ def _CreateVersion(name, path, sdk_based=False):
     if path:
         path = os.path.normpath(path)
     versions = {
+        "2022": VisualStudioVersion(
+            "2022",
+            "Visual Studio 2022",
+            solution_version="12.00",
+            project_version="17.0",
+            flat_sln=False,
+            uses_vcxproj=True,
+            path=path,
+            sdk_based=sdk_based,
+            default_toolset="v143",
+            compatible_sdks=["v8.1", "v10.0"],
+        ),
         "2019": VisualStudioVersion(
             "2019",
             "Visual Studio 2019",
@@ -426,9 +428,7 @@ def _ConvertToCygpath(path):
     """Convert to cygwin path if we are using cygwin."""
     if sys.platform == "cygwin":
         p = subprocess.Popen(["cygpath", path], stdout=subprocess.PIPE)
-        path = p.communicate()[0].strip()
-        if PY3:
-            path = path.decode("utf-8")
+        path = p.communicate()[0].decode("utf-8").strip()
     return path
 
 
@@ -448,6 +448,7 @@ def _DetectVisualStudioVersions(versions_to_check, force_express):
       2015    - Visual Studio 2015 (14)
       2017    - Visual Studio 2017 (15)
       2019    - Visual Studio 2019 (16)
+      2022    - Visual Studio 2022 (17)
     Where (e) is e for express editions of MSVS and blank otherwise.
   """
     version_to_year = {
@@ -459,6 +460,7 @@ def _DetectVisualStudioVersions(versions_to_check, force_express):
         "14.0": "2015",
         "15.0": "2017",
         "16.0": "2019",
+        "17.0": "2022",
     }
     versions = []
     for version in versions_to_check:
@@ -534,7 +536,7 @@ def SelectVisualStudioVersion(version="auto", allow_fallback=True):
     if version == "auto":
         version = os.environ.get("GYP_MSVS_VERSION", "auto")
     version_map = {
-        "auto": ("16.0", "15.0", "14.0", "12.0", "10.0", "9.0", "8.0", "11.0"),
+        "auto": ("17.0", "16.0", "15.0", "14.0", "12.0", "10.0", "9.0", "8.0", "11.0"),
         "2005": ("8.0",),
         "2005e": ("8.0",),
         "2008": ("9.0",),
@@ -548,6 +550,7 @@ def SelectVisualStudioVersion(version="auto", allow_fallback=True):
         "2015": ("14.0",),
         "2017": ("15.0",),
         "2019": ("16.0",),
+        "2022": ("17.0",),
     }
     override_path = os.environ.get("GYP_MSVS_OVERRIDE_PATH")
     if override_path:
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/__init__.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/__init__.py
similarity index 96%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/__init__.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/__init__.py
index f6ea625d..d6cc0130 100755
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/__init__.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/__init__.py
@@ -1,10 +1,9 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2012 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-from __future__ import print_function
 
 import copy
 import gyp.input
@@ -16,12 +15,6 @@ import sys
 import traceback
 from gyp.common import GypError
 
-try:
-    # Python 2
-    string_types = basestring
-except NameError:
-    # Python 3
-    string_types = str
 
 # Default debug modes for GYP
 debug = {}
@@ -111,6 +104,20 @@ def Load(
     for (key, val) in generator.generator_default_variables.items():
         default_variables.setdefault(key, val)
 
+    output_dir = params["options"].generator_output or params["options"].toplevel_dir
+    if default_variables["GENERATOR"] == "ninja":
+        default_variables.setdefault(
+            "PRODUCT_DIR_ABS",
+            os.path.join(
+                output_dir, "out", default_variables.get("build_type", "default")
+            ),
+        )
+    else:
+        default_variables.setdefault(
+            "PRODUCT_DIR_ABS",
+            os.path.join(output_dir, default_variables["CONFIGURATION_NAME"]),
+        )
+
     # Give the generator the opportunity to set additional variables based on
     # the params it will receive in the output phase.
     if getattr(generator, "CalculateVariables", None):
@@ -193,7 +200,7 @@ def ShlexEnv(env_name):
 
 def FormatOpt(opt, value):
     if opt.startswith("--"):
-        return "%s=%s" % (opt, value)
+        return f"{opt}={value}"
     return opt + value
 
 
@@ -459,8 +466,19 @@ def gyp_main(args):
         metavar="TARGET",
         help="include only TARGET and its deep dependencies",
     )
+    parser.add_argument(
+        "-V",
+        "--version",
+        dest="version",
+        action="store_true",
+        help="Show the version and exit.",
+    )
 
     options, build_files_arg = parser.parse_args(args)
+    if options.version:
+        import pkg_resources
+        print(f"v{pkg_resources.get_distribution('gyp-next').version}")
+        return 0
     build_files = build_files_arg
 
     # Set up the configuration directory (defaults to ~/.gyp)
@@ -524,7 +542,7 @@ def gyp_main(args):
         for option, value in sorted(options.__dict__.items()):
             if option[0] == "_":
                 continue
-            if isinstance(value, string_types):
+            if isinstance(value, str):
                 DebugOutput(DEBUG_GENERAL, "  %s: '%s'", option, value)
             else:
                 DebugOutput(DEBUG_GENERAL, "  %s: %s", option, value)
@@ -606,7 +624,7 @@ def gyp_main(args):
     if options.generator_flags:
         gen_flags += options.generator_flags
     generator_flags = NameValueListToDict(gen_flags)
-    if DEBUG_GENERAL in gyp.debug.keys():
+    if DEBUG_GENERAL in gyp.debug:
         DebugOutput(DEBUG_GENERAL, "generator_flags: %s", generator_flags)
 
     # Generate all requested formats (use a set in case we got one format request
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/common.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/common.py
similarity index 96%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/common.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/common.py
index a9156438..b73a0c55 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/common.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/common.py
@@ -10,17 +10,12 @@ import tempfile
 import sys
 import subprocess
 
-try:
-    from collections.abc import MutableSet
-except ImportError:
-    from collections import MutableSet
-
-PY3 = bytes != str
+from collections.abc import MutableSet
 
 
 # A minimal memoizing decorator. It'll blow up if the args aren't immutable,
 # among other "problems".
-class memoize(object):
+class memoize:
     def __init__(self, func):
         self.func = func
         self.cache = {}
@@ -149,20 +144,16 @@ def RelativePath(path, relative_to, follow_path_symlink=True):
     # symlink, this option has no effect.
 
     # Convert to normalized (and therefore absolute paths).
-    if follow_path_symlink:
-        path = os.path.realpath(path)
-    else:
-        path = os.path.abspath(path)
+    path = os.path.realpath(path) if follow_path_symlink else os.path.abspath(path)
     relative_to = os.path.realpath(relative_to)
 
     # On Windows, we can't create a relative path to a different drive, so just
     # use the absolute path.
-    if sys.platform == "win32":
-        if (
-            os.path.splitdrive(path)[0].lower()
-            != os.path.splitdrive(relative_to)[0].lower()
-        ):
-            return path
+    if sys.platform == "win32" and (
+        os.path.splitdrive(path)[0].lower()
+        != os.path.splitdrive(relative_to)[0].lower()
+    ):
+        return path
 
     # Split the paths into components.
     path_split = path.split(os.path.sep)
@@ -282,10 +273,7 @@ def EncodePOSIXShellArgument(argument):
     if not isinstance(argument, str):
         argument = str(argument)
 
-    if _quote.search(argument):
-        quote = '"'
-    else:
-        quote = ""
+    quote = '"' if _quote.search(argument) else ""
 
     encoded = quote + re.sub(_escape, r"\\\1", argument) + quote
 
@@ -348,7 +336,7 @@ def WriteOnDiff(filename):
     the target if it differs (on close).
   """
 
-    class Writer(object):
+    class Writer:
         """Wrapper around file which only covers the target if it differs."""
 
         def __init__(self):
@@ -459,6 +447,8 @@ def GetFlavor(params):
         return "aix"
     if sys.platform.startswith(("os390", "zos")):
         return "zos"
+    if sys.platform == "os400":
+        return "os400"
 
     return "linux"
 
@@ -468,9 +458,14 @@ def CopyTool(flavor, out_path, generator_flags={}):
   to |out_path|."""
     # aix and solaris just need flock emulation. mac and win use more complicated
     # support scripts.
-    prefix = {"aix": "flock", "solaris": "flock", "mac": "mac", "win": "win"}.get(
-        flavor, None
-    )
+    prefix = {
+        "aix": "flock",
+        "os400": "flock",
+        "solaris": "flock",
+        "mac": "mac",
+        "ios": "mac",
+        "win": "win",
+    }.get(flavor, None)
     if not prefix:
         return
 
@@ -566,8 +561,8 @@ class OrderedSet(MutableSet):
 
     def __repr__(self):
         if not self:
-            return "%s()" % (self.__class__.__name__,)
-        return "%s(%r)" % (self.__class__.__name__, list(self))
+            return f"{self.__class__.__name__}()"
+        return f"{self.__class__.__name__}({list(self)!r})"
 
     def __eq__(self, other):
         if isinstance(other, OrderedSet):
@@ -653,9 +648,7 @@ def IsCygwin():
         out = subprocess.Popen(
             "uname", stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
-        stdout, stderr = out.communicate()
-        if PY3:
-            stdout = stdout.decode("utf-8")
+        stdout = out.communicate()[0].decode("utf-8")
         return "CYGWIN" in str(stdout)
     except Exception:
         return False
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/common_test.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/common_test.py
similarity index 98%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/common_test.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/common_test.py
index 0310fb26..05344085 100755
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/common_test.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/common_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2012 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py
similarity index 92%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py
index e0628ef4..02567b25 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import sys
 import re
 import os
 import locale
@@ -84,7 +85,7 @@ def _ConstructContentList(xml_parts, specification, pretty, level=0):
     rest = specification[1:]
     if rest and isinstance(rest[0], dict):
         for at, val in sorted(rest[0].items()):
-            xml_parts.append(' %s="%s"' % (at, _XmlEscape(val, attr=True)))
+            xml_parts.append(f' {at}="{_XmlEscape(val, attr=True)}"')
         rest = rest[1:]
     if rest:
         xml_parts.append(">")
@@ -101,12 +102,13 @@ def _ConstructContentList(xml_parts, specification, pretty, level=0):
                 _ConstructContentList(xml_parts, child_spec, pretty, level + 1)
         if multi_line and indentation:
             xml_parts.append(indentation)
-        xml_parts.append("</%s>%s" % (name, new_line))
+        xml_parts.append(f"</{name}>{new_line}")
     else:
         xml_parts.append("/>%s" % new_line)
 
 
-def WriteXmlIfChanged(content, path, encoding="utf-8", pretty=False, win32=False):
+def WriteXmlIfChanged(content, path, encoding="utf-8", pretty=False,
+                      win32=(sys.platform == "win32")):
     """ Writes the XML content to disk, touching the file only if it has changed.
 
   Args:
@@ -119,15 +121,19 @@ def WriteXmlIfChanged(content, path, encoding="utf-8", pretty=False, win32=False
     if win32 and os.linesep != "\r\n":
         xml_string = xml_string.replace("\n", "\r\n")
 
-    default_encoding = locale.getdefaultlocale()[1]
+    try:  # getdefaultlocale() was removed in Python 3.11
+        default_encoding = locale.getdefaultlocale()[1]
+    except AttributeError:
+        default_encoding = locale.getencoding()
+
     if default_encoding and default_encoding.upper() != encoding.upper():
         xml_string = xml_string.encode(encoding)
 
     # Get the old content
     try:
-        with open(path, "r") as file:
+        with open(path) as file:
             existing = file.read()
-    except IOError:
+    except OSError:
         existing = None
 
     # It has changed, write it
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py
similarity index 92%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py
index 5bc795dd..2d9b1521 100755
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2011 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -9,10 +9,7 @@
 import gyp.easy_xml as easy_xml
 import unittest
 
-try:
-    from StringIO import StringIO  # Python 2
-except ImportError:
-    from io import StringIO  # Python 3
+from io import StringIO
 
 
 class TestSequenceFunctions(unittest.TestCase):
@@ -79,6 +76,8 @@ class TestSequenceFunctions(unittest.TestCase):
             '\'Debug|Win32\'" Label="Configuration">'
             "<ConfigurationType>Application</ConfigurationType>"
             "<CharacterSet>Unicode</CharacterSet>"
+            "<SpectreMitigation>SpectreLoadCF</SpectreMitigation>"
+            "<VCToolsVersion>14.36.32532</VCToolsVersion>"
             "</PropertyGroup>"
             "</Project>"
         )
@@ -102,6 +101,8 @@ class TestSequenceFunctions(unittest.TestCase):
                     },
                     ["ConfigurationType", "Application"],
                     ["CharacterSet", "Unicode"],
+                    ["SpectreMitigation", "SpectreLoadCF"],
+                    ["VCToolsVersion", "14.36.32532"],
                 ],
             ]
         )
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py
similarity index 94%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py
index f9f89e52..0754aff2 100755
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright (c) 2011 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -18,7 +18,7 @@ def main(args):
     executor.Dispatch(args)
 
 
-class FlockTool(object):
+class FlockTool:
     """This class emulates the 'flock' command."""
 
     def Dispatch(self, args):
@@ -41,7 +41,7 @@ class FlockTool(object):
         # with EBADF, that's why we use this F_SETLK
         # hack instead.
         fd = os.open(lockfile, os.O_WRONLY | os.O_NOCTTY | os.O_CREAT, 0o666)
-        if sys.platform.startswith("aix"):
+        if sys.platform.startswith("aix") or sys.platform == "os400":
             # Python on AIX is compiled with LARGEFILE support, which changes the
             # struct size.
             op = struct.pack("hhIllqq", fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py
similarity index 100%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py
similarity index 97%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py
index 7a393c1f..1334f2fc 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py
@@ -62,7 +62,6 @@ directly supplied to gyp. OTOH if both "a.gyp" and "b.gyp" are supplied to gyp
 then the "all" target includes "b1" and "b2".
 """
 
-from __future__ import print_function
 
 import gyp.common
 import json
@@ -216,7 +215,7 @@ def _ExtractSources(target, target_dict, toplevel_dir):
     return results
 
 
-class Target(object):
+class Target:
     """Holds information about a particular target:
   deps: set of Targets this Target depends upon. This is not recursive, only the
     direct dependent Targets.
@@ -252,7 +251,7 @@ class Target(object):
         self.is_or_has_linked_ancestor = False
 
 
-class Config(object):
+class Config:
     """Details what we're looking for
   files: set of files to search for
   targets: see file description for details."""
@@ -271,10 +270,10 @@ class Config(object):
         if not config_path:
             return
         try:
-            f = open(config_path, "r")
+            f = open(config_path)
             config = json.load(f)
             f.close()
-        except IOError:
+        except OSError:
             raise Exception("Unable to open file " + config_path)
         except ValueError as e:
             raise Exception("Unable to parse config file " + config_path + str(e))
@@ -380,7 +379,7 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files, build
         target.is_executable = target_type == "executable"
         target.is_static_library = target_type == "static_library"
         target.is_or_has_linked_ancestor = (
-            target_type == "executable" or target_type == "shared_library"
+            target_type in {"executable", "shared_library"}
         )
 
         build_file = gyp.common.ParseQualifiedTarget(target_name)[0]
@@ -434,14 +433,14 @@ def _GetUnqualifiedToTargetMapping(all_targets, to_find):
     if not to_find:
         return {}, []
     to_find = set(to_find)
-    for target_name in all_targets.keys():
+    for target_name in all_targets:
         extracted = gyp.common.ParseQualifiedTarget(target_name)
         if len(extracted) > 1 and extracted[1] in to_find:
             to_find.remove(extracted[1])
             result[extracted[1]] = all_targets[target_name]
             if not to_find:
                 return result, []
-    return result, [x for x in to_find]
+    return result, list(to_find)
 
 
 def _DoesTargetDependOnMatchingTargets(target):
@@ -452,8 +451,8 @@ def _DoesTargetDependOnMatchingTargets(target):
     if target.match_status == MATCH_STATUS_DOESNT_MATCH:
         return False
     if (
-        target.match_status == MATCH_STATUS_MATCHES
-        or target.match_status == MATCH_STATUS_MATCHES_BY_DEPENDENCY
+        target.match_status in {MATCH_STATUS_MATCHES,
+                                MATCH_STATUS_MATCHES_BY_DEPENDENCY}
     ):
         return True
     for dep in target.deps:
@@ -586,7 +585,7 @@ def _WriteOutput(params, **values):
         f = open(output_path, "w")
         f.write(json.dumps(values) + "\n")
         f.close()
-    except IOError as e:
+    except OSError as e:
         print("Error writing to output file", output_path, str(e))
 
 
@@ -627,7 +626,7 @@ def CalculateVariables(default_variables, params):
         default_variables.setdefault("OS", operating_system)
 
 
-class TargetCalculator(object):
+class TargetCalculator:
     """Calculates the matching test_targets and matching compile_targets."""
 
     def __init__(
@@ -684,11 +683,9 @@ class TargetCalculator(object):
         )
         test_target_names_contains_all = "all" in self._test_target_names
         if test_target_names_contains_all:
-            test_targets = [
-                x for x in (set(test_targets_no_all) | set(self._root_targets))
-            ]
+            test_targets = list(set(test_targets_no_all) | set(self._root_targets))
         else:
-            test_targets = [x for x in test_targets_no_all]
+            test_targets = list(test_targets_no_all)
         print("supplied test_targets")
         for target_name in self._test_target_names:
             print("\t", target_name)
@@ -703,9 +700,9 @@ class TargetCalculator(object):
         if matching_test_targets_contains_all:
             # Remove any of the targets for all that were not explicitly supplied,
             # 'all' is subsequentely added to the matching names below.
-            matching_test_targets = [
-                x for x in (set(matching_test_targets) & set(test_targets_no_all))
-            ]
+            matching_test_targets = list(
+                set(matching_test_targets) & set(test_targets_no_all)
+            )
         print("matched test_targets")
         for target in matching_test_targets:
             print("\t", target.name)
@@ -730,9 +727,7 @@ class TargetCalculator(object):
             self._supplied_target_names_no_all(), self._unqualified_mapping
         )
         if "all" in self._supplied_target_names():
-            supplied_targets = [
-                x for x in (set(supplied_targets) | set(self._root_targets))
-            ]
+            supplied_targets = list(set(supplied_targets) | set(self._root_targets))
         print("Supplied test_targets & compile_targets")
         for target in supplied_targets:
             print("\t", target.name)
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
similarity index 88%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
index 16728847..d3c97c66 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
@@ -14,7 +14,6 @@
 # variables set potentially clash with other Android build system variables.
 # Try to avoid setting global variables where possible.
 
-from __future__ import print_function
 
 import gyp
 import gyp.common
@@ -84,7 +83,7 @@ def IsCPPExtension(ext):
 
 def Sourceify(path):
     """Convert a path to its source directory form. The Android backend does not
-     support options.generator_output, so this function is a noop."""
+    support options.generator_output, so this function is a noop."""
     return path
 
 
@@ -100,11 +99,11 @@ target_outputs = {}
 target_link_deps = {}
 
 
-class AndroidMkWriter(object):
+class AndroidMkWriter:
     """AndroidMkWriter packages up the writing of one target-specific Android.mk.
 
-  Its only real entry point is Write(), and is mostly used for namespacing.
-  """
+    Its only real entry point is Write(), and is mostly used for namespacing.
+    """
 
     def __init__(self, android_top_dir):
         self.android_top_dir = android_top_dir
@@ -123,18 +122,18 @@ class AndroidMkWriter(object):
     ):
         """The main entry point: writes a .mk file for a single target.
 
-    Arguments:
-      qualified_target: target we're generating
-      relative_target: qualified target name relative to the root
-      base_path: path relative to source root we're building in, used to resolve
-                 target-relative paths
-      output_filename: output .mk file name to write
-      spec, configs: gyp info
-      part_of_all: flag indicating this target is part of 'all'
-      write_alias_target: flag indicating whether to create short aliases for
-                          this target
-      sdk_version: what to emit for LOCAL_SDK_VERSION in output
-    """
+        Arguments:
+          qualified_target: target we're generating
+          relative_target: qualified target name relative to the root
+          base_path: path relative to source root we're building in, used to resolve
+                     target-relative paths
+          output_filename: output .mk file name to write
+          spec, configs: gyp info
+          part_of_all: flag indicating this target is part of 'all'
+          write_alias_target: flag indicating whether to create short aliases for
+                              this target
+          sdk_version: what to emit for LOCAL_SDK_VERSION in output
+        """
         gyp.common.EnsureDirExists(output_filename)
 
         self.fp = open(output_filename, "w")
@@ -254,15 +253,15 @@ class AndroidMkWriter(object):
     def WriteActions(self, actions, extra_sources, extra_outputs):
         """Write Makefile code for any 'actions' from the gyp input.
 
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   actions (used to make other pieces dependent on these
-                   actions)
-    """
+        extra_sources: a list that will be filled in with newly generated source
+                       files, if any
+        extra_outputs: a list that will be filled in with any outputs of these
+                       actions (used to make other pieces dependent on these
+                       actions)
+        """
         for action in actions:
             name = make.StringToMakefileVariable(
-                "%s_%s" % (self.relative_target, action["action_name"])
+                "{}_{}".format(self.relative_target, action["action_name"])
             )
             self.WriteLn('### Rules for action "%s":' % action["action_name"])
             inputs = action["inputs"]
@@ -350,7 +349,7 @@ class AndroidMkWriter(object):
             for output in outputs[1:]:
                 # Make each output depend on the main output, with an empty command
                 # to force make to notice that the mtime has changed.
-                self.WriteLn("%s: %s ;" % (self.LocalPathify(output), main_output))
+                self.WriteLn(f"{self.LocalPathify(output)}: {main_output} ;")
 
             extra_outputs += outputs
             self.WriteLn()
@@ -360,11 +359,11 @@ class AndroidMkWriter(object):
     def WriteRules(self, rules, extra_sources, extra_outputs):
         """Write Makefile code for any 'rules' from the gyp input.
 
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   rules (used to make other pieces dependent on these rules)
-    """
+        extra_sources: a list that will be filled in with newly generated source
+                       files, if any
+        extra_outputs: a list that will be filled in with any outputs of these
+                       rules (used to make other pieces dependent on these rules)
+        """
         if len(rules) == 0:
             return
 
@@ -372,7 +371,7 @@ class AndroidMkWriter(object):
             if len(rule.get("rule_sources", [])) == 0:
                 continue
             name = make.StringToMakefileVariable(
-                "%s_%s" % (self.relative_target, rule["rule_name"])
+                "{}_{}".format(self.relative_target, rule["rule_name"])
             )
             self.WriteLn('\n### Generated for rule "%s":' % name)
             self.WriteLn('# "%s":' % rule)
@@ -452,7 +451,7 @@ class AndroidMkWriter(object):
                 for output in outputs[1:]:
                     # Make each output depend on the main output, with an empty command
                     # to force make to notice that the mtime has changed.
-                    self.WriteLn("%s: %s ;" % (output, main_output))
+                    self.WriteLn(f"{output}: {main_output} ;")
                 self.WriteLn()
 
         self.WriteLn()
@@ -460,9 +459,9 @@ class AndroidMkWriter(object):
     def WriteCopies(self, copies, extra_outputs):
         """Write Makefile code for any 'copies' from the gyp input.
 
-    extra_outputs: a list that will be filled in with any outputs of this action
-                   (used to make other pieces dependent on this action)
-    """
+        extra_outputs: a list that will be filled in with any outputs of this action
+                       (used to make other pieces dependent on this action)
+        """
         self.WriteLn("### Generated for copy rule.")
 
         variable = make.StringToMakefileVariable(self.relative_target + "_copies")
@@ -487,25 +486,25 @@ class AndroidMkWriter(object):
                     self.LocalPathify(os.path.join(copy["destination"], filename))
                 )
 
-                self.WriteLn(
-                    "%s: %s $(GYP_TARGET_DEPENDENCIES) | $(ACP)" % (output, path)
-                )
+                self.WriteLn(f"{output}: {path} $(GYP_TARGET_DEPENDENCIES) | $(ACP)")
                 self.WriteLn("\t@echo Copying: $@")
                 self.WriteLn("\t$(hide) mkdir -p $(dir $@)")
                 self.WriteLn("\t$(hide) $(ACP) -rpf $< $@")
                 self.WriteLn()
                 outputs.append(output)
-        self.WriteLn("%s = %s" % (variable, " ".join(map(make.QuoteSpaces, outputs))))
+        self.WriteLn(
+            "{} = {}".format(variable, " ".join(map(make.QuoteSpaces, outputs)))
+        )
         extra_outputs.append("$(%s)" % variable)
         self.WriteLn()
 
     def WriteSourceFlags(self, spec, configs):
         """Write out the flags and include paths used to compile source files for
-    the current target.
+        the current target.
 
-    Args:
-      spec, configs: input from gyp.
-    """
+        Args:
+          spec, configs: input from gyp.
+        """
         for configname, config in sorted(configs.items()):
             extracted_includes = []
 
@@ -554,16 +553,16 @@ class AndroidMkWriter(object):
 
     def WriteSources(self, spec, configs, extra_sources):
         """Write Makefile code for any 'sources' from the gyp input.
-    These are source files necessary to build the current target.
-    We need to handle shared_intermediate directory source files as
-    a special case by copying them to the intermediate directory and
-    treating them as a generated sources. Otherwise the Android build
-    rules won't pick them up.
-
-    Args:
-      spec, configs: input from gyp.
-      extra_sources: Sources generated from Actions or Rules.
-    """
+        These are source files necessary to build the current target.
+        We need to handle shared_intermediate directory source files as
+        a special case by copying them to the intermediate directory and
+        treating them as a generated sources. Otherwise the Android build
+        rules won't pick them up.
+
+        Args:
+          spec, configs: input from gyp.
+          extra_sources: Sources generated from Actions or Rules.
+        """
         sources = filter(make.Compilable, spec.get("sources", []))
         generated_not_sources = [x for x in extra_sources if not make.Compilable(x)]
         extra_sources = filter(make.Compilable, extra_sources)
@@ -617,7 +616,7 @@ class AndroidMkWriter(object):
             if IsCPPExtension(ext) and ext != local_cpp_extension:
                 local_file = root + local_cpp_extension
             if local_file != source:
-                self.WriteLn("%s: %s" % (local_file, self.LocalPathify(source)))
+                self.WriteLn(f"{local_file}: {self.LocalPathify(source)}")
                 self.WriteLn("\tmkdir -p $(@D); cp $< $@")
                 origin_src_dirs.append(os.path.dirname(source))
             final_generated_sources.append(local_file)
@@ -640,10 +639,10 @@ class AndroidMkWriter(object):
     def ComputeAndroidModule(self, spec):
         """Return the Android module name used for a gyp spec.
 
-    We use the complete qualified target name to avoid collisions between
-    duplicate targets in different directories. We also add a suffix to
-    distinguish gyp-generated module names.
-    """
+        We use the complete qualified target name to avoid collisions between
+        duplicate targets in different directories. We also add a suffix to
+        distinguish gyp-generated module names.
+        """
 
         if int(spec.get("android_unmangled_name", 0)):
             assert self.type != "shared_library" or self.target.startswith("lib")
@@ -662,7 +661,7 @@ class AndroidMkWriter(object):
             suffix = "_gyp"
 
         if self.path:
-            middle = make.StringToMakefileVariable("%s_%s" % (self.path, self.target))
+            middle = make.StringToMakefileVariable(f"{self.path}_{self.target}")
         else:
             middle = make.StringToMakefileVariable(self.target)
 
@@ -671,11 +670,11 @@ class AndroidMkWriter(object):
     def ComputeOutputParts(self, spec):
         """Return the 'output basename' of a gyp spec, split into filename + ext.
 
-    Android libraries must be named the same thing as their module name,
-    otherwise the linker can't find them, so product_name and so on must be
-    ignored if we are building a library, and the "lib" prepending is
-    not done for Android.
-    """
+        Android libraries must be named the same thing as their module name,
+        otherwise the linker can't find them, so product_name and so on must be
+        ignored if we are building a library, and the "lib" prepending is
+        not done for Android.
+        """
         assert self.type != "loadable_module"  # TODO: not supported?
 
         target = spec["target_name"]
@@ -698,7 +697,7 @@ class AndroidMkWriter(object):
                 target,
             )
 
-        if self.type != "static_library" and self.type != "shared_library":
+        if self.type not in {"static_library", "shared_library"}:
             target_prefix = spec.get("product_prefix", target_prefix)
             target = spec.get("product_name", target)
             product_ext = spec.get("product_extension")
@@ -711,17 +710,17 @@ class AndroidMkWriter(object):
     def ComputeOutputBasename(self, spec):
         """Return the 'output basename' of a gyp spec.
 
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      'libfoobar.so'
-    """
+        E.g., the loadable module 'foobar' in directory 'baz' will produce
+          'libfoobar.so'
+        """
         return "".join(self.ComputeOutputParts(spec))
 
     def ComputeOutput(self, spec):
         """Return the 'output' (full output path) of a gyp spec.
 
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      '$(obj)/baz/libfoobar.so'
-    """
+        E.g., the loadable module 'foobar' in directory 'baz' will produce
+          '$(obj)/baz/libfoobar.so'
+        """
         if self.type == "executable":
             # We install host executables into shared_intermediate_dir so they can be
             # run by gyp rules that refer to PRODUCT_DIR.
@@ -740,7 +739,7 @@ class AndroidMkWriter(object):
                     % (self.android_class, self.android_module)
                 )
             else:
-                path = "$(call intermediates-dir-for,%s,%s,,,$(GYP_VAR_PREFIX))" % (
+                path = "$(call intermediates-dir-for,{},{},,,$(GYP_VAR_PREFIX))".format(
                     self.android_class,
                     self.android_module,
                 )
@@ -749,14 +748,14 @@ class AndroidMkWriter(object):
         return os.path.join(path, self.ComputeOutputBasename(spec))
 
     def NormalizeIncludePaths(self, include_paths):
-        """ Normalize include_paths.
-    Convert absolute paths to relative to the Android top directory.
-
-    Args:
-      include_paths: A list of unprocessed include paths.
-    Returns:
-      A list of normalized include paths.
-    """
+        """Normalize include_paths.
+        Convert absolute paths to relative to the Android top directory.
+
+        Args:
+          include_paths: A list of unprocessed include paths.
+        Returns:
+          A list of normalized include paths.
+        """
         normalized = []
         for path in include_paths:
             if path[0] == "/":
@@ -767,11 +766,11 @@ class AndroidMkWriter(object):
     def ExtractIncludesFromCFlags(self, cflags):
         """Extract includes "-I..." out from cflags
 
-    Args:
-      cflags: A list of compiler flags, which may be mixed with "-I.."
-    Returns:
-      A tuple of lists: (clean_clfags, include_paths). "-I.." is trimmed.
-    """
+        Args:
+          cflags: A list of compiler flags, which may be mixed with "-I.."
+        Returns:
+          A tuple of lists: (clean_clfags, include_paths). "-I.." is trimmed.
+        """
         clean_cflags = []
         include_paths = []
         for flag in cflags:
@@ -785,14 +784,14 @@ class AndroidMkWriter(object):
     def FilterLibraries(self, libraries):
         """Filter the 'libraries' key to separate things that shouldn't be ldflags.
 
-    Library entries that look like filenames should be converted to android
-    module names instead of being passed to the linker as flags.
+        Library entries that look like filenames should be converted to android
+        module names instead of being passed to the linker as flags.
 
-    Args:
-      libraries: the value of spec.get('libraries')
-    Returns:
-      A tuple (static_lib_modules, dynamic_lib_modules, ldflags)
-    """
+        Args:
+          libraries: the value of spec.get('libraries')
+        Returns:
+          A tuple (static_lib_modules, dynamic_lib_modules, ldflags)
+        """
         static_lib_modules = []
         dynamic_lib_modules = []
         ldflags = []
@@ -823,10 +822,10 @@ class AndroidMkWriter(object):
     def ComputeDeps(self, spec):
         """Compute the dependencies of a gyp spec.
 
-    Returns a tuple (deps, link_deps), where each is a list of
-    filenames that will need to be put in front of make for either
-    building (deps) or linking (link_deps).
-    """
+        Returns a tuple (deps, link_deps), where each is a list of
+        filenames that will need to be put in front of make for either
+        building (deps) or linking (link_deps).
+        """
         deps = []
         link_deps = []
         if "dependencies" in spec:
@@ -846,9 +845,9 @@ class AndroidMkWriter(object):
     def WriteTargetFlags(self, spec, configs, link_deps):
         """Write Makefile code to specify the link flags and library dependencies.
 
-    spec, configs: input from gyp.
-    link_deps: link dependency list; see ComputeDeps()
-    """
+        spec, configs: input from gyp.
+        link_deps: link dependency list; see ComputeDeps()
+        """
         # Libraries (i.e. -lfoo)
         # These must be included even for static libraries as some of them provide
         # implicit include paths through the build system.
@@ -891,12 +890,12 @@ class AndroidMkWriter(object):
     ):
         """Write Makefile code to produce the final target of the gyp spec.
 
-    spec, configs: input from gyp.
-    deps, link_deps: dependency lists; see ComputeDeps()
-    part_of_all: flag indicating this target is part of 'all'
-    write_alias_target: flag indicating whether to create short aliases for this
-                        target
-    """
+        spec, configs: input from gyp.
+        deps, link_deps: dependency lists; see ComputeDeps()
+        part_of_all: flag indicating this target is part of 'all'
+        write_alias_target: flag indicating whether to create short aliases for this
+                            target
+        """
         self.WriteLn("### Rules for final target.")
 
         if self.type != "none":
@@ -909,7 +908,7 @@ class AndroidMkWriter(object):
                 if isinstance(v, list):
                     self.WriteList(v, k)
                 else:
-                    self.WriteLn("%s := %s" % (k, make.QuoteIfNecessary(v)))
+                    self.WriteLn(f"{k} := {make.QuoteIfNecessary(v)}")
             self.WriteLn("")
 
         # Add to the set of targets which represent the gyp 'all' target. We use the
@@ -928,7 +927,7 @@ class AndroidMkWriter(object):
         if self.target != self.android_module and write_alias_target:
             self.WriteLn("# Alias gyp target name.")
             self.WriteLn(".PHONY: %s" % self.target)
-            self.WriteLn("%s: %s" % (self.target, self.android_module))
+            self.WriteLn(f"{self.target}: {self.android_module}")
             self.WriteLn("")
 
         # Add the command to trigger build of the target type depending
@@ -975,25 +974,25 @@ class AndroidMkWriter(object):
     ):
         """Write a variable definition that is a list of values.
 
-    E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
-         foo = blaha blahb
-    but in a pretty-printed style.
-    """
+        E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
+             foo = blaha blahb
+        but in a pretty-printed style.
+        """
         values = ""
         if value_list:
             value_list = [quoter(prefix + value) for value in value_list]
             if local_pathify:
                 value_list = [self.LocalPathify(value) for value in value_list]
             values = " \\\n\t" + " \\\n\t".join(value_list)
-        self.fp.write("%s :=%s\n\n" % (variable, values))
+        self.fp.write(f"{variable} :={values}\n\n")
 
     def WriteLn(self, text=""):
         self.fp.write(text + "\n")
 
     def LocalPathify(self, path):
         """Convert a subdirectory-relative path into a normalized path which starts
-    with the make variable $(LOCAL_PATH) (i.e. the top of the project tree).
-    Absolute paths, or paths that contain variables, are just normalized."""
+        with the make variable $(LOCAL_PATH) (i.e. the top of the project tree).
+        Absolute paths, or paths that contain variables, are just normalized."""
         if "$(" in path or os.path.isabs(path):
             # path is not a file in the project tree in this case, but calling
             # normpath is still important for trimming trailing slashes.
@@ -1006,7 +1005,7 @@ class AndroidMkWriter(object):
         # so we don't look for a slash.
         assert local_path.startswith(
             "$(LOCAL_PATH)"
-        ), "Path %s attempts to escape from gyp path %s !)" % (path, self.path)
+        ), f"Path {path} attempts to escape from gyp path {self.path} !)"
         return local_path
 
     def ExpandInputRoot(self, template, expansion, dirname):
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py
similarity index 98%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py
index f5ceacfc..320a891a 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py
@@ -28,21 +28,15 @@ not be able to find the header file directories described in the generated
 CMakeLists.txt file.
 """
 
-from __future__ import print_function
 
 import multiprocessing
 import os
 import signal
-import string
 import subprocess
 import gyp.common
 import gyp.xcode_emulation
 
-try:
-    # maketrans moved to str in python3.
-    _maketrans = string.maketrans
-except NameError:
-    _maketrans = str.maketrans
+_maketrans = str.maketrans
 
 generator_default_variables = {
     "EXECUTABLE_PREFIX": "",
@@ -109,7 +103,7 @@ def NormjoinPathForceCMakeSource(base_path, rel_path):
   """
     if os.path.isabs(rel_path):
         return rel_path
-    if any([rel_path.startswith(var) for var in FULL_PATH_VARS]):
+    if any(rel_path.startswith(var) for var in FULL_PATH_VARS):
         return rel_path
     # TODO: do we need to check base_path for absolute variables as well?
     return os.path.join(
@@ -223,7 +217,7 @@ def WriteVariable(output, variable_name, prepend=None):
     output.write("}")
 
 
-class CMakeTargetType(object):
+class CMakeTargetType:
     def __init__(self, command, modifier, property_modifier):
         self.command = command
         self.modifier = modifier
@@ -263,7 +257,7 @@ def WriteActions(target_name, actions, extra_sources, extra_deps, path_to_gyp, o
   """
     for action in actions:
         action_name = StringToCMakeTargetName(action["action_name"])
-        action_target_name = "%s__%s" % (target_name, action_name)
+        action_target_name = f"{target_name}__{action_name}"
 
         inputs = action["inputs"]
         inputs_name = action_target_name + "__input"
@@ -282,7 +276,7 @@ def WriteActions(target_name, actions, extra_sources, extra_deps, path_to_gyp, o
 
         # Build up a list of outputs.
         # Collect the output dirs we'll need.
-        dirs = set(dir for dir in (os.path.dirname(o) for o in outputs) if dir)
+        dirs = {dir for dir in (os.path.dirname(o) for o in outputs) if dir}
 
         if int(action.get("process_outputs_as_sources", False)):
             extra_sources.extend(zip(cmake_outputs, outputs))
@@ -334,7 +328,7 @@ def WriteActions(target_name, actions, extra_sources, extra_deps, path_to_gyp, o
 
 def NormjoinRulePathForceCMakeSource(base_path, rel_path, rule_source):
     if rel_path.startswith(("${RULE_INPUT_PATH}", "${RULE_INPUT_DIRNAME}")):
-        if any([rule_source.startswith(var) for var in FULL_PATH_VARS]):
+        if any(rule_source.startswith(var) for var in FULL_PATH_VARS):
             return rel_path
     return NormjoinPathForceCMakeSource(base_path, rel_path)
 
@@ -377,7 +371,7 @@ def WriteRules(target_name, rules, extra_sources, extra_deps, path_to_gyp, outpu
 
             # Build up a list of outputs.
             # Collect the output dirs we'll need.
-            dirs = set(dir for dir in (os.path.dirname(o) for o in outputs) if dir)
+            dirs = {dir for dir in (os.path.dirname(o) for o in outputs) if dir}
 
             # Create variables for the output, as 'local' variable will be unset.
             these_outputs = []
@@ -478,7 +472,7 @@ def WriteCopies(target_name, copies, extra_deps, path_to_gyp, output):
         extra_deps.append(copy_name)
         return
 
-    class Copy(object):
+    class Copy:
         def __init__(self, ext, command):
             self.cmake_inputs = []
             self.cmake_outputs = []
@@ -587,7 +581,7 @@ def CreateCMakeTargetFullName(qualified_target):
     return StringToCMakeTargetName(cmake_target_full_name)
 
 
-class CMakeNamer(object):
+class CMakeNamer:
     """Converts Gyp target names into CMake target names.
 
   CMake requires that target names be globally unique. One way to ensure
@@ -935,10 +929,7 @@ def WriteTarget(
         product_prefix = spec.get("product_prefix", default_product_prefix)
         product_name = spec.get("product_name", default_product_name)
         product_ext = spec.get("product_extension")
-        if product_ext:
-            product_ext = "." + product_ext
-        else:
-            product_ext = default_product_ext
+        product_ext = "." + product_ext if product_ext else default_product_ext
 
         SetTargetProperty(output, cmake_target_name, "PREFIX", product_prefix)
         SetTargetProperty(
@@ -1047,7 +1038,7 @@ def WriteTarget(
 
         # XCode settings
         xcode_settings = config.get("xcode_settings", {})
-        for xcode_setting, xcode_value in xcode_settings.viewitems():
+        for xcode_setting, xcode_value in xcode_settings.items():
             SetTargetProperty(
                 output,
                 cmake_target_name,
@@ -1285,11 +1276,11 @@ def PerformBuild(data, configurations, params):
             os.path.join(generator_dir, output_dir, config_name)
         )
         arguments = ["cmake", "-G", "Ninja"]
-        print("Generating [%s]: %s" % (config_name, arguments))
+        print(f"Generating [{config_name}]: {arguments}")
         subprocess.check_call(arguments, cwd=build_dir)
 
         arguments = ["ninja", "-C", build_dir]
-        print("Building [%s]: %s" % (config_name, arguments))
+        print(f"Building [{config_name}]: {arguments}")
         subprocess.check_call(arguments)
 
 
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py
similarity index 93%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py
index f330a04d..0ffa3bb5 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py
@@ -34,7 +34,7 @@ generator_default_variables = {
 
 
 def IsMac(params):
-    return "mac" == gyp.common.GetFlavor(params)
+    return gyp.common.GetFlavor(params) == "mac"
 
 
 def CalculateVariables(default_variables, params):
@@ -93,7 +93,7 @@ def AddCommandsForTarget(cwd, target, params, per_config_commands):
                     gyp.common.EncodePOSIXShellArgument(file),
                 )
             )
-            commands.append(dict(command=command, directory=output_dir, file=file))
+            commands.append({"command": command, "directory": output_dir, "file": file})
 
 
 def GenerateOutput(target_list, target_dicts, data, params):
@@ -108,7 +108,10 @@ def GenerateOutput(target_list, target_dicts, data, params):
         cwd = os.path.dirname(build_file)
         AddCommandsForTarget(cwd, target, params, per_config_commands)
 
-    output_dir = params["generator_flags"].get("output_dir", "out")
+    try:
+        output_dir = params["options"].generator_output
+    except (AttributeError, KeyError):
+        output_dir = params["generator_flags"].get("output_dir", "out")
     for configuration_name, commands in per_config_commands.items():
         filename = os.path.join(output_dir, configuration_name, "compile_commands.json")
         gyp.common.EnsureDirExists(filename)
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py
similarity index 98%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py
index 46f68e03..99d5c1fd 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.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.
 
-from __future__ import print_function
 
 import os
 import gyp
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py
similarity index 97%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py
index 4bd49725..52aeae60 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py
@@ -24,9 +24,7 @@ import gyp
 import gyp.common
 import gyp.msvs_emulation
 import shlex
-import xml.etree.cElementTree as ET
-
-PY3 = bytes != str
+import xml.etree.ElementTree as ET
 
 generator_wants_static_library_dependencies_adjusted = False
 
@@ -105,9 +103,7 @@ def GetAllIncludeDirectories(
             stdout=subprocess.PIPE,
             stderr=subprocess.PIPE,
         )
-        output = proc.communicate()[1]
-        if PY3:
-            output = output.decode("utf-8")
+        output = proc.communicate()[1].decode("utf-8")
         # Extract the list of include dirs from the output, which has this format:
         #   ...
         #   #include "..." search starts here:
@@ -245,19 +241,14 @@ def GetAllDefines(target_list, target_dicts, data, config_name, params, compiler
         cpp_proc = subprocess.Popen(
             args=command, cwd=".", stdin=subprocess.PIPE, stdout=subprocess.PIPE
         )
-        cpp_output = cpp_proc.communicate()[0]
-        if PY3:
-            cpp_output = cpp_output.decode("utf-8")
+        cpp_output = cpp_proc.communicate()[0].decode("utf-8")
         cpp_lines = cpp_output.split("\n")
         for cpp_line in cpp_lines:
             if not cpp_line.strip():
                 continue
             cpp_line_parts = cpp_line.split(" ", 2)
             key = cpp_line_parts[1]
-            if len(cpp_line_parts) >= 3:
-                val = cpp_line_parts[2]
-            else:
-                val = "1"
+            val = cpp_line_parts[2] if len(cpp_line_parts) >= 3 else "1"
             all_defines[key] = val
 
     return all_defines
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py
similarity index 100%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
similarity index 96%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
index 2d8aba5d..82a07ddc 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
@@ -49,7 +49,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
     # Use a banner that looks like the stock Python one and like what
     # code.interact uses by default, but tack on something to indicate what
     # locals are available, and identify gypsh.
-    banner = "Python %s on %s\nlocals.keys() = %s\ngypsh" % (
+    banner = "Python {} on {}\nlocals.keys() = {}\ngypsh".format(
         sys.version,
         sys.platform,
         repr(sorted(locals.keys())),
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py
similarity index 84%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py
index d163ae31..1b997494 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py
@@ -21,7 +21,6 @@
 # toplevel Makefile.  It may make sense to generate some .mk files on
 # the side to keep the files readable.
 
-from __future__ import print_function
 
 import os
 import re
@@ -51,7 +50,7 @@ generator_default_variables = {
 }
 
 # Make supports multiple toolsets
-generator_supports_multiple_toolsets = True
+generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested()
 
 # Request sorted dependencies in the order from dependents to dependencies.
 generator_wants_sorted_dependencies = False
@@ -100,6 +99,9 @@ def CalculateVariables(default_variables, params):
         default_variables.setdefault("OS", operating_system)
         if flavor == "aix":
             default_variables.setdefault("SHARED_LIB_SUFFIX", ".a")
+        elif flavor == "zos":
+            default_variables.setdefault("SHARED_LIB_SUFFIX", ".x")
+            COMPILABLE_EXTENSIONS.update({".pli": "pli"})
         else:
             default_variables.setdefault("SHARED_LIB_SUFFIX", ".so")
         default_variables.setdefault("SHARED_LIB_DIR", "$(builddir)/lib.$(TOOLSET)")
@@ -108,7 +110,7 @@ def CalculateVariables(default_variables, params):
 
 def CalculateGeneratorInputInfo(params):
     """Calculate the generator specific info that gets fed to input (called by
-  gyp)."""
+    gyp)."""
     generator_flags = params.get("generator_flags", {})
     android_ndk_version = generator_flags.get("android_ndk_version", None)
     # Android NDK requires a strict link order.
@@ -155,6 +157,31 @@ cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)
 quiet_cmd_link = LINK($(TOOLSET)) $@
 cmd_link = $(LINK.$(TOOLSET)) -o $@ $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,--start-group $(LD_INPUTS) $(LIBS) -Wl,--end-group
 
+# Note: this does not handle spaces in paths
+define xargs
+  $(1) $(word 1,$(2))
+$(if $(word 2,$(2)),$(call xargs,$(1),$(wordlist 2,$(words $(2)),$(2))))
+endef
+
+define write-to-file
+  @: >$(1)
+$(call xargs,@printf "%s\\n" >>$(1),$(2))
+endef
+
+OBJ_FILE_LIST := ar-file-list
+
+define create_archive
+        rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)`
+        $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2)))
+        $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST)
+endef
+
+define create_thin_archive
+        rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)`
+        $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2)))
+        $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST)
+endef
+
 # We support two kinds of shared objects (.so):
 # 1) shared_library, which is just bundling together many dependent libraries
 # into a link line.
@@ -199,6 +226,31 @@ cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
 quiet_cmd_alink_thin = AR($(TOOLSET)) $@
 cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)
 
+# Note: this does not handle spaces in paths
+define xargs
+  $(1) $(word 1,$(2))
+$(if $(word 2,$(2)),$(call xargs,$(1),$(wordlist 2,$(words $(2)),$(2))))
+endef
+
+define write-to-file
+  @: >$(1)
+$(call xargs,@printf "%s\\n" >>$(1),$(2))
+endef
+
+OBJ_FILE_LIST := ar-file-list
+
+define create_archive
+        rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)`
+        $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2)))
+        $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST)
+endef
+
+define create_thin_archive
+        rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)`
+        $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2)))
+        $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST)
+endef
+
 # Due to circular dependencies between libraries :(, we wrap the
 # special "figure out circular dependencies" flags around the entire
 # input list during linking.
@@ -238,6 +290,24 @@ cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSE
 """  # noqa: E501
 
 
+LINK_COMMANDS_OS400 = """\
+quiet_cmd_alink = AR($(TOOLSET)) $@
+cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^)
+
+quiet_cmd_alink_thin = AR($(TOOLSET)) $@
+cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^)
+
+quiet_cmd_link = LINK($(TOOLSET)) $@
+cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
+
+quiet_cmd_solink = SOLINK($(TOOLSET)) $@
+cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
+
+quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
+cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
+"""  # noqa: E501
+
+
 LINK_COMMANDS_OS390 = """\
 quiet_cmd_alink = AR($(TOOLSET)) $@
 cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
@@ -249,10 +319,10 @@ quiet_cmd_link = LINK($(TOOLSET)) $@
 cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
 
 quiet_cmd_solink = SOLINK($(TOOLSET)) $@
-cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) -Wl,DLL
+cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
 
 quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
-cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -Wl,DLL
+cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
 """  # noqa: E501
 
 
@@ -309,6 +379,7 @@ CXXFLAGS.target ?= $(CPPFLAGS) $(CXXFLAGS)
 LINK.target ?= %(LINK.target)s
 LDFLAGS.target ?= $(LDFLAGS)
 AR.target ?= $(AR)
+PLI.target ?= %(PLI.target)s
 
 # C++ apps need to be linked with g++.
 LINK ?= $(CXX.target)
@@ -320,8 +391,9 @@ CFLAGS.host ?= $(CPPFLAGS_host) $(CFLAGS_host)
 CXX.host ?= %(CXX.host)s
 CXXFLAGS.host ?= $(CPPFLAGS_host) $(CXXFLAGS_host)
 LINK.host ?= %(LINK.host)s
-LDFLAGS.host ?=
+LDFLAGS.host ?= $(LDFLAGS_host)
 AR.host ?= %(AR.host)s
+PLI.host ?= %(PLI.host)s
 
 # Define a dir function that can handle spaces.
 # http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions
@@ -401,6 +473,9 @@ quiet_cmd_copy = COPY $@
 # send stderr to /dev/null to ignore messages when linking directories.
 cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp %(copy_archive_args)s "$<" "$@")
 
+quiet_cmd_symlink = SYMLINK $@
+cmd_symlink = ln -sf "$<" "$@"
+
 %(link_commands)s
 """  # noqa: E501
     r"""
@@ -556,6 +631,15 @@ def WriteRootHeaderSuffixRules(writer):
     writer.write("\n")
 
 
+SHARED_HEADER_OS390_COMMANDS = """
+PLIFLAGS.target ?= -qlp=64 -qlimits=extname=31  $(PLIFLAGS)
+PLIFLAGS.host ?= -qlp=64 -qlimits=extname=31 $(PLIFLAGS)
+
+quiet_cmd_pli = PLI($(TOOLSET)) $@
+cmd_pli = $(PLI.$(TOOLSET)) $(GYP_PLIFLAGS) $(PLIFLAGS.$(TOOLSET)) -c $< && \
+          if [ -f $(notdir $@) ]; then /bin/cp $(notdir $@) $@; else true; fi
+"""
+
 SHARED_HEADER_SUFFIX_RULES_COMMENT1 = """\
 # Suffix rules, putting all outputs into $(obj).
 """
@@ -597,10 +681,7 @@ COMPILABLE_EXTENSIONS = {
 
 def Compilable(filename):
     """Return true if the file is compilable (should be in OBJS)."""
-    for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS):
-        if res:
-            return True
-    return False
+    return any(res for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS))
 
 
 def Linkable(filename):
@@ -615,15 +696,15 @@ def Target(filename):
 
 def EscapeShellArgument(s):
     """Quotes an argument so that it will be interpreted literally by a POSIX
-     shell. Taken from
-     http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-ossystem-calls-in-python
-     """
+    shell. Taken from
+    http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-ossystem-calls-in-python
+    """
     return "'" + s.replace("'", "'\\''") + "'"
 
 
 def EscapeMakeVariableExpansion(s):
     """Make has its own variable expansion syntax using $. We must escape it for
-     string to be interpreted literally."""
+    string to be interpreted literally."""
     return s.replace("$", "$$")
 
 
@@ -638,7 +719,7 @@ def EscapeCppDefine(s):
 
 def QuoteIfNecessary(string):
     """TODO: Should this ideally be replaced with one or more of the above
-     functions?"""
+    functions?"""
     if '"' in string:
         string = '"' + string.replace('"', '\\"') + '"'
     return string
@@ -679,11 +760,11 @@ target_outputs = {}
 target_link_deps = {}
 
 
-class MakefileWriter(object):
+class MakefileWriter:
     """MakefileWriter packages up the writing of one target-specific foobar.mk.
 
-  Its only real entry point is Write(), and is mostly used for namespacing.
-  """
+    Its only real entry point is Write(), and is mostly used for namespacing.
+    """
 
     def __init__(self, generator_flags, flavor):
         self.generator_flags = generator_flags
@@ -694,7 +775,7 @@ class MakefileWriter(object):
         self.suffix_rules_objdir2 = {}
 
         # Generate suffix rules for all compilable extensions.
-        for ext in COMPILABLE_EXTENSIONS.keys():
+        for ext in COMPILABLE_EXTENSIONS:
             # Suffix rules for source folder.
             self.suffix_rules_srcdir.update(
                 {
@@ -737,14 +818,14 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     ):
         """The main entry point: writes a .mk file for a single target.
 
-    Arguments:
-      qualified_target: target we're generating
-      base_path: path relative to source root we're building in, used to resolve
-                 target-relative paths
-      output_filename: output .mk file name to write
-      spec, configs: gyp info
-      part_of_all: flag indicating this target is part of 'all'
-    """
+        Arguments:
+          qualified_target: target we're generating
+          base_path: path relative to source root we're building in, used to resolve
+                     target-relative paths
+          output_filename: output .mk file name to write
+          spec, configs: gyp info
+          part_of_all: flag indicating this target is part of 'all'
+        """
         gyp.common.EnsureDirExists(output_filename)
 
         self.fp = open(output_filename, "w")
@@ -844,7 +925,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
             sources = [x for x in all_sources if Compilable(x)]
             if sources:
                 self.WriteLn(SHARED_HEADER_SUFFIX_RULES_COMMENT1)
-                extensions = set([os.path.splitext(s)[1] for s in sources])
+                extensions = {os.path.splitext(s)[1] for s in sources}
                 for ext in extensions:
                     if ext in self.suffix_rules_srcdir:
                         self.WriteLn(self.suffix_rules_srcdir[ext])
@@ -888,15 +969,15 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     def WriteSubMake(self, output_filename, makefile_path, targets, build_dir):
         """Write a "sub-project" Makefile.
 
-    This is a small, wrapper Makefile that calls the top-level Makefile to build
-    the targets from a single gyp file (i.e. a sub-project).
+        This is a small, wrapper Makefile that calls the top-level Makefile to build
+        the targets from a single gyp file (i.e. a sub-project).
 
-    Arguments:
-      output_filename: sub-project Makefile name to write
-      makefile_path: path to the top-level Makefile
-      targets: list of "all" targets for this sub-project
-      build_dir: build output directory, relative to the sub-project
-    """
+        Arguments:
+          output_filename: sub-project Makefile name to write
+          makefile_path: path to the top-level Makefile
+          targets: list of "all" targets for this sub-project
+          build_dir: build output directory, relative to the sub-project
+        """
         gyp.common.EnsureDirExists(output_filename)
         self.fp = open(output_filename, "w")
         self.fp.write(header)
@@ -910,7 +991,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
         self.WriteLn("all:")
         if makefile_path:
             makefile_path = " -C " + makefile_path
-        self.WriteLn("\t$(MAKE)%s %s" % (makefile_path, " ".join(targets)))
+        self.WriteLn("\t$(MAKE){} {}".format(makefile_path, " ".join(targets)))
         self.fp.close()
 
     def WriteActions(
@@ -923,17 +1004,17 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     ):
         """Write Makefile code for any 'actions' from the gyp input.
 
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   actions (used to make other pieces dependent on these
-                   actions)
-    part_of_all: flag indicating this target is part of 'all'
-    """
+        extra_sources: a list that will be filled in with newly generated source
+                       files, if any
+        extra_outputs: a list that will be filled in with any outputs of these
+                       actions (used to make other pieces dependent on these
+                       actions)
+        part_of_all: flag indicating this target is part of 'all'
+        """
         env = self.GetSortedXcodeEnv()
         for action in actions:
             name = StringToMakefileVariable(
-                "%s_%s" % (self.qualified_target, action["action_name"])
+                "{}_{}".format(self.qualified_target, action["action_name"])
             )
             self.WriteLn('### Rules for action "%s":' % action["action_name"])
             inputs = action["inputs"]
@@ -960,9 +1041,11 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                 ]
             command = gyp.common.EncodePOSIXShellList(action_commands)
             if "message" in action:
-                self.WriteLn("quiet_cmd_%s = ACTION %s $@" % (name, action["message"]))
+                self.WriteLn(
+                    "quiet_cmd_{} = ACTION {} $@".format(name, action["message"])
+                )
             else:
-                self.WriteLn("quiet_cmd_%s = ACTION %s $@" % (name, name))
+                self.WriteLn(f"quiet_cmd_{name} = ACTION {name} $@")
             if len(dirs) > 0:
                 command = "mkdir -p %s" % " ".join(dirs) + "; " + command
 
@@ -980,12 +1063,20 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
             # libraries, but until everything is made cross-compile safe, also use
             # target libraries.
             # TODO(piman): when everything is cross-compile safe, remove lib.target
-            self.WriteLn(
-                "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:"
-                "$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
-                "export LD_LIBRARY_PATH; "
-                "%s%s" % (name, cd_action, command)
-            )
+            if self.flavor in {"zos", "aix"}:
+                self.WriteLn(
+                    "cmd_%s = LIBPATH=$(builddir)/lib.host:"
+                    "$(builddir)/lib.target:$$LIBPATH; "
+                    "export LIBPATH; "
+                    "%s%s" % (name, cd_action, command)
+                )
+            else:
+                self.WriteLn(
+                    "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:"
+                    "$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
+                    "export LD_LIBRARY_PATH; "
+                    "%s%s" % (name, cd_action, command)
+                )
             self.WriteLn()
             outputs = [self.Absolutify(o) for o in outputs]
             # The makefile rules are all relative to the top dir, but the gyp actions
@@ -1022,7 +1113,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
 
             # Stuff the outputs in a variable so we can refer to them later.
             outputs_variable = "action_%s_outputs" % name
-            self.WriteLn("%s := %s" % (outputs_variable, " ".join(outputs)))
+            self.WriteLn("{} := {}".format(outputs_variable, " ".join(outputs)))
             extra_outputs.append("$(%s)" % outputs_variable)
             self.WriteLn()
 
@@ -1038,16 +1129,16 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     ):
         """Write Makefile code for any 'rules' from the gyp input.
 
-    extra_sources: a list that will be filled in with newly generated source
-                   files, if any
-    extra_outputs: a list that will be filled in with any outputs of these
-                   rules (used to make other pieces dependent on these rules)
-    part_of_all: flag indicating this target is part of 'all'
-    """
+        extra_sources: a list that will be filled in with newly generated source
+                       files, if any
+        extra_outputs: a list that will be filled in with any outputs of these
+                       rules (used to make other pieces dependent on these rules)
+        part_of_all: flag indicating this target is part of 'all'
+        """
         env = self.GetSortedXcodeEnv()
         for rule in rules:
             name = StringToMakefileVariable(
-                "%s_%s" % (self.qualified_target, rule["rule_name"])
+                "{}_{}".format(self.qualified_target, rule["rule_name"])
             )
             count = 0
             self.WriteLn("### Generated for rule %s:" % name)
@@ -1175,10 +1266,10 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     def WriteCopies(self, copies, extra_outputs, part_of_all):
         """Write Makefile code for any 'copies' from the gyp input.
 
-    extra_outputs: a list that will be filled in with any outputs of this action
-                   (used to make other pieces dependent on this action)
-    part_of_all: flag indicating this target is part of 'all'
-    """
+        extra_outputs: a list that will be filled in with any outputs of this action
+                       (used to make other pieces dependent on this action)
+        part_of_all: flag indicating this target is part of 'all'
+        """
         self.WriteLn("### Generated for copy rule.")
 
         variable = StringToMakefileVariable(self.qualified_target + "_copies")
@@ -1206,7 +1297,9 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                 path = gyp.xcode_emulation.ExpandEnvVars(path, env)
                 self.WriteDoCmd([output], [path], "copy", part_of_all)
                 outputs.append(output)
-        self.WriteLn("%s = %s" % (variable, " ".join(QuoteSpaces(o) for o in outputs)))
+        self.WriteLn(
+            "{} = {}".format(variable, " ".join(QuoteSpaces(o) for o in outputs))
+        )
         extra_outputs.append("$(%s)" % variable)
         self.WriteLn()
 
@@ -1278,15 +1371,15 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
         precompiled_header,
     ):
         """Write Makefile code for any 'sources' from the gyp input.
-    These are source files necessary to build the current target.
-
-    configs, deps, sources: input from gyp.
-    extra_outputs: a list of extra outputs this action should be dependent on;
-                   used to serialize action/rules before compilation
-    extra_link_deps: a list that will be filled in with any outputs of
-                     compilation (to be used in link lines)
-    part_of_all: flag indicating this target is part of 'all'
-    """
+        These are source files necessary to build the current target.
+
+        configs, deps, sources: input from gyp.
+        extra_outputs: a list of extra outputs this action should be dependent on;
+                       used to serialize action/rules before compilation
+        extra_link_deps: a list that will be filled in with any outputs of
+                         compilation (to be used in link lines)
+        part_of_all: flag indicating this target is part of 'all'
+        """
 
         # Write configuration-specific variables for CFLAGS, etc.
         for configname in sorted(configs.keys()):
@@ -1300,8 +1393,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
 
             if self.flavor == "mac":
                 cflags = self.xcode_settings.GetCflags(
-                    configname,
-                    arch=config.get('xcode_configuration_platform')
+                    configname, arch=config.get("xcode_configuration_platform")
                 )
                 cflags_c = self.xcode_settings.GetCflagsC(configname)
                 cflags_cc = self.xcode_settings.GetCflagsCC(configname)
@@ -1364,7 +1456,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
         if pchdeps:
             self.WriteLn("# Dependencies from obj files to their precompiled headers")
             for source, obj, gch in pchdeps:
-                self.WriteLn("%s: %s" % (obj, gch))
+                self.WriteLn(f"{obj}: {gch}")
             self.WriteLn("# End precompiled header dependencies")
 
         if objs:
@@ -1436,12 +1528,12 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                 "mm": "GYP_PCH_OBJCXXFLAGS",
             }[lang]
             self.WriteLn(
-                "%s: %s := %s " % (gch, var_name, lang_flag) + "$(DEFS_$(BUILDTYPE)) "
+                f"{gch}: {var_name} := {lang_flag} " + "$(DEFS_$(BUILDTYPE)) "
                 "$(INCS_$(BUILDTYPE)) "
                 "$(CFLAGS_$(BUILDTYPE)) " + extra_flags
             )
 
-            self.WriteLn("%s: %s FORCE_DO_CMD" % (gch, input))
+            self.WriteLn(f"{gch}: {input} FORCE_DO_CMD")
             self.WriteLn("\t@$(call do_cmd,pch_%s,1)" % lang)
             self.WriteLn("")
             assert " " not in gch, "Spaces in gch filenames not supported (%s)" % gch
@@ -1451,9 +1543,9 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     def ComputeOutputBasename(self, spec):
         """Return the 'output basename' of a gyp spec.
 
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      'libfoobar.so'
-    """
+        E.g., the loadable module 'foobar' in directory 'baz' will produce
+          'libfoobar.so'
+        """
         assert not self.is_mac_bundle
 
         if self.flavor == "mac" and self.type in (
@@ -1478,6 +1570,8 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
             target_prefix = "lib"
             if self.flavor == "aix":
                 target_ext = ".a"
+            elif self.flavor == "zos":
+                target_ext = ".x"
             else:
                 target_ext = ".so"
         elif self.type == "none":
@@ -1510,9 +1604,9 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     def ComputeOutput(self, spec):
         """Return the 'output' (full output path) of a gyp spec.
 
-    E.g., the loadable module 'foobar' in directory 'baz' will produce
-      '$(obj)/baz/libfoobar.so'
-    """
+        E.g., the loadable module 'foobar' in directory 'baz' will produce
+          '$(obj)/baz/libfoobar.so'
+        """
         assert not self.is_mac_bundle
 
         path = os.path.join("$(obj)." + self.toolset, self.path)
@@ -1535,10 +1629,10 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     def ComputeDeps(self, spec):
         """Compute the dependencies of a gyp spec.
 
-    Returns a tuple (deps, link_deps), where each is a list of
-    filenames that will need to be put in front of make for either
-    building (deps) or linking (link_deps).
-    """
+        Returns a tuple (deps, link_deps), where each is a list of
+        filenames that will need to be put in front of make for either
+        building (deps) or linking (link_deps).
+        """
         deps = []
         link_deps = []
         if "dependencies" in spec:
@@ -1558,6 +1652,14 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
             # link_deps.extend(spec.get('libraries', []))
         return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps))
 
+    def GetSharedObjectFromSidedeck(self, sidedeck):
+        """Return the shared object files based on sidedeck"""
+        return re.sub(r"\.x$", ".so", sidedeck)
+
+    def GetUnversionedSidedeckFromSidedeck(self, sidedeck):
+        """Return the shared object files based on sidedeck"""
+        return re.sub(r"\.\d+\.x$", ".x", sidedeck)
+
     def WriteDependencyOnExtraOutputs(self, target, extra_outputs):
         self.WriteMakeRule(
             [self.output_binary],
@@ -1571,11 +1673,11 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     ):
         """Write Makefile code to produce the final target of the gyp spec.
 
-    spec, configs: input from gyp.
-    deps, link_deps: dependency lists; see ComputeDeps()
-    extra_outputs: any extra outputs that our target should depend on
-    part_of_all: flag indicating this target is part of 'all'
-    """
+        spec, configs: input from gyp.
+        deps, link_deps: dependency lists; see ComputeDeps()
+        extra_outputs: any extra outputs that our target should depend on
+        part_of_all: flag indicating this target is part of 'all'
+        """
 
         self.WriteLn("### Rules for final target.")
 
@@ -1597,7 +1699,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                         configname,
                         generator_default_variables["PRODUCT_DIR"],
                         lambda p: Sourceify(self.Absolutify(p)),
-                        arch=config.get('xcode_configuration_platform')
+                        arch=config.get("xcode_configuration_platform"),
                     )
 
                     # TARGET_POSTBUILDS_$(BUILDTYPE) is added to postbuilds later on.
@@ -1766,21 +1868,35 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                 self.flavor not in ("mac", "openbsd", "netbsd", "win")
                 and not self.is_standalone_static_library
             ):
-                self.WriteDoCmd(
-                    [self.output_binary],
-                    link_deps,
-                    "alink_thin",
-                    part_of_all,
-                    postbuilds=postbuilds,
-                )
+                if self.flavor in ("linux", "android"):
+                    self.WriteMakeRule(
+                        [self.output_binary],
+                        link_deps,
+                        actions=["$(call create_thin_archive,$@,$^)"],
+                    )
+                else:
+                    self.WriteDoCmd(
+                        [self.output_binary],
+                        link_deps,
+                        "alink_thin",
+                        part_of_all,
+                        postbuilds=postbuilds,
+                    )
             else:
-                self.WriteDoCmd(
-                    [self.output_binary],
-                    link_deps,
-                    "alink",
-                    part_of_all,
-                    postbuilds=postbuilds,
-                )
+                if self.flavor in ("linux", "android"):
+                    self.WriteMakeRule(
+                        [self.output_binary],
+                        link_deps,
+                        actions=["$(call create_archive,$@,$^)"],
+                    )
+                else:
+                    self.WriteDoCmd(
+                        [self.output_binary],
+                        link_deps,
+                        "alink",
+                        part_of_all,
+                        postbuilds=postbuilds,
+                    )
         elif self.type == "shared_library":
             self.WriteLn(
                 "%s: LD_INPUTS := %s"
@@ -1796,6 +1912,17 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                 part_of_all,
                 postbuilds=postbuilds,
             )
+            # z/OS has a .so target as well as a sidedeck .x target
+            if self.flavor == "zos":
+                self.WriteLn(
+                    "%s: %s"
+                    % (
+                        QuoteSpaces(
+                            self.GetSharedObjectFromSidedeck(self.output_binary)
+                        ),
+                        QuoteSpaces(self.output_binary),
+                    )
+                )
         elif self.type == "loadable_module":
             for link_dep in link_deps:
                 assert " " not in link_dep, (
@@ -1853,17 +1980,16 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
             else:
                 file_desc = "executable"
             install_path = self._InstallableTargetInstallPath()
-            installable_deps = [self.output]
+            installable_deps = []
+            if self.flavor != "zos":
+                installable_deps.append(self.output)
             if (
                 self.flavor == "mac"
                 and "product_dir" not in spec
                 and self.toolset == "target"
             ):
                 # On mac, products are created in install_path immediately.
-                assert install_path == self.output, "%s != %s" % (
-                    install_path,
-                    self.output,
-                )
+                assert install_path == self.output, f"{install_path} != {self.output}"
 
             # Point the target alias to the final binary output.
             self.WriteMakeRule(
@@ -1878,15 +2004,49 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                     comment="Copy this to the %s output path." % file_desc,
                     part_of_all=part_of_all,
                 )
-                installable_deps.append(install_path)
-            if self.output != self.alias and self.alias != self.target:
+                if self.flavor != "zos":
+                    installable_deps.append(install_path)
+            if self.flavor == "zos" and self.type == "shared_library":
+                # lib.target/libnode.so has a dependency on $(obj).target/libnode.so
+                self.WriteDoCmd(
+                    [self.GetSharedObjectFromSidedeck(install_path)],
+                    [self.GetSharedObjectFromSidedeck(self.output)],
+                    "copy",
+                    comment="Copy this to the %s output path." % file_desc,
+                    part_of_all=part_of_all,
+                )
+                # Create a symlink of libnode.x to libnode.version.x
+                self.WriteDoCmd(
+                    [self.GetUnversionedSidedeckFromSidedeck(install_path)],
+                    [install_path],
+                    "symlink",
+                    comment="Symlnk this to the %s output path." % file_desc,
+                    part_of_all=part_of_all,
+                )
+                # Place libnode.version.so and libnode.x symlink in lib.target dir
+                installable_deps.append(self.GetSharedObjectFromSidedeck(install_path))
+                installable_deps.append(
+                    self.GetUnversionedSidedeckFromSidedeck(install_path)
+                )
+            if self.alias not in (self.output, self.target):
                 self.WriteMakeRule(
                     [self.alias],
                     installable_deps,
                     comment="Short alias for building this %s." % file_desc,
                     phony=True,
                 )
-            if part_of_all:
+            if self.flavor == "zos" and self.type == "shared_library":
+                # Make sure that .x symlink target is run
+                self.WriteMakeRule(
+                    ["all"],
+                    [
+                        self.GetUnversionedSidedeckFromSidedeck(install_path),
+                        self.GetSharedObjectFromSidedeck(install_path),
+                    ],
+                    comment='Add %s to "all" target.' % file_desc,
+                    phony=True,
+                )
+            elif part_of_all:
                 self.WriteMakeRule(
                     ["all"],
                     [install_path],
@@ -1897,24 +2057,24 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     def WriteList(self, value_list, variable=None, prefix="", quoter=QuoteIfNecessary):
         """Write a variable definition that is a list of values.
 
-    E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
-         foo = blaha blahb
-    but in a pretty-printed style.
-    """
+        E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
+             foo = blaha blahb
+        but in a pretty-printed style.
+        """
         values = ""
         if value_list:
             value_list = [quoter(prefix + value) for value in value_list]
             values = " \\\n\t" + " \\\n\t".join(value_list)
-        self.fp.write("%s :=%s\n\n" % (variable, values))
+        self.fp.write(f"{variable} :={values}\n\n")
 
     def WriteDoCmd(
         self, outputs, inputs, command, part_of_all, comment=None, postbuilds=False
     ):
         """Write a Makefile rule that uses do_cmd.
 
-    This makes the outputs dependent on the command line that was run,
-    as well as support the V= make command line flag.
-    """
+        This makes the outputs dependent on the command line that was run,
+        as well as support the V= make command line flag.
+        """
         suffix = ""
         if postbuilds:
             assert "," not in command
@@ -1922,7 +2082,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
         self.WriteMakeRule(
             outputs,
             inputs,
-            actions=["$(call do_cmd,%s%s)" % (command, suffix)],
+            actions=[f"$(call do_cmd,{command}{suffix})"],
             comment=comment,
             command=command,
             force=True,
@@ -1947,18 +2107,18 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     ):
         """Write a Makefile rule, with some extra tricks.
 
-    outputs: a list of outputs for the rule (note: this is not directly
-             supported by make; see comments below)
-    inputs: a list of inputs for the rule
-    actions: a list of shell commands to run for the rule
-    comment: a comment to put in the Makefile above the rule (also useful
-             for making this Python script's code self-documenting)
-    order_only: if true, makes the dependency order-only
-    force: if true, include FORCE_DO_CMD as an order-only dep
-    phony: if true, the rule does not actually generate the named output, the
-           output is just a name to run the rule
-    command: (optional) command name to generate unambiguous labels
-    """
+        outputs: a list of outputs for the rule (note: this is not directly
+                 supported by make; see comments below)
+        inputs: a list of inputs for the rule
+        actions: a list of shell commands to run for the rule
+        comment: a comment to put in the Makefile above the rule (also useful
+                 for making this Python script's code self-documenting)
+        order_only: if true, makes the dependency order-only
+        force: if true, include FORCE_DO_CMD as an order-only dep
+        phony: if true, the rule does not actually generate the named output, the
+               output is just a name to run the rule
+        command: (optional) command name to generate unambiguous labels
+        """
         outputs = [QuoteSpaces(o) for o in outputs]
         inputs = [QuoteSpaces(i) for i in inputs]
 
@@ -1974,11 +2134,11 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
             # Order only rule: Just write a simple rule.
             # TODO(evanm): just make order_only a list of deps instead of this hack.
             self.WriteLn(
-                "%s: | %s%s" % (" ".join(outputs), " ".join(inputs), force_append)
+                "{}: | {}{}".format(" ".join(outputs), " ".join(inputs), force_append)
             )
         elif len(outputs) == 1:
             # Regular rule, one output: Just write a simple rule.
-            self.WriteLn("%s: %s%s" % (outputs[0], " ".join(inputs), force_append))
+            self.WriteLn("{}: {}{}".format(outputs[0], " ".join(inputs), force_append))
         else:
             # Regular rule, more than one output: Multiple outputs are tricky in
             # make. We will write three rules:
@@ -1994,10 +2154,12 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
                 (command or self.target).encode("utf-8")
             ).hexdigest()
             intermediate = "%s.intermediate" % cmddigest
-            self.WriteLn("%s: %s" % (" ".join(outputs), intermediate))
+            self.WriteLn("{}: {}".format(" ".join(outputs), intermediate))
             self.WriteLn("\t%s" % "@:")
-            self.WriteLn("%s: %s" % (".INTERMEDIATE", intermediate))
-            self.WriteLn("%s: %s%s" % (intermediate, " ".join(inputs), force_append))
+            self.WriteLn("{}: {}".format(".INTERMEDIATE", intermediate))
+            self.WriteLn(
+                "{}: {}{}".format(intermediate, " ".join(inputs), force_append)
+            )
             actions.insert(0, "$(call do_cmd,touch)")
 
         if actions:
@@ -2008,16 +2170,16 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
     def WriteAndroidNdkModuleRule(self, module_name, all_sources, link_deps):
         """Write a set of LOCAL_XXX definitions for Android NDK.
 
-    These variable definitions will be used by Android NDK but do nothing for
-    non-Android applications.
+        These variable definitions will be used by Android NDK but do nothing for
+        non-Android applications.
 
-    Arguments:
-      module_name: Android NDK module name, which must be unique among all
-          module names.
-      all_sources: A list of source files (will be filtered by Compilable).
-      link_deps: A list of link dependencies, which must be sorted in
-          the order from dependencies to dependents.
-    """
+        Arguments:
+          module_name: Android NDK module name, which must be unique among all
+              module names.
+          all_sources: A list of source files (will be filtered by Compilable).
+          link_deps: A list of link dependencies, which must be sorted in
+              the order from dependencies to dependents.
+        """
         if self.type not in ("executable", "shared_library", "static_library"):
             return
 
@@ -2129,14 +2291,14 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
             #  export foo := a\ b
             # it does not -- the backslash is written to the env as literal character.
             # So don't escape spaces in |env[k]|.
-            self.WriteLn("%s: export %s := %s" % (QuoteSpaces(target), k, v))
+            self.WriteLn(f"{QuoteSpaces(target)}: export {k} := {v}")
 
     def Objectify(self, path):
         """Convert a path to its output directory form."""
         if "$(" in path:
             path = path.replace("$(obj)/", "$(obj).%s/$(TARGET)/" % self.toolset)
         if "$(obj)" not in path:
-            path = "$(obj).%s/$(TARGET)/%s" % (self.toolset, path)
+            path = f"$(obj).{self.toolset}/$(TARGET)/{path}"
         return path
 
     def Pchify(self, path, lang):
@@ -2144,14 +2306,14 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
         path = self.Absolutify(path)
         if "$(" in path:
             path = path.replace(
-                "$(obj)/", "$(obj).%s/$(TARGET)/pch-%s" % (self.toolset, lang)
+                "$(obj)/", f"$(obj).{self.toolset}/$(TARGET)/pch-{lang}"
             )
             return path
-        return "$(obj).%s/$(TARGET)/pch-%s/%s" % (self.toolset, lang, path)
+        return f"$(obj).{self.toolset}/$(TARGET)/pch-{lang}/{path}"
 
     def Absolutify(self, path):
         """Convert a subdirectory-relative path into a base-relative path.
-    Skips over paths that contain variables."""
+        Skips over paths that contain variables."""
         if "$(" in path:
             # Don't call normpath in this case, as it might collapse the
             # path too aggressively if it features '..'. However it's still
@@ -2180,6 +2342,9 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
         #    # Install all shared libs into a common directory (per toolset) for
         #    # convenient access with LD_LIBRARY_PATH.
         #    return "$(builddir)/lib.%s/%s" % (self.toolset, self.alias)
+        if self.flavor == "zos" and self.type == "shared_library":
+            return "$(builddir)/lib.%s/%s" % (self.toolset, self.alias)
+
         return "$(builddir)/" + self.alias
 
 
@@ -2219,7 +2384,7 @@ def PerformBuild(data, configurations, params):
         if options.toplevel_dir and options.toplevel_dir != ".":
             arguments += "-C", options.toplevel_dir
         arguments.append("BUILDTYPE=" + config)
-        print("Building [%s]: %s" % (config, arguments))
+        print(f"Building [{config}]: {arguments}")
         subprocess.check_call(arguments)
 
 
@@ -2253,7 +2418,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
     # away when we add verification that all targets have the
     # necessary configurations.
     default_configuration = None
-    toolsets = set([target_dicts[target]["toolset"] for target in target_list])
+    toolsets = {target_dicts[target]["toolset"] for target in target_list}
     for target in target_list:
         spec = target_dicts[target]
         if spec["default_configuration"] != "Default":
@@ -2291,10 +2456,12 @@ def GenerateOutput(target_list, target_dicts, data, params):
         "AR.target": GetEnvironFallback(("AR_target", "AR"), "$(AR)"),
         "CXX.target": GetEnvironFallback(("CXX_target", "CXX"), "$(CXX)"),
         "LINK.target": GetEnvironFallback(("LINK_target", "LINK"), "$(LINK)"),
+        "PLI.target": GetEnvironFallback(("PLI_target", "PLI"), "pli"),
         "CC.host": GetEnvironFallback(("CC_host", "CC"), "gcc"),
         "AR.host": GetEnvironFallback(("AR_host", "AR"), "ar"),
         "CXX.host": GetEnvironFallback(("CXX_host", "CXX"), "g++"),
         "LINK.host": GetEnvironFallback(("LINK_host", "LINK"), "$(CXX.host)"),
+        "PLI.host": GetEnvironFallback(("PLI_host", "PLI"), "pli"),
     }
     if flavor == "mac":
         flock_command = "./gyp-mac-tool flock"
@@ -2310,16 +2477,36 @@ def GenerateOutput(target_list, target_dicts, data, params):
         header_params.update({"link_commands": LINK_COMMANDS_ANDROID})
     elif flavor == "zos":
         copy_archive_arguments = "-fPR"
-        makedep_arguments = "-qmakedep=gcc"
+        CC_target = GetEnvironFallback(("CC_target", "CC"), "njsc")
+        makedep_arguments = "-MMD"
+        if CC_target == "clang":
+            CC_host = GetEnvironFallback(("CC_host", "CC"), "clang")
+            CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "clang++")
+            CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "clang++")
+        elif CC_target == "ibm-clang64":
+            CC_host = GetEnvironFallback(("CC_host", "CC"), "ibm-clang64")
+            CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "ibm-clang++64")
+            CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "ibm-clang++64")
+        elif CC_target == "ibm-clang":
+            CC_host = GetEnvironFallback(("CC_host", "CC"), "ibm-clang")
+            CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "ibm-clang++")
+            CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "ibm-clang++")
+        else:
+            # Node.js versions prior to v18:
+            makedep_arguments = "-qmakedep=gcc"
+            CC_host = GetEnvironFallback(("CC_host", "CC"), "njsc")
+            CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "njsc++")
+            CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "njsc++")
         header_params.update(
             {
                 "copy_archive_args": copy_archive_arguments,
                 "makedep_args": makedep_arguments,
                 "link_commands": LINK_COMMANDS_OS390,
-                "CC.target": GetEnvironFallback(("CC_target", "CC"), "njsc"),
-                "CXX.target": GetEnvironFallback(("CXX_target", "CXX"), "njsc++"),
-                "CC.host": GetEnvironFallback(("CC_host", "CC"), "njsc"),
-                "CXX.host": GetEnvironFallback(("CXX_host", "CXX"), "njsc++"),
+                "extra_commands": SHARED_HEADER_OS390_COMMANDS,
+                "CC.target": CC_target,
+                "CXX.target": CXX_target,
+                "CC.host": CC_host,
+                "CXX.host": CXX_host,
             }
         )
     elif flavor == "solaris":
@@ -2328,7 +2515,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
             {
                 "copy_archive_args": copy_archive_arguments,
                 "flock": "./gyp-flock-tool flock",
-                "flock_index": 2
+                "flock_index": 2,
             }
         )
     elif flavor == "freebsd":
@@ -2347,6 +2534,16 @@ def GenerateOutput(target_list, target_dicts, data, params):
                 "flock_index": 2,
             }
         )
+    elif flavor == "os400":
+        copy_archive_arguments = "-pPRf"
+        header_params.update(
+            {
+                "copy_archive_args": copy_archive_arguments,
+                "link_commands": LINK_COMMANDS_OS400,
+                "flock": "./gyp-flock-tool flock",
+                "flock_index": 2,
+            }
+        )
 
     build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
     make_global_settings_array = data[build_file].get("make_global_settings", [])
@@ -2362,7 +2559,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
             value = "$(abspath %s)" % value
         wrapper = wrappers.get(key)
         if wrapper:
-            value = "%s %s" % (wrapper, value)
+            value = f"{wrapper} {value}"
             del wrappers[key]
         if key in ("CC", "CC.host", "CXX", "CXX.host"):
             make_global_settings += (
@@ -2372,10 +2569,10 @@ def GenerateOutput(target_list, target_dicts, data, params):
             env_key = key.replace(".", "_")  # CC.host -> CC_host
             if env_key in os.environ:
                 value = os.environ[env_key]
-            make_global_settings += "  %s = %s\n" % (key, value)
+            make_global_settings += f"  {key} = {value}\n"
             make_global_settings += "endif\n"
         else:
-            make_global_settings += "%s ?= %s\n" % (key, value)
+            make_global_settings += f"{key} ?= {value}\n"
     # TODO(ukai): define cmd when only wrapper is specified in
     # make_global_settings.
 
@@ -2413,8 +2610,8 @@ def GenerateOutput(target_list, target_dicts, data, params):
 
         this_make_global_settings = data[build_file].get("make_global_settings", [])
         assert make_global_settings_array == this_make_global_settings, (
-            "make_global_settings needs to be the same for all targets. %s vs. %s"
-            % (this_make_global_settings, make_global_settings)
+            "make_global_settings needs to be the same for all targets "
+            f"{this_make_global_settings} vs. {make_global_settings}"
         )
 
         build_files.add(gyp.common.RelativePath(build_file, options.toplevel_dir))
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
similarity index 97%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
index 32bf4746..13b0794b 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.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.
 
-from __future__ import print_function
 
 import ntpath
 import os
@@ -26,8 +25,6 @@ import gyp.MSVSVersion as MSVSVersion
 from gyp.common import GypError
 from gyp.common import OrderedSet
 
-PY3 = bytes != str
-
 
 # Regular expression for validating Visual Studio GUIDs.  If the GUID
 # contains lowercase hex letters, MSVS will be fine. However,
@@ -120,9 +117,7 @@ def _GetDomainAndUserName():
             call = subprocess.Popen(
                 ["net", "config", "Workstation"], stdout=subprocess.PIPE
             )
-            config = call.communicate()[0]
-            if PY3:
-                config = config.decode("utf-8")
+            config = call.communicate()[0].decode("utf-8")
             username_re = re.compile(r"^User name\s+(\S+)", re.MULTILINE)
             username_match = username_re.search(config)
             if username_match:
@@ -157,7 +152,7 @@ def _NormalizedSource(source):
     return source
 
 
-def _FixPath(path):
+def _FixPath(path, separator="\\"):
     """Convert paths to a form that will make sense in a vcproj file.
 
   Arguments:
@@ -169,13 +164,16 @@ def _FixPath(path):
         fixpath_prefix
         and path
         and not os.path.isabs(path)
-        and not path[0] == "$"
+        and path[0] != "$"
         and not _IsWindowsAbsPath(path)
     ):
         path = os.path.join(fixpath_prefix, path)
-    path = path.replace("/", "\\")
+    if separator == "\\":
+        path = path.replace("/", "\\")
     path = _NormalizedSource(path)
-    if path and path[-1] == "\\":
+    if separator == "/":
+        path = path.replace("\\", "/")
+    if path and path[-1] == separator:
         path = path[:-1]
     return path
 
@@ -190,9 +188,9 @@ def _IsWindowsAbsPath(path):
     return path.startswith("c:") or path.startswith("C:")
 
 
-def _FixPaths(paths):
+def _FixPaths(paths, separator="\\"):
     """Fix each of the paths of the list."""
-    return [_FixPath(i) for i in paths]
+    return [_FixPath(i, separator) for i in paths]
 
 
 def _ConvertSourcesToFilterHierarchy(
@@ -283,9 +281,9 @@ def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False):
         else:
             value = [i.replace("/", "\\") for i in value]
     if not tools.get(tool_name):
-        tools[tool_name] = dict()
+        tools[tool_name] = {}
     tool = tools[tool_name]
-    if "CompileAsWinRT" == setting:
+    if setting == "CompileAsWinRT":
         return
     if tool.get(setting):
         if only_if_unset:
@@ -319,7 +317,7 @@ def _ConfigBaseName(config_name, platform_name):
 
 def _ConfigFullName(config_name, config_data):
     platform_name = _ConfigPlatform(config_data)
-    return "%s|%s" % (_ConfigBaseName(config_name, platform_name), platform_name)
+    return f"{_ConfigBaseName(config_name, platform_name)}|{platform_name}"
 
 
 def _ConfigWindowsTargetPlatformVersion(config_data, version):
@@ -340,7 +338,7 @@ def _ConfigWindowsTargetPlatformVersion(config_data, version):
             # Find a matching entry in sdk_dir\include.
             expected_sdk_dir = r"%s\include" % sdk_dir
             names = sorted(
-                [
+                (
                     x
                     for x in (
                         os.listdir(expected_sdk_dir)
@@ -348,7 +346,7 @@ def _ConfigWindowsTargetPlatformVersion(config_data, version):
                         else []
                     )
                     if x.startswith(version)
-                ],
+                ),
                 reverse=True,
             )
             if names:
@@ -414,10 +412,7 @@ def _BuildCommandLineForRuleRaw(
         return input_dir_preamble + cmd
     else:
         # Convert cat --> type to mimic unix.
-        if cmd[0] == "cat":
-            command = ["type"]
-        else:
-            command = [cmd[0].replace("/", "\\")]
+        command = ["type"] if cmd[0] == "cat" else [cmd[0].replace("/", "\\")]
         # Add call before command to ensure that commands can be tied together one
         # after the other without aborting in Incredibuild, since IB makes a bat
         # file out of the raw command string, and some commands (like python) are
@@ -425,16 +420,22 @@ def _BuildCommandLineForRuleRaw(
         command.insert(0, "call")
         # Fix the paths
         # TODO(quote): This is a really ugly heuristic, and will miss path fixing
-        #              for arguments like "--arg=path" or "/opt:path".
-        # If the argument starts with a slash or dash, it's probably a command line
-        # switch
-        arguments = [i if (i[:1] in "/-") else _FixPath(i) for i in cmd[1:]]
+        #              for arguments like "--arg=path", arg=path, or "/opt:path".
+        # If the argument starts with a slash or dash, or contains an equal sign,
+        # it's probably a command line switch.
+        # Return the path with forward slashes because the command using it might
+        # not support backslashes.
+        arguments = [
+            i if (i[:1] in "/-" or "=" in i) else _FixPath(i, "/")
+            for i in cmd[1:]
+        ]
         arguments = [i.replace("$(InputDir)", "%INPUTDIR%") for i in arguments]
         arguments = [MSVSSettings.FixVCMacroSlashes(i) for i in arguments]
         if quote_cmd:
             # Support a mode for using cmd directly.
             # Convert any paths to native form (first element is used directly).
             # TODO(quote):  regularize quoting path names throughout the module
+            command[1] = '"%s"' % command[1]
             arguments = ['"%s"' % i for i in arguments]
         # Collapse into a single command.
         return input_dir_preamble + " ".join(command + arguments)
@@ -620,7 +621,7 @@ def _GenerateNativeRulesForMSVS(p, rules, output_dir, spec, options):
     spec: the project dict
     options: global generator options
   """
-    rules_filename = "%s%s.rules" % (spec["target_name"], options.suffix)
+    rules_filename = "{}{}.rules".format(spec["target_name"], options.suffix)
     rules_file = MSVSToolFile.Writer(
         os.path.join(output_dir, rules_filename), spec["target_name"]
     )
@@ -666,7 +667,7 @@ def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to
     options: global generator options
     actions_to_add: The list of actions we will add to.
   """
-    filename = "%s_rules%s.mk" % (spec["target_name"], options.suffix)
+    filename = "{}_rules{}.mk".format(spec["target_name"], options.suffix)
     mk_file = gyp.common.WriteOnDiff(os.path.join(output_dir, filename))
     # Find cygwin style versions of some paths.
     mk_file.write('OutDirCygwin:=$(shell cygpath -u "$(OutDir)")\n')
@@ -684,7 +685,7 @@ def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to
             all_outputs.update(OrderedSet(outputs))
             # Only use one target from each rule as the dependency for
             # 'all' so we don't try to build each rule multiple times.
-            first_outputs.append(list(outputs)[0])
+            first_outputs.append(next(iter(outputs)))
             # Get the unique output directories for this rule.
             output_dirs = [os.path.split(i)[0] for i in outputs]
             for od in output_dirs:
@@ -709,7 +710,7 @@ def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to
             cmd = ['"%s"' % i for i in cmd]
             cmd = " ".join(cmd)
             # Add it to the makefile.
-            mk_file.write("%s: %s\n" % (" ".join(outputs), " ".join(inputs)))
+            mk_file.write("{}: {}\n".format(" ".join(outputs), " ".join(inputs)))
             mk_file.write("\t%s\n\n" % cmd)
     # Close up the file.
     mk_file.close()
@@ -753,7 +754,7 @@ def _EscapeEnvironmentVariableExpansion(s):
 
   Returns:
       The escaped string.
-  """  # noqa: E731,E123,E501
+  """
     s = s.replace("%", "%%")
     return s
 
@@ -1186,7 +1187,7 @@ def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config):
     precompiled_header = config.get("msvs_precompiled_header")
 
     # Prepare the list of tools as a dictionary.
-    tools = dict()
+    tools = {}
     # Add in user specified msvs_settings.
     msvs_settings = config.get("msvs_settings", {})
     MSVSSettings.ValidateMSVSSettings(msvs_settings)
@@ -1381,10 +1382,7 @@ def _GetDefines(config):
   """
     defines = []
     for d in config.get("defines", []):
-        if type(d) == list:
-            fd = "=".join([str(dpart) for dpart in d])
-        else:
-            fd = str(d)
+        fd = "=".join([str(dpart) for dpart in d]) if isinstance(d, list) else str(d)
         defines.append(fd)
     return defines
 
@@ -1575,10 +1573,10 @@ def _AdjustSourcesAndConvertToFilterHierarchy(
     # such as ../../src/modules/module1 etc.
     if version.UsesVcxproj():
         while (
-            all([isinstance(s, MSVSProject.Filter) for s in sources])
-            and len(set([s.name for s in sources])) == 1
+            all(isinstance(s, MSVSProject.Filter) for s in sources)
+            and len({s.name for s in sources}) == 1
         ):
-            assert all([len(s.contents) == 1 for s in sources])
+            assert all(len(s.contents) == 1 for s in sources)
             sources = [s.contents[0] for s in sources]
     else:
         while len(sources) == 1 and isinstance(sources[0], MSVSProject.Filter):
@@ -1595,10 +1593,7 @@ def _IdlFilesHandledNonNatively(spec, sources):
         if rule["extension"] == "idl" and int(rule.get("msvs_external_rule", 0)):
             using_idl = True
             break
-    if using_idl:
-        excluded_idl = [i for i in sources if i.endswith(".idl")]
-    else:
-        excluded_idl = []
+    excluded_idl = [i for i in sources if i.endswith(".idl")] if using_idl else []
     return excluded_idl
 
 
@@ -1782,8 +1777,8 @@ def _GetCopies(spec):
                 base_dir = posixpath.split(src_bare)[0]
                 outer_dir = posixpath.split(src_bare)[1]
                 fixed_dst = _FixPath(dst)
-                full_dst = '"%s\\%s\\"' % (fixed_dst, outer_dir)
-                cmd = 'mkdir %s 2>nul & cd "%s" && xcopy /e /f /y "%s" %s' % (
+                full_dst = f'"{fixed_dst}\\{outer_dir}\\"'
+                cmd = 'mkdir {} 2>nul & cd "{}" && xcopy /e /f /y "{}" {}'.format(
                     full_dst,
                     _FixPath(base_dir),
                     outer_dir,
@@ -1794,17 +1789,17 @@ def _GetCopies(spec):
                         [src],
                         ["dummy_copies", dst],
                         cmd,
-                        "Copying %s to %s" % (src, fixed_dst),
+                        f"Copying {src} to {fixed_dst}",
                     )
                 )
             else:
                 fix_dst = _FixPath(cpy["destination"])
-                cmd = 'mkdir "%s" 2>nul & set ERRORLEVEL=0 & copy /Y "%s" "%s"' % (
+                cmd = 'mkdir "{}" 2>nul & set ERRORLEVEL=0 & copy /Y "{}" "{}"'.format(
                     fix_dst,
                     _FixPath(src),
                     _FixPath(dst),
                 )
-                copies.append(([src], [dst], cmd, "Copying %s to %s" % (src, fix_dst)))
+                copies.append(([src], [dst], cmd, f"Copying {src} to {fix_dst}"))
     return copies
 
 
@@ -1816,7 +1811,7 @@ def _GetPathDict(root, path):
     parent, folder = os.path.split(path)
     parent_dict = _GetPathDict(root, parent)
     if folder not in parent_dict:
-        parent_dict[folder] = dict()
+        parent_dict[folder] = {}
     return parent_dict[folder]
 
 
@@ -1904,12 +1899,12 @@ def _GetPlatformOverridesOfProject(spec):
     for config_name, c in spec["configurations"].items():
         config_fullname = _ConfigFullName(config_name, c)
         platform = c.get("msvs_target_platform", _ConfigPlatform(c))
-        fixed_config_fullname = "%s|%s" % (
+        fixed_config_fullname = "{}|{}".format(
             _ConfigBaseName(config_name, _ConfigPlatform(c)),
             platform,
         )
         if spec["toolset"] == "host" and generator_supports_multiple_toolsets:
-            fixed_config_fullname = "%s|x64" % (config_name,)
+            fixed_config_fullname = f"{config_name}|x64"
         config_platform_overrides[config_fullname] = fixed_config_fullname
     return config_platform_overrides
 
@@ -2062,7 +2057,7 @@ def PerformBuild(data, configurations, params):
 
     for config in configurations:
         arguments = [devenv, sln_path, "/Build", config]
-        print("Building [%s]: %s" % (config, arguments))
+        print(f"Building [{config}]: {arguments}")
         subprocess.check_call(arguments)
 
 
@@ -2248,7 +2243,7 @@ def _AppendFiltersForMSBuild(
             if not parent_filter_name:
                 filter_name = source.name
             else:
-                filter_name = "%s\\%s" % (parent_filter_name, source.name)
+                filter_name = f"{parent_filter_name}\\{source.name}"
             # Add the filter to the group.
             filter_group.append(
                 [
@@ -2376,7 +2371,7 @@ def _GenerateRulesForMSBuild(
     _AdjustSourcesForRules(rules, sources, excluded_sources, True)
 
 
-class MSBuildRule(object):
+class MSBuildRule:
     """Used to store information used to generate an MSBuild rule.
 
   Attributes:
@@ -2575,7 +2570,7 @@ def _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules):
                 "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
                 "'true'" % (rule.tlog, rule.tlog),
                 "File": "$(IntDir)$(ProjectName).read.1.tlog",
-                "Lines": "^%%(%s.Source);%%(%s.Inputs)" % (rule.tlog, rule.tlog),
+                "Lines": f"^%({rule.tlog}.Source);%({rule.tlog}.Inputs)",
             },
         ]
         command_and_input_section = [
@@ -2921,7 +2916,7 @@ def _GetMSBuildProjectConfigurations(configurations, spec):
     group = ["ItemGroup", {"Label": "ProjectConfigurations"}]
     for (name, settings) in sorted(configurations.items()):
         configuration, platform = _GetConfigurationAndPlatform(name, settings, spec)
-        designation = "%s|%s" % (configuration, platform)
+        designation = f"{configuration}|{platform}"
         group.append(
             [
                 "ProjectConfiguration",
@@ -3010,18 +3005,26 @@ def _GetMSBuildConfigurationDetails(spec, build_file):
         msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file)
         condition = _GetConfigurationCondition(name, settings, spec)
         character_set = msbuild_attributes.get("CharacterSet")
+        vctools_version = msbuild_attributes.get("VCToolsVersion")
         config_type = msbuild_attributes.get("ConfigurationType")
         _AddConditionalProperty(properties, condition, "ConfigurationType", config_type)
+        spectre_mitigation = msbuild_attributes.get('SpectreMitigation')
+        if spectre_mitigation:
+            _AddConditionalProperty(properties, condition, "SpectreMitigation",
+                                    spectre_mitigation)
         if config_type == "Driver":
             _AddConditionalProperty(properties, condition, "DriverType", "WDM")
             _AddConditionalProperty(
                 properties, condition, "TargetVersion", _ConfigTargetVersion(settings)
             )
-        if character_set:
-            if "msvs_enable_winrt" not in spec:
-                _AddConditionalProperty(
-                    properties, condition, "CharacterSet", character_set
-                )
+        if character_set and "msvs_enable_winrt" not in spec:
+            _AddConditionalProperty(
+                properties, condition, "CharacterSet", character_set
+            )
+        if vctools_version and "msvs_enable_winrt" not in spec:
+            _AddConditionalProperty(
+                properties, condition, "VCToolsVersion", vctools_version
+            )
     return _GetMSBuildPropertyGroup(spec, "Configuration", properties)
 
 
@@ -3101,6 +3104,10 @@ def _ConvertMSVSBuildAttributes(spec, config, build_file):
             msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a])
         elif a == "ConfigurationType":
             msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a])
+        elif a == "SpectreMitigation":
+            msbuild_attributes[a] = msvs_attributes[a]
+        elif a == "VCToolsVersion":
+            msbuild_attributes[a] = msvs_attributes[a]
         else:
             print("Warning: Do not know how to convert MSVS attribute " + a)
     return msbuild_attributes
@@ -3286,13 +3293,11 @@ def _GetMSBuildPropertyGroup(spec, label, properties):
             # Self references are ignored. Self reference is used in a few places to
             # append to the default value. I.e. PATH=$(PATH);other_path
             edges.update(
-                set(
-                    [
-                        v
-                        for v in MSVS_VARIABLE_REFERENCE.findall(value)
-                        if v in properties and v != node
-                    ]
-                )
+                {
+                    v
+                    for v in MSVS_VARIABLE_REFERENCE.findall(value)
+                    if v in properties and v != node
+                }
             )
         return edges
 
@@ -3325,15 +3330,14 @@ def _GetMSBuildToolSettingsSections(spec, configurations):
         for tool_name, tool_settings in sorted(msbuild_settings.items()):
             # Skip the tool named '' which is a holder of global settings handled
             # by _GetMSBuildConfigurationGlobalProperties.
-            if tool_name:
-                if tool_settings:
-                    tool = [tool_name]
-                    for name, value in sorted(tool_settings.items()):
-                        formatted_value = _GetValueFormattedForMSBuild(
-                            tool_name, name, value
-                        )
-                        tool.append([name, formatted_value])
-                    group.append(tool)
+            if tool_name and tool_settings:
+                tool = [tool_name]
+                for name, value in sorted(tool_settings.items()):
+                    formatted_value = _GetValueFormattedForMSBuild(
+                        tool_name, name, value
+                    )
+                    tool.append([name, formatted_value])
+                group.append(tool)
         groups.append(group)
     return groups
 
@@ -3461,10 +3465,7 @@ def _GetValueFormattedForMSBuild(tool_name, name, value):
             "Link": ["AdditionalOptions"],
             "Lib": ["AdditionalOptions"],
         }
-        if tool_name in exceptions and name in exceptions[tool_name]:
-            char = " "
-        else:
-            char = ";"
+        char = " " if name in exceptions.get(tool_name, []) else ";"
         formatted_value = char.join(
             [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value]
         )
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py
similarity index 90%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py
index e001f417..e80b57f0 100755
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright (c) 2012 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -8,10 +8,7 @@
 import gyp.generator.msvs as msvs
 import unittest
 
-try:
-    from StringIO import StringIO  # Python 2
-except ImportError:
-    from io import StringIO  # Python 3
+from io import StringIO
 
 
 class TestSequenceFunctions(unittest.TestCase):
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py
similarity index 94%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py
index e064bad7..8ba341e9 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.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.
 
-from __future__ import print_function
 
 import collections
 import copy
@@ -20,10 +19,7 @@ import gyp.msvs_emulation
 import gyp.MSVSUtil as MSVSUtil
 import gyp.xcode_emulation
 
-try:
-    from cStringIO import StringIO
-except ImportError:
-    from io import StringIO
+from io import StringIO
 
 from gyp.common import GetEnvironFallback
 import gyp.ninja_syntax as ninja_syntax
@@ -76,7 +72,7 @@ def StripPrefix(arg, prefix):
 
 def QuoteShellArgument(arg, flavor):
     """Quote a string such that it will be interpreted as a single argument
-  by the shell."""
+    by the shell."""
     # Rather than attempting to enumerate the bad shell characters, just
     # allow common OK ones and quote anything else.
     if re.match(r"^[a-zA-Z0-9_=.\\/-]+$", arg):
@@ -88,7 +84,7 @@ def QuoteShellArgument(arg, flavor):
 
 def Define(d, flavor):
     """Takes a preprocessor define and returns a -D parameter that's ninja- and
-  shell-escaped."""
+    shell-escaped."""
     if flavor == "win":
         # cl.exe replaces literal # characters with = in preprocessor definitions for
         # some reason. Octal-encode to work around that.
@@ -99,32 +95,32 @@ def Define(d, flavor):
 def AddArch(output, arch):
     """Adds an arch string to an output path."""
     output, extension = os.path.splitext(output)
-    return "%s.%s%s" % (output, arch, extension)
+    return f"{output}.{arch}{extension}"
 
 
-class Target(object):
+class Target:
     """Target represents the paths used within a single gyp target.
 
-  Conceptually, building a single target A is a series of steps:
+    Conceptually, building a single target A is a series of steps:
 
-  1) actions/rules/copies  generates source/resources/etc.
-  2) compiles              generates .o files
-  3) link                  generates a binary (library/executable)
-  4) bundle                merges the above in a mac bundle
+    1) actions/rules/copies  generates source/resources/etc.
+    2) compiles              generates .o files
+    3) link                  generates a binary (library/executable)
+    4) bundle                merges the above in a mac bundle
 
-  (Any of these steps can be optional.)
+    (Any of these steps can be optional.)
 
-  From a build ordering perspective, a dependent target B could just
-  depend on the last output of this series of steps.
+    From a build ordering perspective, a dependent target B could just
+    depend on the last output of this series of steps.
 
-  But some dependent commands sometimes need to reach inside the box.
-  For example, when linking B it needs to get the path to the static
-  library generated by A.
+    But some dependent commands sometimes need to reach inside the box.
+    For example, when linking B it needs to get the path to the static
+    library generated by A.
 
-  This object stores those paths.  To keep things simple, member
-  variables only store concrete paths to single files, while methods
-  compute derived values like "the last output of the target".
-  """
+    This object stores those paths.  To keep things simple, member
+    variables only store concrete paths to single files, while methods
+    compute derived values like "the last output of the target".
+    """
 
     def __init__(self, type):
         # Gyp type ("static_library", etc.) of this target.
@@ -163,7 +159,7 @@ class Target(object):
 
     def UsesToc(self, flavor):
         """Return true if the target should produce a restat rule based on a TOC
-    file."""
+        file."""
         # For bundles, the .TOC should be produced for the binary, not for
         # FinalOutput(). But the naive approach would put the TOC file into the
         # bundle, so don't do this for bundles for now.
@@ -173,19 +169,19 @@ class Target(object):
 
     def PreActionInput(self, flavor):
         """Return the path, if any, that should be used as a dependency of
-    any dependent action step."""
+        any dependent action step."""
         if self.UsesToc(flavor):
             return self.FinalOutput() + ".TOC"
         return self.FinalOutput() or self.preaction_stamp
 
     def PreCompileInput(self):
         """Return the path, if any, that should be used as a dependency of
-    any dependent compile step."""
+        any dependent compile step."""
         return self.actions_stamp or self.precompile_stamp
 
     def FinalOutput(self):
         """Return the last output of the target, which depends on all prior
-    steps."""
+        steps."""
         return self.bundle or self.binary or self.actions_stamp
 
 
@@ -214,7 +210,7 @@ class Target(object):
 #   to the input file name as well as the output target name.
 
 
-class NinjaWriter(object):
+class NinjaWriter:
     def __init__(
         self,
         hash_for_rules,
@@ -228,11 +224,11 @@ class NinjaWriter(object):
         toplevel_dir=None,
     ):
         """
-    base_dir: path from source root to directory containing this gyp file,
-              by gyp semantics, all input paths are relative to this
-    build_dir: path from source root to build output
-    toplevel_dir: path to the toplevel directory
-    """
+        base_dir: path from source root to directory containing this gyp file,
+                  by gyp semantics, all input paths are relative to this
+        build_dir: path from source root to build output
+        toplevel_dir: path to the toplevel directory
+        """
 
         self.hash_for_rules = hash_for_rules
         self.target_outputs = target_outputs
@@ -263,10 +259,10 @@ class NinjaWriter(object):
     def ExpandSpecial(self, path, product_dir=None):
         """Expand specials like $!PRODUCT_DIR in |path|.
 
-    If |product_dir| is None, assumes the cwd is already the product
-    dir.  Otherwise, |product_dir| is the relative path to the product
-    dir.
-    """
+        If |product_dir| is None, assumes the cwd is already the product
+        dir.  Otherwise, |product_dir| is the relative path to the product
+        dir.
+        """
 
         PRODUCT_DIR = "$!PRODUCT_DIR"
         if PRODUCT_DIR in path:
@@ -303,9 +299,9 @@ class NinjaWriter(object):
 
     def GypPathToNinja(self, path, env=None):
         """Translate a gyp path to a ninja path, optionally expanding environment
-    variable references in |path| with |env|.
+        variable references in |path| with |env|.
 
-    See the above discourse on path conversions."""
+        See the above discourse on path conversions."""
         if env:
             if self.flavor == "mac":
                 path = gyp.xcode_emulation.ExpandEnvVars(path, env)
@@ -324,11 +320,11 @@ class NinjaWriter(object):
     def GypPathToUniqueOutput(self, path, qualified=True):
         """Translate a gyp path to a ninja path for writing output.
 
-    If qualified is True, qualify the resulting filename with the name
-    of the target.  This is necessary when e.g. compiling the same
-    path twice for two separate output targets.
+        If qualified is True, qualify the resulting filename with the name
+        of the target.  This is necessary when e.g. compiling the same
+        path twice for two separate output targets.
 
-    See the above discourse on path conversions."""
+        See the above discourse on path conversions."""
 
         path = self.ExpandSpecial(path)
         assert not path.startswith("$"), path
@@ -361,9 +357,9 @@ class NinjaWriter(object):
 
     def WriteCollapsedDependencies(self, name, targets, order_only=None):
         """Given a list of targets, return a path for a single file
-    representing the result of building all the targets or None.
+        representing the result of building all the targets or None.
 
-    Uses a stamp file if necessary."""
+        Uses a stamp file if necessary."""
 
         assert targets == [item for item in targets if item], targets
         if len(targets) == 0:
@@ -377,14 +373,14 @@ class NinjaWriter(object):
 
     def _SubninjaNameForArch(self, arch):
         output_file_base = os.path.splitext(self.output_file_name)[0]
-        return "%s.%s.ninja" % (output_file_base, arch)
+        return f"{output_file_base}.{arch}.ninja"
 
     def WriteSpec(self, spec, config_name, generator_flags):
         """The main entry point for NinjaWriter: write the build rules for a spec.
 
-    Returns a Target object, which represents the output paths for this spec.
-    Returns None if there are no outputs (e.g. a settings-only 'none' type
-    target)."""
+        Returns a Target object, which represents the output paths for this spec.
+        Returns None if there are no outputs (e.g. a settings-only 'none' type
+        target)."""
 
         self.config_name = config_name
         self.name = spec["target_name"]
@@ -418,20 +414,17 @@ class NinjaWriter(object):
         if self.flavor == "mac":
             self.archs = self.xcode_settings.GetActiveArchs(config_name)
             if len(self.archs) > 1:
-                self.arch_subninjas = dict(
-                    (
-                        arch,
-                        ninja_syntax.Writer(
-                            OpenOutput(
-                                os.path.join(
-                                    self.toplevel_build, self._SubninjaNameForArch(arch)
-                                ),
-                                "w",
-                            )
-                        ),
+                self.arch_subninjas = {
+                    arch: ninja_syntax.Writer(
+                        OpenOutput(
+                            os.path.join(
+                                self.toplevel_build, self._SubninjaNameForArch(arch)
+                            ),
+                            "w",
+                        )
                     )
                     for arch in self.archs
-                )
+                }
 
         # Compute predepends for all rules.
         # actions_depends is the dependencies this target depends on before running
@@ -558,7 +551,7 @@ class NinjaWriter(object):
 
     def _WinIdlRule(self, source, prebuild, outputs):
         """Handle the implicit VS .idl rule for one source file. Fills |outputs|
-    with files that are generated."""
+        with files that are generated."""
         outdir, output, vars, flags = self.msvs_settings.GetIdlBuildData(
             source, self.config_name
         )
@@ -595,7 +588,7 @@ class NinjaWriter(object):
         self, spec, extra_sources, prebuild, mac_bundle_depends
     ):
         """Write out the Actions, Rules, and Copies steps.  Return a path
-    representing the outputs of these steps."""
+        representing the outputs of these steps."""
         outputs = []
         if self.is_mac_bundle:
             mac_bundle_resources = spec.get("mac_bundle_resources", [])[:]
@@ -638,16 +631,16 @@ class NinjaWriter(object):
     def GenerateDescription(self, verb, message, fallback):
         """Generate and return a description of a build step.
 
-    |verb| is the short summary, e.g. ACTION or RULE.
-    |message| is a hand-written description, or None if not available.
-    |fallback| is the gyp-level name of the step, usable as a fallback.
-    """
+        |verb| is the short summary, e.g. ACTION or RULE.
+        |message| is a hand-written description, or None if not available.
+        |fallback| is the gyp-level name of the step, usable as a fallback.
+        """
         if self.toolset != "target":
             verb += "(%s)" % self.toolset
         if message:
-            return "%s %s" % (verb, self.ExpandSpecial(message))
+            return f"{verb} {self.ExpandSpecial(message)}"
         else:
-            return "%s %s: %s" % (verb, self.name, fallback)
+            return f"{verb} {self.name}: {fallback}"
 
     def WriteActions(
         self, actions, extra_sources, prebuild, extra_mac_bundle_resources
@@ -657,14 +650,14 @@ class NinjaWriter(object):
         all_outputs = []
         for action in actions:
             # First write out a rule for the action.
-            name = "%s_%s" % (action["action_name"], self.hash_for_rules)
+            name = "{}_{}".format(action["action_name"], self.hash_for_rules)
             description = self.GenerateDescription(
                 "ACTION", action.get("message", None), name
             )
-            is_cygwin = (
-                self.msvs_settings.IsRuleRunUnderCygwin(action)
+            win_shell_flags = (
+                self.msvs_settings.GetRuleShellFlags(action)
                 if self.flavor == "win"
-                else False
+                else None
             )
             args = action["action"]
             depfile = action.get("depfile", None)
@@ -672,7 +665,7 @@ class NinjaWriter(object):
                 depfile = self.ExpandSpecial(depfile, self.base_to_build)
             pool = "console" if int(action.get("ninja_use_console", 0)) else None
             rule_name, _ = self.WriteNewNinjaRule(
-                name, args, description, is_cygwin, env, pool, depfile=depfile
+                name, args, description, win_shell_flags, env, pool, depfile=depfile
             )
 
             inputs = [self.GypPathToNinja(i, env) for i in action["inputs"]]
@@ -706,7 +699,7 @@ class NinjaWriter(object):
                 continue
 
             # First write out a rule for the rule action.
-            name = "%s_%s" % (rule["rule_name"], self.hash_for_rules)
+            name = "{}_{}".format(rule["rule_name"], self.hash_for_rules)
 
             args = rule["action"]
             description = self.GenerateDescription(
@@ -714,14 +707,14 @@ class NinjaWriter(object):
                 rule.get("message", None),
                 ("%s " + generator_default_variables["RULE_INPUT_PATH"]) % name,
             )
-            is_cygwin = (
-                self.msvs_settings.IsRuleRunUnderCygwin(rule)
+            win_shell_flags = (
+                self.msvs_settings.GetRuleShellFlags(rule)
                 if self.flavor == "win"
-                else False
+                else None
             )
             pool = "console" if int(rule.get("ninja_use_console", 0)) else None
             rule_name, args = self.WriteNewNinjaRule(
-                name, args, description, is_cygwin, env, pool
+                name, args, description, win_shell_flags, env, pool
             )
 
             # TODO: if the command references the outputs directly, we should
@@ -731,7 +724,7 @@ class NinjaWriter(object):
             # must vary per source file.
             # Compute the list of variables we'll need to provide.
             special_locals = ("source", "root", "dirname", "ext", "name")
-            needed_variables = set(["source"])
+            needed_variables = {"source"}
             for argument in args:
                 for var in special_locals:
                     if "${%s}" % var in argument:
@@ -740,7 +733,7 @@ class NinjaWriter(object):
 
             def cygwin_munge(path):
                 # pylint: disable=cell-var-from-loop
-                if is_cygwin:
+                if win_shell_flags and win_shell_flags.cygwin:
                     return path.replace("\\", "/")
                 return path
 
@@ -875,7 +868,7 @@ class NinjaWriter(object):
         output = self.GypPathToUniqueOutput("headers.hmap")
         self.xcode_settings.header_map_path = output
         all_headers = map(
-            self.GypPathToNinja, filter(lambda x: x.endswith((".h")), all_sources)
+            self.GypPathToNinja, filter(lambda x: x.endswith(".h"), all_sources)
         )
         variables = [
             ("framework", framework),
@@ -925,11 +918,11 @@ class NinjaWriter(object):
     def WriteMacXCassets(self, xcassets, bundle_depends):
         """Writes ninja edges for 'mac_bundle_resources' .xcassets files.
 
-    This add an invocation of 'actool' via the 'mac_tool.py' helper script.
-    It assumes that the assets catalogs define at least one imageset and
-    thus an Assets.car file will be generated in the application resources
-    directory. If this is not the case, then the build will probably be done
-    at each invocation of ninja."""
+        This add an invocation of 'actool' via the 'mac_tool.py' helper script.
+        It assumes that the assets catalogs define at least one imageset and
+        thus an Assets.car file will be generated in the application resources
+        directory. If this is not the case, then the build will probably be done
+        at each invocation of ninja."""
         if not xcassets:
             return
 
@@ -1047,22 +1040,19 @@ class NinjaWriter(object):
                 spec,
             )
         else:
-            return dict(
-                (
-                    arch,
-                    self.WriteSourcesForArch(
-                        self.arch_subninjas[arch],
-                        config_name,
-                        config,
-                        sources,
-                        predepends,
-                        precompiled_header,
-                        spec,
-                        arch=arch,
-                    ),
+            return {
+                arch: self.WriteSourcesForArch(
+                    self.arch_subninjas[arch],
+                    config_name,
+                    config,
+                    sources,
+                    predepends,
+                    precompiled_header,
+                    spec,
+                    arch=arch,
                 )
                 for arch in self.archs
-            )
+            }
 
     def WriteSourcesForArch(
         self,
@@ -1231,7 +1221,7 @@ class NinjaWriter(object):
                 command = "cc_s"
             elif (
                 self.flavor == "win"
-                and ext == "asm"
+                and ext in ("asm", "S")
                 and not self.msvs_settings.HasExplicitAsmRules(spec)
             ):
                 command = "asm"
@@ -1427,7 +1417,11 @@ class NinjaWriter(object):
         is_executable = spec["type"] == "executable"
         # The ldflags config key is not used on mac or win. On those platforms
         # linker flags are set via xcode_settings and msvs_settings, respectively.
-        env_ldflags = os.environ.get("LDFLAGS", "").split()
+        if self.toolset == "target":
+            env_ldflags = os.environ.get("LDFLAGS", "").split()
+        elif self.toolset == "host":
+            env_ldflags = os.environ.get("LDFLAGS_host", "").split()
+
         if self.flavor == "mac":
             ldflags = self.xcode_settings.GetLdflags(
                 config_name,
@@ -1589,7 +1583,7 @@ class NinjaWriter(object):
         elif spec["type"] == "static_library":
             self.target.binary = self.ComputeOutput(spec)
             if (
-                self.flavor not in ("mac", "openbsd", "netbsd", "win")
+                self.flavor not in ("ios", "mac", "netbsd", "openbsd", "win")
                 and not self.is_standalone_static_library
             ):
                 self.ninja.build(
@@ -1729,8 +1723,8 @@ class NinjaWriter(object):
 
     def GetPostbuildCommand(self, spec, output, output_binary, is_command_start):
         """Returns a shell command that runs all the postbuilds, and removes
-    |output| if any of them fails. If |is_command_start| is False, then the
-    returned string will start with ' && '."""
+        |output| if any of them fails. If |is_command_start| is False, then the
+        returned string will start with ' && '."""
         if not self.xcode_settings or spec["type"] == "none" or not output:
             return ""
         output = QuoteShellArgument(output, self.flavor)
@@ -1776,8 +1770,8 @@ class NinjaWriter(object):
 
     def ComputeExportEnvString(self, env):
         """Given an environment, returns a string looking like
-        'export FOO=foo; export BAR="${FOO} bar;'
-    that exports |env| to the shell."""
+            'export FOO=foo; export BAR="${FOO} bar;'
+        that exports |env| to the shell."""
         export_str = []
         for k, v in env:
             export_str.append(
@@ -1821,10 +1815,7 @@ class NinjaWriter(object):
             "executable": default_variables["EXECUTABLE_SUFFIX"],
         }
         extension = spec.get("product_extension")
-        if extension:
-            extension = "." + extension
-        else:
-            extension = DEFAULT_EXTENSION.get(type, "")
+        extension = "." + extension if extension else DEFAULT_EXTENSION.get(type, "")
 
         if "product_name" in spec:
             # If we were given an explicit name, use that.
@@ -1842,7 +1833,7 @@ class NinjaWriter(object):
             "shared_library",
             "executable",
         ):
-            return "%s%s%s" % (prefix, target, extension)
+            return f"{prefix}{target}{extension}"
         elif type == "none":
             return "%s.stamp" % target
         else:
@@ -1905,12 +1896,12 @@ class NinjaWriter(object):
         ninja_file.variable(var, " ".join(values))
 
     def WriteNewNinjaRule(
-        self, name, args, description, is_cygwin, env, pool, depfile=None
+        self, name, args, description, win_shell_flags, env, pool, depfile=None
     ):
         """Write out a new ninja "rule" statement for a given command.
 
-    Returns the name of the new rule, and a copy of |args| with variables
-    expanded."""
+        Returns the name of the new rule, and a copy of |args| with variables
+        expanded."""
 
         if self.flavor == "win":
             args = [
@@ -1952,13 +1943,14 @@ class NinjaWriter(object):
         if self.flavor == "win":
             rspfile = rule_name + ".$unique_name.rsp"
             # The cygwin case handles this inside the bash sub-shell.
-            run_in = "" if is_cygwin else " " + self.build_to_base
-            if is_cygwin:
+            run_in = "" if win_shell_flags.cygwin else " " + self.build_to_base
+            if win_shell_flags.cygwin:
                 rspfile_content = self.msvs_settings.BuildCygwinBashCommandLine(
                     args, self.build_to_base
                 )
             else:
-                rspfile_content = gyp.msvs_emulation.EncodeRspFileList(args)
+                rspfile_content = gyp.msvs_emulation.EncodeRspFileList(
+                    args, win_shell_flags.quote)
             command = (
                 "%s gyp-win-tool action-wrapper $arch " % sys.executable
                 + rspfile
@@ -2117,8 +2109,8 @@ def GetDefaultConcurrentLinks():
         ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))
 
         # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM
-        # on a 64 GB machine.
-        mem_limit = max(1, stat.ullTotalPhys // (5 * (2 ** 30)))  # total / 5GB
+        # on a 64 GiB machine.
+        mem_limit = max(1, stat.ullTotalPhys // (5 * (2 ** 30)))  # total / 5GiB
         hard_cap = max(1, int(os.environ.get("GYP_LINK_CONCURRENCY_MAX", 2 ** 32)))
         return min(mem_limit, hard_cap)
     elif sys.platform.startswith("linux"):
@@ -2147,7 +2139,7 @@ def GetDefaultConcurrentLinks():
 
 def _GetWinLinkRuleNameSuffix(embed_manifest):
     """Returns the suffix used to select an appropriate linking rule depending on
-  whether the manifest embedding is enabled."""
+    whether the manifest embedding is enabled."""
     return "_embed" if embed_manifest else ""
 
 
@@ -2395,7 +2387,6 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name
         )
         if flavor == "win":
             master_ninja.variable("ld_host", ld_host)
-            master_ninja.variable("ldxx_host", ldxx_host)
         else:
             master_ninja.variable(
                 "ld_host", CommandWithWrapper("LINK", wrappers, ld_host)
@@ -2502,7 +2493,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name
             ),
         )
 
-    if flavor != "mac" and flavor != "win":
+    if flavor not in ("ios", "mac", "win"):
         master_ninja.rule(
             "alink",
             description="AR $out",
@@ -2538,10 +2529,12 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name
             "solink",
             description="SOLINK $lib",
             restat=True,
-            command=mtime_preserving_solink_base % {"suffix": "@$link_file_list"},  # noqa: E501
+            command=mtime_preserving_solink_base
+            % {"suffix": "@$link_file_list"},
             rspfile="$link_file_list",
-            rspfile_content=("-Wl,--whole-archive $in $solibs -Wl,"
-                             "--no-whole-archive $libs"),
+            rspfile_content=(
+                "-Wl,--whole-archive $in $solibs -Wl," "--no-whole-archive $libs"
+            ),
             pool="link_pool",
         )
         master_ninja.rule(
@@ -2798,8 +2791,8 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name
 
         this_make_global_settings = data[build_file].get("make_global_settings", [])
         assert make_global_settings == this_make_global_settings, (
-            "make_global_settings needs to be the same for all targets. %s vs. %s"
-            % (this_make_global_settings, make_global_settings)
+            "make_global_settings needs to be the same for all targets. "
+            f"{this_make_global_settings} vs. {make_global_settings}"
         )
 
         spec = target_dicts[qualified_target]
@@ -2891,7 +2884,7 @@ def PerformBuild(data, configurations, params):
     for config in configurations:
         builddir = os.path.join(options.toplevel_dir, "out", config)
         arguments = ["ninja", "-C", builddir]
-        print("Building [%s]: %s" % (config, arguments))
+        print(f"Building [{config}]: {arguments}")
         subprocess.check_call(arguments)
 
 
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py
similarity index 98%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py
index abadcd98..7d180685 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2012 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py
similarity index 98%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py
index 9e7e99e9..1ac672c3 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.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.
 
-from __future__ import print_function
 
 import filecmp
 import gyp.common
@@ -110,7 +109,7 @@ def CreateXCConfigurationList(configuration_names):
     return xccl
 
 
-class XcodeProject(object):
+class XcodeProject:
     def __init__(self, gyp_path, path, build_file_dict):
         self.gyp_path = gyp_path
         self.path = path
@@ -440,7 +439,7 @@ sys.exit(subprocess.call(sys.argv[1:]))" """
         # it opens the project file, which will result in unnecessary diffs.
         # TODO(mark): This is evil because it relies on internal knowledge of
         # PBXProject._other_pbxprojects.
-        for other_pbxproject in self.project._other_pbxprojects.keys():
+        for other_pbxproject in self.project._other_pbxprojects:
             self.project.AddOrGetProjectReference(other_pbxproject)
 
         self.project.SortRemoteProductReferences()
@@ -613,7 +612,7 @@ def PerformBuild(data, configurations, params):
     for config in configurations:
         arguments = ["xcodebuild", "-project", xcodeproj_path]
         arguments += ["-configuration", config]
-        print("Building [%s]: %s" % (config, arguments))
+        print(f"Building [{config}]: {arguments}")
         subprocess.check_call(arguments)
 
 
@@ -1072,7 +1071,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
                 # TODO(mark): There's a possibility for collision here.  Consider
                 # target "t" rule "A_r" and target "t_A" rule "r".
                 makefile_name = "%s.make" % re.sub(
-                    "[^a-zA-Z0-9_]", "_", "%s_%s" % (target_name, rule["rule_name"])
+                    "[^a-zA-Z0-9_]", "_", "{}_{}".format(target_name, rule["rule_name"])
                 )
                 makefile_path = os.path.join(
                     xcode_projects[build_file].path, makefile_name
@@ -1102,7 +1101,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
                         eol = ""
                     else:
                         eol = " \\"
-                    makefile.write("    %s%s\n" % (concrete_output, eol))
+                    makefile.write(f"    {concrete_output}{eol}\n")
 
                 for (rule_source, concrete_outputs, message, action) in zip(
                     rule["rule_sources"],
@@ -1119,11 +1118,8 @@ def GenerateOutput(target_list, target_dicts, data, params):
                     for concrete_output_index, concrete_output in enumerate(
                         concrete_outputs
                     ):
-                        if concrete_output_index == 0:
-                            bol = ""
-                        else:
-                            bol = "    "
-                        makefile.write("%s%s \\\n" % (bol, concrete_output))
+                        bol = "" if concrete_output_index == 0 else "    "
+                        makefile.write(f"{bol}{concrete_output} \\\n")
 
                         concrete_output_dir = posixpath.dirname(concrete_output)
                         if (
@@ -1143,7 +1139,7 @@ def GenerateOutput(target_list, target_dicts, data, params):
                             eol = ""
                         else:
                             eol = " \\"
-                        makefile.write("    %s%s\n" % (prerequisite, eol))
+                        makefile.write(f"    {prerequisite}{eol}\n")
 
                     # Make sure that output directories exist before executing the rule
                     # action.
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py
similarity index 96%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py
index 51fbca6a..49772d1f 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2013 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/input.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/input.py
similarity index 97%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/input.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/input.py
index 5504390c..8f39519d 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/input.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/input.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.
 
-from __future__ import print_function
 
 import ast
 
@@ -17,11 +16,9 @@ import subprocess
 import sys
 import threading
 import traceback
-from distutils.version import StrictVersion
 from gyp.common import GypError
 from gyp.common import OrderedSet
-
-PY3 = bytes != str
+from packaging.version import Version
 
 # A list of types that are treated as linkable.
 linkable_types = [
@@ -228,17 +225,9 @@ def LoadOneBuildFile(build_file_path, data, aux_data, includes, is_target, check
         return data[build_file_path]
 
     if os.path.exists(build_file_path):
-        # Open the build file for read ('r') with universal-newlines mode ('U')
-        # to make sure platform specific newlines ('\r\n' or '\r') are converted to '\n'
-        # which otherwise will fail eval()
-        if sys.platform == "zos":
-            # On z/OS, universal-newlines mode treats the file as an ascii file.
-            # But since node-gyp produces ebcdic files, do not use that mode.
-            build_file_contents = open(build_file_path, "r").read()
-        else:
-            build_file_contents = open(build_file_path, "rU").read()
+        build_file_contents = open(build_file_path, encoding="utf-8").read()
     else:
-        raise GypError("%s not found (cwd: %s)" % (build_file_path, os.getcwd()))
+        raise GypError(f"{build_file_path} not found (cwd: {os.getcwd()})")
 
     build_file_data = None
     try:
@@ -567,7 +556,7 @@ class ParallelProcessingError(Exception):
     pass
 
 
-class ParallelState(object):
+class ParallelState:
     """Class to keep track of state when processing input files in parallel.
 
   If build files are loaded in parallel, use this to keep track of
@@ -881,10 +870,7 @@ def ExpandVariables(input, phase, variables, build_file):
         # This works around actions/rules which have more inputs than will
         # fit on the command line.
         if file_list:
-            if type(contents) is list:
-                contents_list = contents
-            else:
-                contents_list = contents.split(" ")
+            contents_list = contents if type(contents) is list else contents.split(" ")
             replacement = contents_list[0]
             if os.path.isabs(replacement):
                 raise GypError('| cannot handle absolute paths, got "%s"' % replacement)
@@ -972,13 +958,13 @@ def ExpandVariables(input, phase, variables, build_file):
                     # Fix up command with platform specific workarounds.
                     contents = FixupPlatformCommand(contents)
                     try:
-                        p = subprocess.Popen(
+                        # stderr will be printed no matter what
+                        result = subprocess.run(
                             contents,
-                            shell=use_shell,
                             stdout=subprocess.PIPE,
-                            stderr=subprocess.PIPE,
-                            stdin=subprocess.PIPE,
+                            shell=use_shell,
                             cwd=build_file_dir,
+                            check=False
                         )
                     except Exception as e:
                         raise GypError(
@@ -986,20 +972,12 @@ def ExpandVariables(input, phase, variables, build_file):
                             % (e, contents, build_file)
                         )
 
-                    p_stdout, p_stderr = p.communicate("")
-                    if PY3:
-                        p_stdout = p_stdout.decode("utf-8")
-                        p_stderr = p_stderr.decode("utf-8")
-
-                    if p.wait() != 0 or p_stderr:
-                        sys.stderr.write(p_stderr)
-                        # Simulate check_call behavior, since check_call only exists
-                        # in python 2.5 and later.
+                    if result.returncode > 0:
                         raise GypError(
                             "Call to '%s' returned exit status %d while in %s."
-                            % (contents, p.returncode, build_file)
+                            % (contents, result.returncode, build_file)
                         )
-                    replacement = p_stdout.rstrip()
+                    replacement = result.stdout.decode("utf-8").rstrip()
 
                 cached_command_results[cache_key] = replacement
             else:
@@ -1202,7 +1180,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
@@ -1219,7 +1197,7 @@ def EvalSingleCondition(cond_expr, true_dict, false_dict, phase, variables, buil
     except NameError as e:
         gyp.common.ExceptionAppend(
             e,
-            "while evaluating condition '%s' in %s" % (cond_expr_expanded, build_file),
+            f"while evaluating condition '{cond_expr_expanded}' in {build_file}",
         )
         raise GypError(e)
 
@@ -1598,14 +1576,12 @@ def ExpandWildcardDependencies(targets, data):
                         continue
                     dependency_target_name = dependency_target_dict["target_name"]
                     if (
-                        dependency_target != "*"
-                        and dependency_target != dependency_target_name
+                        dependency_target not in {"*", dependency_target_name}
                     ):
                         continue
                     dependency_target_toolset = dependency_target_dict["toolset"]
                     if (
-                        dependency_toolset != "*"
-                        and dependency_toolset != dependency_target_toolset
+                        dependency_toolset not in {"*", dependency_target_toolset}
                     ):
                         continue
                     dependency = gyp.common.QualifiedTarget(
@@ -1649,15 +1625,14 @@ def RemoveSelfDependencies(targets):
             dependencies = target_dict.get(dependency_key, [])
             if dependencies:
                 for t in dependencies:
-                    if t == target_name:
-                        if (
-                            targets[t]
-                            .get("variables", {})
-                            .get("prune_self_dependency", 0)
-                        ):
-                            target_dict[dependency_key] = Filter(
-                                dependencies, target_name
-                            )
+                    if t == target_name and (
+                        targets[t]
+                        .get("variables", {})
+                        .get("prune_self_dependency", 0)
+                    ):
+                        target_dict[dependency_key] = Filter(
+                            dependencies, target_name
+                        )
 
 
 def RemoveLinkDependenciesFromNoneTargets(targets):
@@ -1675,7 +1650,7 @@ def RemoveLinkDependenciesFromNoneTargets(targets):
                             )
 
 
-class DependencyGraphNode(object):
+class DependencyGraphNode:
     """
 
   Attributes:
@@ -2252,15 +2227,12 @@ def MergeLists(to, fro, to_file, fro_file, is_paths=False, append=True):
 
     # Make membership testing of hashables in |to| (in particular, strings)
     # faster.
-    hashable_to_set = set(x for x in to if is_hashable(x))
+    hashable_to_set = {x for x in to if is_hashable(x)}
     for item in fro:
         singleton = False
         if type(item) in (str, int):
             # The cheap and easy case.
-            if is_paths:
-                to_item = MakePathRelative(to_file, fro_file, item)
-            else:
-                to_item = item
+            to_item = MakePathRelative(to_file, fro_file, item) if is_paths else item
 
             if not (type(item) is str and item.startswith("-")):
                 # Any string that doesn't begin with a "-" is a singleton - it can
@@ -2486,10 +2458,7 @@ def SetUpConfigurations(target, target_dict):
         new_configuration_dict = {}
         for (key, target_val) in target_dict.items():
             key_ext = key[-1:]
-            if key_ext in key_suffixes:
-                key_base = key[:-1]
-            else:
-                key_base = key
+            key_base = key[:-1] if key_ext in key_suffixes else key
             if key_base not in non_configuration_keys:
                 new_configuration_dict[key] = gyp.simple_copy.deepcopy(target_val)
 
@@ -2501,7 +2470,7 @@ def SetUpConfigurations(target, target_dict):
         merged_configurations[configuration] = new_configuration_dict
 
     # Put the new configurations back into the target dict as a configuration.
-    for configuration in merged_configurations.keys():
+    for configuration in merged_configurations:
         target_dict["configurations"][configuration] = merged_configurations[
             configuration
         ]
@@ -2518,19 +2487,16 @@ def SetUpConfigurations(target, target_dict):
     delete_keys = []
     for key in target_dict:
         key_ext = key[-1:]
-        if key_ext in key_suffixes:
-            key_base = key[:-1]
-        else:
-            key_base = key
+        key_base = key[:-1] if key_ext in key_suffixes else key
         if key_base not in non_configuration_keys:
             delete_keys.append(key)
     for key in delete_keys:
         del target_dict[key]
 
     # Check the configurations to see if they contain invalid keys.
-    for configuration in target_dict["configurations"].keys():
+    for configuration in target_dict["configurations"]:
         configuration_dict = target_dict["configurations"][configuration]
-        for key in configuration_dict.keys():
+        for key in configuration_dict:
             if key in invalid_configuration_keys:
                 raise GypError(
                     "%s not allowed in the %s configuration, found in "
@@ -2573,7 +2539,7 @@ def ProcessListFiltersInDict(name, the_dict):
     del_lists = []
     for key, value in the_dict.items():
         operation = key[-1]
-        if operation != "!" and operation != "/":
+        if operation not in {"!", "/"}:
             continue
 
         if type(value) is not list:
@@ -2772,7 +2738,7 @@ def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules):
         rule_name = rule["rule_name"]
         if rule_name in rule_names:
             raise GypError(
-                "rule %s exists in duplicate, target %s" % (rule_name, target)
+                f"rule {rule_name} exists in duplicate, target {target}"
             )
         rule_names[rule_name] = rule
 
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/input_test.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/input_test.py
similarity index 99%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/input_test.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/input_test.py
index 6672ddc0..a18f72e9 100755
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/input_test.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/input_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright 2013 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py
similarity index 98%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py
index 07412578..59647c9a 100755
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright (c) 2012 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -8,7 +8,6 @@
 These functions are executed via gyp-mac-tool when using the Makefile generator.
 """
 
-from __future__ import print_function
 
 import fcntl
 import fnmatch
@@ -23,8 +22,6 @@ import subprocess
 import sys
 import tempfile
 
-PY3 = bytes != str
-
 
 def main(args):
     executor = MacTool()
@@ -33,7 +30,7 @@ def main(args):
         sys.exit(exit_code)
 
 
-class MacTool(object):
+class MacTool:
     """This class performs all the Mac tooling steps. The methods can either be
   executed directly, or dispatched from an argument list."""
 
@@ -179,7 +176,7 @@ class MacTool(object):
     def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys):
         """Copies the |source| Info.plist to the destination directory |dest|."""
         # Read the source Info.plist into memory.
-        with open(source, "r") as fd:
+        with open(source) as fd:
             lines = fd.read()
 
         # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild).
@@ -251,7 +248,7 @@ class MacTool(object):
 
         dest = os.path.join(os.path.dirname(info_plist), "PkgInfo")
         with open(dest, "w") as fp:
-            fp.write("%s%s" % (package_type, signature_code))
+            fp.write(f"{package_type}{signature_code}")
 
     def ExecFlock(self, lockfile, *cmd_list):
         """Emulates the most basic behavior of Linux's flock(1)."""
@@ -278,9 +275,7 @@ class MacTool(object):
         # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone.
         env["ZERO_AR_DATE"] = "1"
         libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env)
-        _, err = libtoolout.communicate()
-        if PY3:
-            err = err.decode("utf-8")
+        err = libtoolout.communicate()[1].decode("utf-8")
         for line in err.splitlines():
             if not libtool_re.match(line) and not libtool_re5.match(line):
                 print(line, file=sys.stderr)
@@ -540,7 +535,7 @@ class MacTool(object):
                 "application-identifier", ""
             )
             for team_identifier in profile_data.get("TeamIdentifier", []):
-                app_id = "%s.%s" % (team_identifier, bundle_identifier)
+                app_id = f"{team_identifier}.{bundle_identifier}"
                 if fnmatch.fnmatch(app_id, app_id_pattern):
                     valid_provisioning_profiles[app_id_pattern] = (
                         profile_path,
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
similarity index 85%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
index 1afc1d68..38fa21dd 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
@@ -7,6 +7,7 @@ This module helps emulate Visual Studio 2008 behavior on top of other
 build systems, primarily ninja.
 """
 
+import collections
 import os
 import re
 import subprocess
@@ -16,15 +17,13 @@ from gyp.common import OrderedSet
 import gyp.MSVSUtil
 import gyp.MSVSVersion
 
-PY3 = bytes != str
-
 windows_quoter_regex = re.compile(r'(\\*)"')
 
 
-def QuoteForRspFile(arg):
+def QuoteForRspFile(arg, quote_cmd=True):
     """Quote a command line argument so that it appears as one argument when
-  processed via cmd.exe and parsed by CommandLineToArgvW (as is typical for
-  Windows programs)."""
+    processed via cmd.exe and parsed by CommandLineToArgvW (as is typical for
+    Windows programs)."""
     # See http://goo.gl/cuFbX and http://goo.gl/dhPnp including the comment
     # threads. This is actually the quoting rules for CommandLineToArgvW, not
     # for the shell, because the shell doesn't do anything in Windows. This
@@ -38,7 +37,8 @@ def QuoteForRspFile(arg):
     # For a literal quote, CommandLineToArgvW requires 2n+1 backslashes
     # preceding it, and results in n backslashes + the quote. So we substitute
     # in 2* what we match, +1 more, plus the quote.
-    arg = windows_quoter_regex.sub(lambda mo: 2 * mo.group(1) + '\\"', arg)
+    if quote_cmd:
+        arg = windows_quoter_regex.sub(lambda mo: 2 * mo.group(1) + '\\"', arg)
 
     # %'s also need to be doubled otherwise they're interpreted as batch
     # positional arguments. Also make sure to escape the % so that they're
@@ -50,12 +50,17 @@ def QuoteForRspFile(arg):
     # These commands are used in rsp files, so no escaping for the shell (via ^)
     # is necessary.
 
-    # Finally, wrap the whole thing in quotes so that the above quote rule
-    # applies and whitespace isn't a word break.
-    return '"' + arg + '"'
+    # As a workaround for programs that don't use CommandLineToArgvW, gyp
+    # supports msvs_quote_cmd=0, which simply disables all quoting.
+    if quote_cmd:
+        # Finally, wrap the whole thing in quotes so that the above quote rule
+        # applies and whitespace isn't a word break.
+        return f'"{arg}"'
+
+    return arg
 
 
-def EncodeRspFileList(args):
+def EncodeRspFileList(args, quote_cmd):
     """Process a list of arguments using QuoteCmdExeArgument."""
     # Note that the first argument is assumed to be the command. Don't add
     # quotes around it because then built-ins like 'echo', etc. won't work.
@@ -69,12 +74,13 @@ def EncodeRspFileList(args):
         program = call + " " + os.path.normpath(program)
     else:
         program = os.path.normpath(args[0])
-    return program + " " + " ".join(QuoteForRspFile(arg) for arg in args[1:])
+    return (program + " "
+            + " ".join(QuoteForRspFile(arg, quote_cmd) for arg in args[1:]))
 
 
 def _GenericRetrieve(root, default, path):
     """Given a list of dictionary keys |path| and a tree of dicts |root|, find
-  value at path, or return |default| if any of the path doesn't exist."""
+    value at path, or return |default| if any of the path doesn't exist."""
     if not root:
         return default
     if not path:
@@ -87,7 +93,7 @@ def _AddPrefix(element, prefix):
     if element is None:
         return element
     # Note, not Iterable because we don't want to handle strings like that.
-    if isinstance(element, list) or isinstance(element, tuple):
+    if isinstance(element, (list, tuple)):
         return [prefix + e for e in element]
     else:
         return prefix + element
@@ -95,11 +101,11 @@ def _AddPrefix(element, prefix):
 
 def _DoRemapping(element, map):
     """If |element| then remap it through |map|. If |element| is iterable then
-  each item will be remapped. Any elements not found will be removed."""
+    each item will be remapped. Any elements not found will be removed."""
     if map is not None and element is not None:
         if not callable(map):
             map = map.get  # Assume it's a dict, otherwise a callable to do the remap.
-        if isinstance(element, list) or isinstance(element, tuple):
+        if isinstance(element, (list, tuple)):
             element = filter(None, [map(elem) for elem in element])
         else:
             element = map(element)
@@ -108,10 +114,10 @@ def _DoRemapping(element, map):
 
 def _AppendOrReturn(append, element):
     """If |append| is None, simply return |element|. If |append| is not None,
-  then add |element| to it, adding each item in |element| if it's a list or
-  tuple."""
+    then add |element| to it, adding each item in |element| if it's a list or
+    tuple."""
     if append is not None and element is not None:
-        if isinstance(element, list) or isinstance(element, tuple):
+        if isinstance(element, (list, tuple)):
             append.extend(element)
         else:
             append.append(element)
@@ -121,8 +127,8 @@ def _AppendOrReturn(append, element):
 
 def _FindDirectXInstallation():
     """Try to find an installation location for the DirectX SDK. Check for the
-  standard environment variable, and if that doesn't exist, try to find
-  via the registry. May return None if not found in either location."""
+    standard environment variable, and if that doesn't exist, try to find
+    via the registry. May return None if not found in either location."""
     # Return previously calculated value, if there is one
     if hasattr(_FindDirectXInstallation, "dxsdk_dir"):
         return _FindDirectXInstallation.dxsdk_dir
@@ -132,9 +138,7 @@ def _FindDirectXInstallation():
         # Setup params to pass to and attempt to launch reg.exe.
         cmd = ["reg.exe", "query", r"HKLM\Software\Microsoft\DirectX", "/s"]
         p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        stdout = p.communicate()[0]
-        if PY3:
-            stdout = stdout.decode("utf-8")
+        stdout = p.communicate()[0].decode("utf-8")
         for line in stdout.splitlines():
             if "InstallPath" in line:
                 dxsdk_dir = line.split("    ")[3] + "\\"
@@ -146,7 +150,7 @@ def _FindDirectXInstallation():
 
 def GetGlobalVSMacroEnv(vs_version):
     """Get a dict of variables mapping internal VS macro names to their gyp
-  equivalents. Returns all variables that are independent of the target."""
+    equivalents. Returns all variables that are independent of the target."""
     env = {}
     # '$(VSInstallDir)' and '$(VCInstallDir)' are available when and only when
     # Visual Studio is actually installed.
@@ -167,7 +171,7 @@ def GetGlobalVSMacroEnv(vs_version):
 
 def ExtractSharedMSVSSystemIncludes(configs, generator_flags):
     """Finds msvs_system_include_dirs that are common to all targets, removes
-  them from all targets, and returns an OrderedSet containing them."""
+    them from all targets, and returns an OrderedSet containing them."""
     all_system_includes = OrderedSet(configs[0].get("msvs_system_include_dirs", []))
     for config in configs[1:]:
         system_includes = config.get("msvs_system_include_dirs", [])
@@ -179,7 +183,7 @@ def ExtractSharedMSVSSystemIncludes(configs, generator_flags):
     expanded_system_includes = OrderedSet(
         [ExpandMacros(include, env) for include in all_system_includes]
     )
-    if any(["$" in include for include in expanded_system_includes]):
+    if any("$" in include for include in expanded_system_includes):
         # Some path relies on target-specific variables, bail.
         return None
 
@@ -193,10 +197,10 @@ def ExtractSharedMSVSSystemIncludes(configs, generator_flags):
     return expanded_system_includes
 
 
-class MsvsSettings(object):
+class MsvsSettings:
     """A class that understands the gyp 'msvs_...' values (especially the
-  msvs_settings field). They largely correpond to the VS2008 IDE DOM. This
-  class helps map those settings to command line options."""
+    msvs_settings field). They largely correpond to the VS2008 IDE DOM. This
+    class helps map those settings to command line options."""
 
     def __init__(self, spec, generator_flags):
         self.spec = spec
@@ -229,7 +233,9 @@ class MsvsSettings(object):
             for config in configs.values():
                 if field in config:
                     unsupported += [
-                        "%s not supported (target %s)." % (field, spec["target_name"])
+                        "{} not supported (target {}).".format(
+                            field, spec["target_name"]
+                        )
                     ]
         if unsupported:
             raise Exception("\n".join(unsupported))
@@ -237,9 +243,9 @@ class MsvsSettings(object):
     def GetExtension(self):
         """Returns the extension for the target, with no leading dot.
 
-    Uses 'product_extension' if specified, otherwise uses MSVS defaults based on
-    the target type.
-    """
+        Uses 'product_extension' if specified, otherwise uses MSVS defaults based on
+        the target type.
+        """
         ext = self.spec.get("product_extension", None)
         if ext:
             return ext
@@ -247,12 +253,9 @@ class MsvsSettings(object):
 
     def GetVSMacroEnv(self, base_to_build=None, config=None):
         """Get a dict of variables mapping internal VS macro names to their gyp
-    equivalents."""
+        equivalents."""
         target_arch = self.GetArch(config)
-        if target_arch == "x86":
-            target_platform = "Win32"
-        else:
-            target_platform = target_arch
+        target_platform = "Win32" if target_arch == "x86" else target_arch
         target_name = self.spec.get("product_prefix", "") + self.spec.get(
             "product_name", self.spec["target_name"]
         )
@@ -294,15 +297,15 @@ class MsvsSettings(object):
 
     def _GetAndMunge(self, field, path, default, prefix, append, map):
         """Retrieve a value from |field| at |path| or return |default|. If
-    |append| is specified, and the item is found, it will be appended to that
-    object instead of returned. If |map| is specified, results will be
-    remapped through |map| before being returned or appended."""
+        |append| is specified, and the item is found, it will be appended to that
+        object instead of returned. If |map| is specified, results will be
+        remapped through |map| before being returned or appended."""
         result = _GenericRetrieve(field, default, path)
         result = _DoRemapping(result, map)
         result = _AddPrefix(result, prefix)
         return _AppendOrReturn(append, result)
 
-    class _GetWrapper(object):
+    class _GetWrapper:
         def __init__(self, parent, field, base_path, append=None):
             self.parent = parent
             self.field = field
@@ -321,7 +324,7 @@ class MsvsSettings(object):
 
     def GetArch(self, config):
         """Get architecture based on msvs_configuration_platform and
-    msvs_target_platform. Returns either 'x86' or 'x64'."""
+        msvs_target_platform. Returns either 'x86' or 'x64'."""
         configuration_platform = self.msvs_configuration_platform.get(config, "")
         platform = self.msvs_target_platform.get(config, "")
         if not platform:  # If no specific override, use the configuration's.
@@ -335,7 +338,7 @@ class MsvsSettings(object):
         # first level is globally for the configuration (this is what we consider
         # "the" config at the gyp level, which will be something like 'Debug' or
         # 'Release'), VS2015 and later only use this level
-        if self.vs_version.short_name >= 2015:
+        if int(self.vs_version.short_name) >= 2015:
             return config
         # and a second target-specific configuration, which is an
         # override for the global one. |config| is remapped here to take into
@@ -368,7 +371,7 @@ class MsvsSettings(object):
 
     def AdjustIncludeDirs(self, include_dirs, config):
         """Updates include_dirs to expand VS specific paths, and adds the system
-    include dirs used for platform SDK and similar."""
+        include dirs used for platform SDK and similar."""
         config = self._TargetConfig(config)
         includes = include_dirs + self.msvs_system_include_dirs[config]
         includes.extend(
@@ -380,7 +383,7 @@ class MsvsSettings(object):
 
     def AdjustMidlIncludeDirs(self, midl_include_dirs, config):
         """Updates midl_include_dirs to expand VS specific paths, and adds the
-    system include dirs used for platform SDK and similar."""
+        system include dirs used for platform SDK and similar."""
         config = self._TargetConfig(config)
         includes = midl_include_dirs + self.msvs_system_include_dirs[config]
         includes.extend(
@@ -392,7 +395,7 @@ class MsvsSettings(object):
 
     def GetComputedDefines(self, config):
         """Returns the set of defines that are injected to the defines list based
-    on other VS settings."""
+        on other VS settings."""
         config = self._TargetConfig(config)
         defines = []
         if self._ConfigAttrib(["CharacterSet"], config) == "1":
@@ -408,7 +411,7 @@ class MsvsSettings(object):
 
     def GetCompilerPdbName(self, config, expand_special):
         """Get the pdb file name that should be used for compiler invocations, or
-    None if there's no explicit name specified."""
+        None if there's no explicit name specified."""
         config = self._TargetConfig(config)
         pdbname = self._Setting(("VCCLCompilerTool", "ProgramDataBaseFileName"), config)
         if pdbname:
@@ -417,7 +420,7 @@ class MsvsSettings(object):
 
     def GetMapFileName(self, config, expand_special):
         """Gets the explicitly overridden map file name for a target or returns None
-    if it's not set."""
+        if it's not set."""
         config = self._TargetConfig(config)
         map_file = self._Setting(("VCLinkerTool", "MapFileName"), config)
         if map_file:
@@ -426,7 +429,7 @@ class MsvsSettings(object):
 
     def GetOutputName(self, config, expand_special):
         """Gets the explicitly overridden output name for a target or returns None
-    if it's not overridden."""
+        if it's not overridden."""
         config = self._TargetConfig(config)
         type = self.spec["type"]
         root = "VCLibrarianTool" if type == "static_library" else "VCLinkerTool"
@@ -440,7 +443,7 @@ class MsvsSettings(object):
 
     def GetPDBName(self, config, expand_special, default):
         """Gets the explicitly overridden pdb name for a target or returns
-    default if it's not overridden, or if no pdb will be generated."""
+        default if it's not overridden, or if no pdb will be generated."""
         config = self._TargetConfig(config)
         output_file = self._Setting(("VCLinkerTool", "ProgramDatabaseFile"), config)
         generate_debug_info = self._Setting(
@@ -456,7 +459,7 @@ class MsvsSettings(object):
 
     def GetNoImportLibrary(self, config):
         """If NoImportLibrary: true, ninja will not expect the output to include
-    an import library."""
+        an import library."""
         config = self._TargetConfig(config)
         noimplib = self._Setting(("NoImportLibrary",), config)
         return noimplib == "true"
@@ -539,7 +542,7 @@ class MsvsSettings(object):
                 )
             ]
         )
-        if self.vs_version.project_version >= 12.0:
+        if float(self.vs_version.project_version) >= 12.0:
             # New flag introduced in VS2013 (project version 12.0) Forces writes to
             # the program database (PDB) to be serialized through MSPDBSRV.EXE.
             # https://msdn.microsoft.com/en-us/library/dn502518.aspx
@@ -549,8 +552,7 @@ class MsvsSettings(object):
         return cflags
 
     def _GetPchFlags(self, config, extension):
-        """Get the flags to be added to the cflags for precompiled header support.
-    """
+        """Get the flags to be added to the cflags for precompiled header support."""
         config = self._TargetConfig(config)
         # The PCH is only built once by a particular source file. Usage of PCH must
         # only be for the same language (i.e. C vs. C++), so only include the pch
@@ -575,7 +577,7 @@ class MsvsSettings(object):
 
     def _GetAdditionalLibraryDirectories(self, root, config, gyp_to_build_path):
         """Get and normalize the list of paths in AdditionalLibraryDirectories
-    setting."""
+        setting."""
         config = self._TargetConfig(config)
         libpaths = self._Setting(
             (root, "AdditionalLibraryDirectories"), config, default=[]
@@ -622,14 +624,14 @@ class MsvsSettings(object):
 
     def _GetDefFileAsLdflags(self, ldflags, gyp_to_build_path):
         """.def files get implicitly converted to a ModuleDefinitionFile for the
-    linker in the VS generator. Emulate that behaviour here."""
+        linker in the VS generator. Emulate that behaviour here."""
         def_file = self.GetDefFile(gyp_to_build_path)
         if def_file:
             ldflags.append('/DEF:"%s"' % def_file)
 
     def GetPGDName(self, config, expand_special):
         """Gets the explicitly overridden pgd name for a target or returns None
-    if it's not overridden."""
+        if it's not overridden."""
         config = self._TargetConfig(config)
         output_file = self._Setting(("VCLinkerTool", "ProfileGuidedDatabase"), config)
         if output_file:
@@ -649,7 +651,7 @@ class MsvsSettings(object):
         build_dir,
     ):
         """Returns the flags that need to be added to link commands, and the
-    manifest files."""
+        manifest files."""
         config = self._TargetConfig(config)
         ldflags = []
         ld = self._GetWrapper(
@@ -709,7 +711,7 @@ class MsvsSettings(object):
             )
             if stack_commit_size:
                 stack_commit_size = "," + stack_commit_size
-            ldflags.append("/STACK:%s%s" % (stack_reserve_size, stack_commit_size))
+            ldflags.append(f"/STACK:{stack_reserve_size}{stack_commit_size}")
 
         ld("TerminalServerAware", map={"1": ":NO", "2": ""}, prefix="/TSAWARE")
         ld("LinkIncremental", map={"1": ":NO", "2": ""}, prefix="/INCREMENTAL")
@@ -733,10 +735,7 @@ class MsvsSettings(object):
         # TODO(scottmg): This should sort of be somewhere else (not really a flag).
         ld("AdditionalDependencies", prefix="")
 
-        if self.GetArch(config) == "x86":
-            safeseh_default = "true"
-        else:
-            safeseh_default = None
+        safeseh_default = "true" if self.GetArch(config) == "x86" else None
         ld(
             "ImageHasSafeExceptionHandlers",
             map={"false": ":NO", "true": ""},
@@ -775,12 +774,12 @@ class MsvsSettings(object):
         self, config, name, gyp_to_build_path, allow_isolation, build_dir
     ):
         """Returns a 3-tuple:
-    - the set of flags that need to be added to the link to generate
-      a default manifest
-    - the intermediate manifest that the linker will generate that should be
-      used to assert it doesn't add anything to the merged one.
-    - the list of all the manifest files to be merged by the manifest tool and
-      included into the link."""
+        - the set of flags that need to be added to the link to generate
+          a default manifest
+        - the intermediate manifest that the linker will generate that should be
+          used to assert it doesn't add anything to the merged one.
+        - the list of all the manifest files to be merged by the manifest tool and
+          included into the link."""
         generate_manifest = self._Setting(
             ("VCLinkerTool", "GenerateManifest"), config, default="true"
         )
@@ -835,10 +834,10 @@ class MsvsSettings(object):
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
     <requestedPrivileges>
-      <requestedExecutionLevel level='%s' uiAccess='%s' />
+      <requestedExecutionLevel level='{}' uiAccess='{}' />
     </requestedPrivileges>
   </security>
-</trustInfo>""" % (
+</trustInfo>""".format(
                 execution_level_map[execution_level],
                 ui_access,
             )
@@ -867,7 +866,7 @@ class MsvsSettings(object):
 
     def _GetAdditionalManifestFiles(self, config, gyp_to_build_path):
         """Gets additional manifest files that are added to the default one
-    generated by the linker."""
+        generated by the linker."""
         files = self._Setting(
             ("VCManifestTool", "AdditionalManifestFiles"), config, default=[]
         )
@@ -880,7 +879,7 @@ class MsvsSettings(object):
 
     def IsUseLibraryDependencyInputs(self, config):
         """Returns whether the target should be linked via Use Library Dependency
-    Inputs (using component .objs of a given .lib)."""
+        Inputs (using component .objs of a given .lib)."""
         config = self._TargetConfig(config)
         uldi = self._Setting(("VCLinkerTool", "UseLibraryDependencyInputs"), config)
         return uldi == "true"
@@ -901,7 +900,7 @@ class MsvsSettings(object):
 
     def GetRcflags(self, config, gyp_to_ninja_path):
         """Returns the flags that need to be added to invocations of the resource
-    compiler."""
+        compiler."""
         config = self._TargetConfig(config)
         rcflags = []
         rc = self._GetWrapper(
@@ -916,13 +915,13 @@ class MsvsSettings(object):
 
     def BuildCygwinBashCommandLine(self, args, path_to_base):
         """Build a command line that runs args via cygwin bash. We assume that all
-    incoming paths are in Windows normpath'd form, so they need to be
-    converted to posix style for the part of the command line that's passed to
-    bash. We also have to do some Visual Studio macro emulation here because
-    various rules use magic VS names for things. Also note that rules that
-    contain ninja variables cannot be fixed here (for example ${source}), so
-    the outer generator needs to make sure that the paths that are written out
-    are in posix style, if the command line will be used here."""
+        incoming paths are in Windows normpath'd form, so they need to be
+        converted to posix style for the part of the command line that's passed to
+        bash. We also have to do some Visual Studio macro emulation here because
+        various rules use magic VS names for things. Also note that rules that
+        contain ninja variables cannot be fixed here (for example ${source}), so
+        the outer generator needs to make sure that the paths that are written out
+        are in posix style, if the command line will be used here."""
         cygwin_dir = os.path.normpath(
             os.path.join(path_to_base, self.msvs_cygwin_dirs[0])
         )
@@ -932,46 +931,52 @@ class MsvsSettings(object):
         bash_cmd = " ".join(args)
         cmd = (
             'call "%s\\setup_env.bat" && set CYGWIN=nontsec && ' % cygwin_dir
-            + 'bash -c "%s ; %s"' % (cd, bash_cmd)
+            + f'bash -c "{cd} ; {bash_cmd}"'
         )
         return cmd
 
-    def IsRuleRunUnderCygwin(self, rule):
-        """Determine if an action should be run under cygwin. If the variable is
-    unset, or set to 1 we use cygwin."""
-        return (
-            int(rule.get("msvs_cygwin_shell", self.spec.get("msvs_cygwin_shell", 1)))
-            != 0
-        )
+    RuleShellFlags = collections.namedtuple("RuleShellFlags", ["cygwin", "quote"])
+
+    def GetRuleShellFlags(self, rule):
+        """Return RuleShellFlags about how the given rule should be run. This
+        includes whether it should run under cygwin (msvs_cygwin_shell), and
+        whether the commands should be quoted (msvs_quote_cmd)."""
+        # If the variable is unset, or set to 1 we use cygwin
+        cygwin = int(rule.get("msvs_cygwin_shell",
+                              self.spec.get("msvs_cygwin_shell", 1))) != 0
+        # Default to quoting. There's only a few special instances where the
+        # target command uses non-standard command line parsing and handle quotes
+        # and quote escaping differently.
+        quote_cmd = int(rule.get("msvs_quote_cmd", 1))
+        assert quote_cmd != 0 or cygwin != 1, \
+               "msvs_quote_cmd=0 only applicable for msvs_cygwin_shell=0"
+        return MsvsSettings.RuleShellFlags(cygwin, quote_cmd)
 
     def _HasExplicitRuleForExtension(self, spec, extension):
         """Determine if there's an explicit rule for a particular extension."""
-        for rule in spec.get("rules", []):
-            if rule["extension"] == extension:
-                return True
-        return False
+        return any(rule["extension"] == extension for rule in spec.get("rules", []))
 
     def _HasExplicitIdlActions(self, spec):
         """Determine if an action should not run midl for .idl files."""
         return any(
-            [action.get("explicit_idl_action", 0) for action in spec.get("actions", [])]
+            action.get("explicit_idl_action", 0) for action in spec.get("actions", [])
         )
 
     def HasExplicitIdlRulesOrActions(self, spec):
         """Determine if there's an explicit rule or action for idl files. When
-    there isn't we need to generate implicit rules to build MIDL .idl files."""
+        there isn't we need to generate implicit rules to build MIDL .idl files."""
         return self._HasExplicitRuleForExtension(
             spec, "idl"
         ) or self._HasExplicitIdlActions(spec)
 
     def HasExplicitAsmRules(self, spec):
         """Determine if there's an explicit rule for asm files. When there isn't we
-    need to generate implicit rules to assemble .asm files."""
+        need to generate implicit rules to assemble .asm files."""
         return self._HasExplicitRuleForExtension(spec, "asm")
 
     def GetIdlBuildData(self, source, config):
         """Determine the implicit outputs for an idl file. Returns output
-    directory, outputs, and variables and flags that are required."""
+        directory, outputs, and variables and flags that are required."""
         config = self._TargetConfig(config)
         midl_get = self._GetWrapper(self, self.msvs_settings[config], "VCMIDLTool")
 
@@ -1010,10 +1015,10 @@ def _LanguageMatchesForPch(source_ext, pch_source_ext):
     )
 
 
-class PrecompiledHeader(object):
+class PrecompiledHeader:
     """Helper to generate dependencies and build rules to handle generation of
-  precompiled headers. Interface matches the GCH handler in xcode_emulation.py.
-  """
+    precompiled headers. Interface matches the GCH handler in xcode_emulation.py.
+    """
 
     def __init__(
         self, settings, config, gyp_to_build_path, gyp_to_unique_output, obj_ext
@@ -1027,14 +1032,14 @@ class PrecompiledHeader(object):
 
     def _PchHeader(self):
         """Get the header that will appear in an #include line for all source
-    files."""
+        files."""
         return self.settings.msvs_precompiled_header[self.config]
 
     def GetObjDependencies(self, sources, objs, arch):
         """Given a list of sources files and the corresponding object files,
-    returns a list of the pch files that should be depended upon. The
-    additional wrapping in the return value is for interface compatibility
-    with make.py on Mac, and xcode_emulation.py."""
+        returns a list of the pch files that should be depended upon. The
+        additional wrapping in the return value is for interface compatibility
+        with make.py on Mac, and xcode_emulation.py."""
         assert arch is None
         if not self._PchHeader():
             return []
@@ -1046,14 +1051,14 @@ class PrecompiledHeader(object):
 
     def GetPchBuildCommands(self, arch):
         """Not used on Windows as there are no additional build steps required
-    (instead, existing steps are modified in GetFlagsModifications below)."""
+        (instead, existing steps are modified in GetFlagsModifications below)."""
         return []
 
     def GetFlagsModifications(
         self, input, output, implicit, command, cflags_c, cflags_cc, expand_special
     ):
         """Get the modified cflags and implicit dependencies that should be used
-    for the pch compilation step."""
+        for the pch compilation step."""
         if input == self.pch_source:
             pch_output = ["/Yc" + self._PchHeader()]
             if command == "cxx":
@@ -1090,7 +1095,7 @@ def _GetVsvarsSetupArgs(generator_flags, arch):
 
 def ExpandMacros(string, expansions):
     """Expand $(Variable) per expansions dict. See MsvsSettings.GetVSMacroEnv
-  for the canonical way to retrieve a suitable dict."""
+    for the canonical way to retrieve a suitable dict."""
     if "$" in string:
         for old, new in expansions.items():
             assert "$(" not in new, new
@@ -1100,7 +1105,7 @@ def ExpandMacros(string, expansions):
 
 def _ExtractImportantEnvironment(output_of_set):
     """Extracts environment variables required for the toolchain to run from
-  a textual dump output by the cmd.exe 'set' command."""
+    a textual dump output by the cmd.exe 'set' command."""
     envvars_to_save = (
         "goma_.*",  # TODO(scottmg): This is ugly, but needed for goma.
         "include",
@@ -1140,8 +1145,8 @@ def _ExtractImportantEnvironment(output_of_set):
 
 def _FormatAsEnvironmentBlock(envvar_dict):
     """Format as an 'environment block' directly suitable for CreateProcess.
-  Briefly this is a list of key=value\0, terminated by an additional \0. See
-  CreateProcess documentation for more details."""
+    Briefly this is a list of key=value\0, terminated by an additional \0. See
+    CreateProcess documentation for more details."""
     block = ""
     nul = "\0"
     for key, value in envvar_dict.items():
@@ -1152,7 +1157,7 @@ def _FormatAsEnvironmentBlock(envvar_dict):
 
 def _ExtractCLPath(output_of_where):
     """Gets the path to cl.exe based on the output of calling the environment
-  setup batch file, followed by the equivalent of `where`."""
+    setup batch file, followed by the equivalent of `where`."""
     # Take the first line, as that's the first found in the PATH.
     for line in output_of_where.strip().splitlines():
         if line.startswith("LOC:"):
@@ -1163,19 +1168,19 @@ def GenerateEnvironmentFiles(
     toplevel_build_dir, generator_flags, system_includes, open_out
 ):
     """It's not sufficient to have the absolute path to the compiler, linker,
-  etc. on Windows, as those tools rely on .dlls being in the PATH. We also
-  need to support both x86 and x64 compilers within the same build (to support
-  msvs_target_platform hackery). Different architectures require a different
-  compiler binary, and different supporting environment variables (INCLUDE,
-  LIB, LIBPATH). So, we extract the environment here, wrap all invocations
-  of compiler tools (cl, link, lib, rc, midl, etc.) via win_tool.py which
-  sets up the environment, and then we do not prefix the compiler with
-  an absolute path, instead preferring something like "cl.exe" in the rule
-  which will then run whichever the environment setup has put in the path.
-  When the following procedure to generate environment files does not
-  meet your requirement (e.g. for custom toolchains), you can pass
-  "-G ninja_use_custom_environment_files" to the gyp to suppress file
-  generation and use custom environment files prepared by yourself."""
+    etc. on Windows, as those tools rely on .dlls being in the PATH. We also
+    need to support both x86 and x64 compilers within the same build (to support
+    msvs_target_platform hackery). Different architectures require a different
+    compiler binary, and different supporting environment variables (INCLUDE,
+    LIB, LIBPATH). So, we extract the environment here, wrap all invocations
+    of compiler tools (cl, link, lib, rc, midl, etc.) via win_tool.py which
+    sets up the environment, and then we do not prefix the compiler with
+    an absolute path, instead preferring something like "cl.exe" in the rule
+    which will then run whichever the environment setup has put in the path.
+    When the following procedure to generate environment files does not
+    meet your requirement (e.g. for custom toolchains), you can pass
+    "-G ninja_use_custom_environment_files" to the gyp to suppress file
+    generation and use custom environment files prepared by yourself."""
     archs = ("x86", "x64")
     if generator_flags.get("ninja_use_custom_environment_files", 0):
         cl_paths = {}
@@ -1191,9 +1196,7 @@ def GenerateEnvironmentFiles(
         popen = subprocess.Popen(
             args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
-        variables, _ = popen.communicate()
-        if PY3:
-            variables = variables.decode("utf-8")
+        variables = popen.communicate()[0].decode("utf-8")
         if popen.returncode != 0:
             raise Exception('"%s" failed with error %d' % (args, popen.returncode))
         env = _ExtractImportantEnvironment(variables)
@@ -1216,19 +1219,17 @@ def GenerateEnvironmentFiles(
             ("&&", "for", "%i", "in", "(cl.exe)", "do", "@echo", "LOC:%~$PATH:i")
         )
         popen = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE)
-        output, _ = popen.communicate()
-        if PY3:
-            output = output.decode("utf-8")
+        output = popen.communicate()[0].decode("utf-8")
         cl_paths[arch] = _ExtractCLPath(output)
     return cl_paths
 
 
 def VerifyMissingSources(sources, build_dir, generator_flags, gyp_to_ninja):
     """Emulate behavior of msvs_error_on_missing_sources present in the msvs
-  generator: Check that all regular source files, i.e. not created at run time,
-  exist on disk. Missing files cause needless recompilation when building via
-  VS, and we want this check to match for people/bots that build using ninja,
-  so they're not surprised when the VS build fails."""
+    generator: Check that all regular source files, i.e. not created at run time,
+    exist on disk. Missing files cause needless recompilation when building via
+    VS, and we want this check to match for people/bots that build using ninja,
+    so they're not surprised when the VS build fails."""
     if int(generator_flags.get("msvs_error_on_missing_sources", 0)):
         no_specials = filter(lambda x: "$" not in x, sources)
         relative = [os.path.join(build_dir, gyp_to_ninja(s)) for s in no_specials]
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py
similarity index 97%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py
index 14212358..0e3e86c7 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py
@@ -16,7 +16,7 @@ def escape_path(word):
     return word.replace("$ ", "$$ ").replace(" ", "$ ").replace(":", "$:")
 
 
-class Writer(object):
+class Writer:
     def __init__(self, output, width=78):
         self.output = output
         self.width = width
@@ -33,7 +33,7 @@ class Writer(object):
             return
         if isinstance(value, list):
             value = " ".join(filter(None, value))  # Filter out empty strings.
-        self._line("%s = %s" % (key, value), indent)
+        self._line(f"{key} = {value}", indent)
 
     def pool(self, name, depth):
         self._line("pool %s" % name)
@@ -89,7 +89,7 @@ class Writer(object):
             all_inputs.extend(order_only)
 
         self._line(
-            "build %s: %s" % (" ".join(out_outputs), " ".join([rule] + all_inputs))
+            "build {}: {}".format(" ".join(out_outputs), " ".join([rule] + all_inputs))
         )
 
         if variables:
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py
similarity index 88%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py
index e01106f9..729cec06 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py
@@ -36,10 +36,7 @@ def _deepcopy_atomic(x):
     return x
 
 
-try:
-    types = bool, float, int, str, type, type(None), long, unicode
-except NameError:  # Python 3
-    types = bool, float, int, str, type, type(None)
+types = bool, float, int, str, type, type(None)
 
 for x in types:
     d[x] = _deepcopy_atomic
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py
similarity index 93%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py
index 758e9f5c..171d7295 100755
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Copyright (c) 2012 Google Inc. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -9,7 +9,6 @@
 These functions are executed via gyp-win-tool when using the ninja generator.
 """
 
-from __future__ import print_function
 
 import os
 import re
@@ -20,7 +19,6 @@ import string
 import sys
 
 BASE_DIR = os.path.dirname(os.path.abspath(__file__))
-PY3 = bytes != str
 
 # A regex matching an argument corresponding to the output filename passed to
 # link.exe.
@@ -34,7 +32,7 @@ def main(args):
         sys.exit(exit_code)
 
 
-class WinTool(object):
+class WinTool:
     """This class performs all the Windows tooling steps. The methods can either
   be executed directly, or dispatched from an argument list."""
 
@@ -141,9 +139,7 @@ class WinTool(object):
             stdout=subprocess.PIPE,
             stderr=subprocess.STDOUT,
         )
-        out, _ = link.communicate()
-        if PY3:
-            out = out.decode("utf-8")
+        out = link.communicate()[0].decode("utf-8")
         for line in out.splitlines():
             if (
                 not line.startswith("   Creating library ")
@@ -223,17 +219,17 @@ class WinTool(object):
             our_manifest = "%(out)s.manifest" % variables
             # Load and normalize the manifests. mt.exe sometimes removes whitespace,
             # and sometimes doesn't unfortunately.
-            with open(our_manifest, "r") as our_f:
-                with open(assert_manifest, "r") as assert_f:
-                    our_data = our_f.read().translate(None, string.whitespace)
-                    assert_data = assert_f.read().translate(None, string.whitespace)
+            with open(our_manifest) as our_f, open(assert_manifest) as assert_f:
+                translator = str.maketrans("", "", string.whitespace)
+                our_data = our_f.read().translate(translator)
+                assert_data = assert_f.read().translate(translator)
             if our_data != assert_data:
                 os.unlink(out)
 
                 def dump(filename):
                     print(filename, file=sys.stderr)
                     print("-----", file=sys.stderr)
-                    with open(filename, "r") as f:
+                    with open(filename) as f:
                         print(f.read(), file=sys.stderr)
                         print("-----", file=sys.stderr)
 
@@ -256,9 +252,7 @@ class WinTool(object):
         popen = subprocess.Popen(
             args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
-        out, _ = popen.communicate()
-        if PY3:
-            out = out.decode("utf-8")
+        out = popen.communicate()[0].decode("utf-8")
         for line in out.splitlines():
             if line and "manifest authoring warning 81010002" not in line:
                 print(line)
@@ -302,16 +296,14 @@ class WinTool(object):
         popen = subprocess.Popen(
             args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
-        out, _ = popen.communicate()
-        if PY3:
-            out = out.decode("utf-8")
+        out = popen.communicate()[0].decode("utf-8")
         # Filter junk out of stdout, and write filtered versions. Output we want
         # to filter is pairs of lines that look like this:
         # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl
         # objidl.idl
         lines = out.splitlines()
         prefixes = ("Processing ", "64 bit Processing ")
-        processing = set(os.path.basename(x) for x in lines if x.startswith(prefixes))
+        processing = {os.path.basename(x) for x in lines if x.startswith(prefixes)}
         for line in lines:
             if not line.startswith(prefixes) and line not in processing:
                 print(line)
@@ -323,9 +315,7 @@ class WinTool(object):
         popen = subprocess.Popen(
             args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
-        out, _ = popen.communicate()
-        if PY3:
-            out = out.decode("utf-8")
+        out = popen.communicate()[0].decode("utf-8")
         for line in out.splitlines():
             if (
                 not line.startswith("Copyright (C) Microsoft Corporation")
@@ -343,9 +333,7 @@ class WinTool(object):
         popen = subprocess.Popen(
             args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
         )
-        out, _ = popen.communicate()
-        if PY3:
-            out = out.decode("utf-8")
+        out = popen.communicate()[0].decode("utf-8")
         for line in out.splitlines():
             if (
                 not line.startswith("Microsoft (R) Windows (R) Resource Compiler")
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py
similarity index 96%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py
index 8af2b39f..29caf1ce 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py
@@ -7,7 +7,6 @@ This module contains classes that help to emulate xcodebuild behavior on top of
 other build systems, such as make and ninja.
 """
 
-from __future__ import print_function
 
 import copy
 import gyp.common
@@ -19,8 +18,6 @@ import subprocess
 import sys
 from gyp.common import GypError
 
-PY3 = bytes != str
-
 # Populated lazily by XcodeVersion, for efficiency, and to fix an issue when
 # "xcodebuild" is called too quickly (it has been found to return incorrect
 # version number).
@@ -40,7 +37,7 @@ def XcodeArchsVariableMapping(archs, archs_including_64_bit=None):
     return mapping
 
 
-class XcodeArchsDefault(object):
+class XcodeArchsDefault:
     """A class to resolve ARCHS variable from xcode_settings, resolving Xcode
   macros and implementing filtering by VALID_ARCHS. The expansion of macros
   depends on the SDKROOT used ("macosx", "iphoneos", "iphonesimulator") and
@@ -148,7 +145,7 @@ def GetXcodeArchsDefault():
     return XCODE_ARCHS_DEFAULT_CACHE
 
 
-class XcodeSettings(object):
+class XcodeSettings:
     """A class that understands the gyp 'xcode_settings' object."""
 
     # Populated lazily by _SdkPath(). Shared by all XcodeSettings, so cached
@@ -281,7 +278,7 @@ class XcodeSettings(object):
             else:
                 return "." + self.spec.get("product_extension", "app")
         else:
-            assert False, "Don't know extension for '%s', target '%s'" % (
+            assert False, "Don't know extension for '{}', target '{}'".format(
                 self.spec["type"],
                 self.spec["target_name"],
             )
@@ -654,28 +651,32 @@ class XcodeSettings(object):
         self._WarnUnimplemented("MACH_O_TYPE")
         self._WarnUnimplemented("PRODUCT_TYPE")
 
-        if arch is not None:
-            archs = [arch]
-        else:
-            assert self.configname
-            archs = self.GetActiveArchs(self.configname)
-        if len(archs) != 1:
-            # TODO: Supporting fat binaries will be annoying.
-            self._WarnUnimplemented("ARCHS")
-            archs = ["i386"]
-        cflags.append("-arch " + archs[0])
-
-        if archs[0] in ("i386", "x86_64"):
-            if self._Test("GCC_ENABLE_SSE3_EXTENSIONS", "YES", default="NO"):
-                cflags.append("-msse3")
-            if self._Test(
-                "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS", "YES", default="NO"
-            ):
-                cflags.append("-mssse3")  # Note 3rd 's'.
-            if self._Test("GCC_ENABLE_SSE41_EXTENSIONS", "YES", default="NO"):
-                cflags.append("-msse4.1")
-            if self._Test("GCC_ENABLE_SSE42_EXTENSIONS", "YES", default="NO"):
-                cflags.append("-msse4.2")
+        # If GYP_CROSSCOMPILE (--cross-compiling), disable architecture-specific
+        # additions and assume these will be provided as required via CC_host,
+        # CXX_host, CC_target and CXX_target.
+        if not gyp.common.CrossCompileRequested():
+            if arch is not None:
+                archs = [arch]
+            else:
+                assert self.configname
+                archs = self.GetActiveArchs(self.configname)
+            if len(archs) != 1:
+                # TODO: Supporting fat binaries will be annoying.
+                self._WarnUnimplemented("ARCHS")
+                archs = ["i386"]
+            cflags.append("-arch " + archs[0])
+
+            if archs[0] in ("i386", "x86_64"):
+                if self._Test("GCC_ENABLE_SSE3_EXTENSIONS", "YES", default="NO"):
+                    cflags.append("-msse3")
+                if self._Test(
+                    "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS", "YES", default="NO"
+                ):
+                    cflags.append("-mssse3")  # Note 3rd 's'.
+                if self._Test("GCC_ENABLE_SSE41_EXTENSIONS", "YES", default="NO"):
+                    cflags.append("-msse4.1")
+                if self._Test("GCC_ENABLE_SSE42_EXTENSIONS", "YES", default="NO"):
+                    cflags.append("-msse4.2")
 
         cflags += self._Settings().get("WARNING_CFLAGS", [])
 
@@ -684,10 +685,7 @@ class XcodeSettings(object):
             if platform_root:
                 cflags.append("-F" + platform_root + "/Developer/Library/Frameworks/")
 
-        if sdk_root:
-            framework_root = sdk_root
-        else:
-            framework_root = ""
+        framework_root = sdk_root if sdk_root else ""
         config = self.spec["configurations"][self.configname]
         framework_dirs = config.get("mac_framework_dirs", [])
         for directory in framework_dirs:
@@ -938,16 +936,17 @@ class XcodeSettings(object):
                 + gyp_to_build_path(self._Settings()["ORDER_FILE"])
             )
 
-        if arch is not None:
-            archs = [arch]
-        else:
-            assert self.configname
-            archs = self.GetActiveArchs(self.configname)
-        if len(archs) != 1:
-            # TODO: Supporting fat binaries will be annoying.
-            self._WarnUnimplemented("ARCHS")
-            archs = ["i386"]
-        ldflags.append("-arch " + archs[0])
+        if not gyp.common.CrossCompileRequested():
+            if arch is not None:
+                archs = [arch]
+            else:
+                assert self.configname
+                archs = self.GetActiveArchs(self.configname)
+            if len(archs) != 1:
+                # TODO: Supporting fat binaries will be annoying.
+                self._WarnUnimplemented("ARCHS")
+                archs = ["i386"]
+            ldflags.append("-arch " + archs[0])
 
         # Xcode adds the product directory by default.
         # Rewrite -L. to -L./ to work around http://www.openradar.me/25313838
@@ -1083,7 +1082,7 @@ class XcodeSettings(object):
 
             if not quiet:
                 result.append("echo STRIP\\(%s\\)" % self.spec["target_name"])
-            result.append("strip %s %s" % (strip_flags, output_binary))
+            result.append(f"strip {strip_flags} {output_binary}")
 
         self.configname = None
         return result
@@ -1105,7 +1104,7 @@ class XcodeSettings(object):
         ):
             if not quiet:
                 result.append("echo DSYMUTIL\\(%s\\)" % self.spec["target_name"])
-            result.append("dsymutil %s -o %s" % (output_binary, output + ".dSYM"))
+            result.append("dsymutil {} -o {}".format(output_binary, output + ".dSYM"))
 
         self.configname = None
         return result
@@ -1138,7 +1137,7 @@ class XcodeSettings(object):
             source = os.path.join("${BUILT_PRODUCTS_DIR}", product_name)
             test_host = os.path.dirname(settings.get("TEST_HOST"))
             xctest_destination = os.path.join(test_host, "PlugIns", product_name)
-            postbuilds.extend(["ditto %s %s" % (source, xctest_destination)])
+            postbuilds.extend([f"ditto {source} {xctest_destination}"])
 
         key = self._GetIOSCodeSignIdentityKey(settings)
         if not key:
@@ -1165,7 +1164,7 @@ class XcodeSettings(object):
             for framework in frameworks:
                 source = os.path.join(platform_root, framework)
                 destination = os.path.join(frameworks_dir, os.path.basename(framework))
-                postbuilds.extend(["ditto %s %s" % (source, destination)])
+                postbuilds.extend([f"ditto {source} {destination}"])
 
                 # Then re-sign everything with 'preserve=True'
                 postbuilds.extend(
@@ -1246,10 +1245,7 @@ class XcodeSettings(object):
             l_flag = "-framework " + os.path.splitext(os.path.basename(library))[0]
         else:
             m = self.library_re.match(library)
-            if m:
-                l_flag = "-l" + m.group(1)
-            else:
-                l_flag = library
+            l_flag = "-l" + m.group(1) if m else library
 
         sdk_root = self._SdkPath(config_name)
         if not sdk_root:
@@ -1366,7 +1362,7 @@ class XcodeSettings(object):
         return ""
 
 
-class MacPrefixHeader(object):
+class MacPrefixHeader:
     """A class that helps with emulating Xcode's GCC_PREFIX_HEADER feature.
 
   This feature consists of several pieces:
@@ -1543,7 +1539,7 @@ def CLTVersion():
         except GypError:
             continue
 
-    regex = re.compile(r'Command Line Tools for Xcode\s+(?P<version>\S+)')
+    regex = re.compile(r"Command Line Tools for Xcode\s+(?P<version>\S+)")
     try:
         output = GetStdout(["/usr/sbin/softwareupdate", "--history"])
         return re.search(regex, output).groupdict()["version"]
@@ -1556,9 +1552,7 @@ def GetStdoutQuiet(cmdlist):
   Ignores the stderr.
   Raises |GypError| if the command return with a non-zero return code."""
     job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    out = job.communicate()[0]
-    if PY3:
-        out = out.decode("utf-8")
+    out = job.communicate()[0].decode("utf-8")
     if job.returncode != 0:
         raise GypError("Error %d running %s" % (job.returncode, cmdlist[0]))
     return out.rstrip("\n")
@@ -1568,9 +1562,7 @@ def GetStdout(cmdlist):
     """Returns the content of standard output returned by invoking |cmdlist|.
   Raises |GypError| if the command return with a non-zero return code."""
     job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE)
-    out = job.communicate()[0]
-    if PY3:
-        out = out.decode("utf-8")
+    out = job.communicate()[0].decode("utf-8")
     if job.returncode != 0:
         sys.stderr.write(out + "\n")
         raise GypError("Error %d running %s" % (job.returncode, cmdlist[0]))
@@ -1866,7 +1858,7 @@ def _TopologicallySortedEnvVarKeys(env):
         # definition contains all variables it references in a single string.
         # We can then reverse the result of the topological sort at the end.
         # Since: reverse(topsort(DAG)) = topsort(reverse_edges(DAG))
-        matches = set([v for v in regex.findall(env[node]) if v in env])
+        matches = {v for v in regex.findall(env[node]) if v in env}
         for dependee in matches:
             assert "${" not in dependee, "Nested variables not supported: " + dependee
         return matches
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py
similarity index 98%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py
index 10ddcbcc..bb74eacb 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py
@@ -43,11 +43,11 @@ def _WriteWorkspace(main_gyp, sources_gyp, params):
     workspace_file = os.path.join(workspace_path, "contents.xcworkspacedata")
 
     try:
-        with open(workspace_file, "r") as input_file:
+        with open(workspace_file) as input_file:
             input_string = input_file.read()
             if input_string == output_string:
                 return
-    except IOError:
+    except OSError:
         # Ignore errors if the file doesn't exist.
         pass
 
@@ -214,7 +214,7 @@ def CreateWrapper(target_list, target_dicts, data, params):
         if IsValidTargetForWrapper(target_extras, executable_target_pattern, spec):
             # Add to new_target_list.
             target_name = spec.get("target_name")
-            new_target_name = "%s:%s#target" % (main_gyp, target_name)
+            new_target_name = f"{main_gyp}:{target_name}#target"
             new_target_list.append(new_target_name)
 
             # Add to new_target_dicts.
@@ -282,7 +282,7 @@ def CreateWrapper(target_list, target_dicts, data, params):
 
     # Put sources_to_index in it's own gyp.
     sources_gyp = os.path.join(os.path.dirname(main_gyp), sources_target_name + ".gyp")
-    fully_qualified_target_name = "%s:%s#target" % (sources_gyp, sources_target_name)
+    fully_qualified_target_name = f"{sources_gyp}:{sources_target_name}#target"
 
     # Add to new_target_list, new_target_dicts and new_data.
     new_target_list.append(fully_qualified_target_name)
diff --git a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py
similarity index 98%
rename from .yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py
index d90dd99d..33c667c2 100644
--- a/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py
@@ -138,19 +138,17 @@ a project file is output.
 """
 
 import gyp.common
+from functools import cmp_to_key
 import hashlib
+from operator import attrgetter
 import posixpath
 import re
 import struct
 import sys
 
-try:
-    basestring, cmp, unicode
-except NameError:  # Python 3
-    basestring = unicode = str
 
-    def cmp(x, y):
-        return (x > y) - (x < y)
+def cmp(x, y):
+    return (x > y) - (x < y)
 
 
 # See XCObject._EncodeString.  This pattern is used to determine when a string
@@ -199,7 +197,7 @@ def ConvertVariablesToShellSyntax(input_string):
     return re.sub(r"\$\((.*?)\)", "${\\1}", input_string)
 
 
-class XCObject(object):
+class XCObject:
     """The abstract base of all class types used in Xcode project files.
 
   Class variables:
@@ -301,8 +299,8 @@ class XCObject(object):
         try:
             name = self.Name()
         except NotImplementedError:
-            return "<%s at 0x%x>" % (self.__class__.__name__, id(self))
-        return "<%s %r at 0x%x>" % (self.__class__.__name__, name, id(self))
+            return f"<{self.__class__.__name__} at 0x{id(self):x}>"
+        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"
 
     def Copy(self):
         """Make a copy of this object.
@@ -325,7 +323,7 @@ class XCObject(object):
                     that._properties[key] = new_value
                 else:
                     that._properties[key] = value
-            elif isinstance(value, (basestring, int)):
+            elif isinstance(value, (str, int)):
                 that._properties[key] = value
             elif isinstance(value, list):
                 if is_strong:
@@ -427,6 +425,8 @@ class XCObject(object):
       """
 
             hash.update(struct.pack(">i", len(data)))
+            if isinstance(data, str):
+                data = data.encode("utf-8")
             hash.update(data)
 
         if seed_hash is None:
@@ -616,7 +616,7 @@ class XCObject(object):
             comment = value.Comment()
         elif isinstance(value, str):
             printable += self._EncodeString(value)
-        elif isinstance(value, basestring):
+        elif isinstance(value, str):
             printable += self._EncodeString(value.encode("utf-8"))
         elif isinstance(value, int):
             printable += str(value)
@@ -791,7 +791,7 @@ class XCObject(object):
                     )
                 for item in value:
                     if not isinstance(item, property_type) and not (
-                        isinstance(item, basestring) and property_type == str
+                        isinstance(item, str) and property_type == str
                     ):
                         # Accept unicode where str is specified.  str is treated as
                         # UTF-8-encoded.
@@ -806,7 +806,7 @@ class XCObject(object):
                             + item.__class__.__name__
                         )
             elif not isinstance(value, property_type) and not (
-                isinstance(value, basestring) and property_type == str
+                isinstance(value, str) and property_type == str
             ):
                 # Accept unicode where str is specified.  str is treated as
                 # UTF-8-encoded.
@@ -827,7 +827,7 @@ class XCObject(object):
                         self._properties[property] = value.Copy()
                     else:
                         self._properties[property] = value
-                elif isinstance(value, (basestring, int)):
+                elif isinstance(value, (str, int)):
                     self._properties[property] = value
                 elif isinstance(value, list):
                     if is_strong:
@@ -971,7 +971,7 @@ class XCHierarchicalElement(XCObject):
         if "path" in self._properties and "name" not in self._properties:
             path = self._properties["path"]
             name = posixpath.basename(path)
-            if name != "" and path != name:
+            if name not in ("", path):
                 self.SetProperty("name", name)
 
         if "path" in self._properties and (
@@ -1487,7 +1487,7 @@ class PBXGroup(XCHierarchicalElement):
 
     def SortGroup(self):
         self._properties["children"] = sorted(
-            self._properties["children"], cmp=lambda x, y: x.Compare(y)
+            self._properties["children"], key=cmp_to_key(lambda x, y: x.Compare(y))
         )
 
         # Recurse.
@@ -2185,7 +2185,7 @@ class PBXCopyFilesBuildPhase(XCBuildPhase):
             relative_path = path[1:]
         else:
             raise ValueError(
-                "Can't use path %s in a %s" % (path, self.__class__.__name__)
+                f"Can't use path {path} in a {self.__class__.__name__}"
             )
 
         self._properties["dstPath"] = relative_path
@@ -2250,8 +2250,8 @@ class PBXContainerItemProxy(XCObject):
 
     def __repr__(self):
         props = self._properties
-        name = "%s.gyp:%s" % (props["containerPortal"].Name(), props["remoteInfo"])
-        return "<%s %r at 0x%x>" % (self.__class__.__name__, name, id(self))
+        name = "{}.gyp:{}".format(props["containerPortal"].Name(), props["remoteInfo"])
+        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"
 
     def Name(self):
         # Admittedly not the best name, but it's what Xcode uses.
@@ -2288,7 +2288,7 @@ class PBXTargetDependency(XCObject):
 
     def __repr__(self):
         name = self._properties.get("name") or self._properties["target"].Name()
-        return "<%s %r at 0x%x>" % (self.__class__.__name__, name, id(self))
+        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"
 
     def Name(self):
         # Admittedly not the best name, but it's what Xcode uses.
@@ -2355,9 +2355,8 @@ class XCTarget(XCRemoteObject):
         # property was supplied, set "productName" if it is not present.  Also set
         # the "PRODUCT_NAME" build setting in each configuration, but only if
         # the setting is not present in any build configuration.
-        if "name" in self._properties:
-            if "productName" not in self._properties:
-                self.SetProperty("productName", self._properties["name"])
+        if "name" in self._properties and "productName" not in self._properties:
+            self.SetProperty("productName", self._properties["name"])
 
         if "productName" in self._properties:
             if "buildConfigurationList" in self._properties:
@@ -2547,13 +2546,12 @@ class PBXNativeTarget(XCTarget):
                         force_extension = suffix[1:]
 
                 if (
-                    self._properties["productType"]
-                    == "com.apple.product-type-bundle.unit.test"
-                    or self._properties["productType"]
-                    == "com.apple.product-type-bundle.ui-testing"
-                ):
-                    if force_extension is None:
-                        force_extension = suffix[1:]
+                    self._properties["productType"] in {
+                        "com.apple.product-type-bundle.unit.test",
+                        "com.apple.product-type-bundle.ui-testing"
+                    }
+                ) and force_extension is None:
+                    force_extension = suffix[1:]
 
                 if force_extension is not None:
                     # If it's a wrapper (bundle), set WRAPPER_EXTENSION.
@@ -2636,10 +2634,13 @@ class PBXNativeTarget(XCTarget):
             # frameworks phases, if any.
             insert_at = len(self._properties["buildPhases"])
             for index, phase in enumerate(self._properties["buildPhases"]):
-                if (
-                    isinstance(phase, PBXResourcesBuildPhase)
-                    or isinstance(phase, PBXSourcesBuildPhase)
-                    or isinstance(phase, PBXFrameworksBuildPhase)
+                if isinstance(
+                    phase,
+                    (
+                        PBXResourcesBuildPhase,
+                        PBXSourcesBuildPhase,
+                        PBXFrameworksBuildPhase,
+                    ),
                 ):
                     insert_at = index
                     break
@@ -2658,9 +2659,7 @@ class PBXNativeTarget(XCTarget):
             # phases, if any.
             insert_at = len(self._properties["buildPhases"])
             for index, phase in enumerate(self._properties["buildPhases"]):
-                if isinstance(phase, PBXSourcesBuildPhase) or isinstance(
-                    phase, PBXFrameworksBuildPhase
-                ):
+                if isinstance(phase, (PBXSourcesBuildPhase, PBXFrameworksBuildPhase)):
                     insert_at = index
                     break
 
@@ -2701,8 +2700,10 @@ class PBXNativeTarget(XCTarget):
                 other._properties["productType"] == static_library_type
                 or (
                     (
-                        other._properties["productType"] == shared_library_type
-                        or other._properties["productType"] == framework_type
+                        other._properties["productType"] in {
+                            shared_library_type,
+                            framework_type
+                        }
                     )
                     and (
                         (not other.HasBuildSetting("MACH_O_TYPE"))
@@ -2770,7 +2771,7 @@ class PBXProject(XCContainerPortal):
         self.path = path
         self._other_pbxprojects = {}
         # super
-        return XCContainerPortal.__init__(self, properties, id, parent)
+        XCContainerPortal.__init__(self, properties, id, parent)
 
     def Name(self):
         name = self.path
@@ -2895,7 +2896,7 @@ class PBXProject(XCContainerPortal):
         # according to their defined order.
         self._properties["mainGroup"]._properties["children"] = sorted(
             self._properties["mainGroup"]._properties["children"],
-            cmp=lambda x, y: x.CompareRootGroup(y),
+            key=cmp_to_key(lambda x, y: x.CompareRootGroup(y)),
         )
 
         # Sort everything else by putting group before files, and going
@@ -2990,9 +2991,7 @@ class PBXProject(XCContainerPortal):
             # Xcode seems to sort this list case-insensitively
             self._properties["projectReferences"] = sorted(
                 self._properties["projectReferences"],
-                cmp=lambda x, y: cmp(
-                    x["ProjectRef"].Name().lower(), y["ProjectRef"].Name().lower()
-                ),
+                key=lambda x: x["ProjectRef"].Name().lower()
             )
         else:
             # The link already exists.  Pull out the relevnt data.
@@ -3124,7 +3123,8 @@ class PBXProject(XCContainerPortal):
             product_group = ref_dict["ProductGroup"]
             product_group._properties["children"] = sorted(
                 product_group._properties["children"],
-                cmp=lambda x, y, rp=remote_products: CompareProducts(x, y, rp),
+                key=cmp_to_key(
+                    lambda x, y, rp=remote_products: CompareProducts(x, y, rp)),
             )
 
 
@@ -3159,7 +3159,7 @@ class XCProjectFile(XCObject):
         else:
             self._XCPrint(file, 0, "{\n")
         for property, value in sorted(
-            self._properties.items(), cmp=lambda x, y: cmp(x, y)
+            self._properties.items()
         ):
             if property == "objects":
                 self._PrintObjects(file)
@@ -3187,7 +3187,7 @@ class XCProjectFile(XCObject):
             self._XCPrint(file, 0, "\n")
             self._XCPrint(file, 0, "/* Begin " + class_name + " section */\n")
             for object in sorted(
-                objects_by_class[class_name], cmp=lambda x, y: cmp(x.id, y.id)
+                objects_by_class[class_name], key=attrgetter("id")
             ):
                 object.Print(file)
             self._XCPrint(file, 0, "/* End " + class_name + " section */\n")
diff --git a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py
similarity index 96%
rename from antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py
rename to .yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py
index 0a945322..53019636 100644
--- a/antora-ui-camel/.yarn/unplugged/node-gyp-npm-7.1.2-002c5798eb/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py
@@ -39,12 +39,12 @@ def _Replacement_writexml(self, writer, indent="", addindent="", newl=""):
         writer.write(">%s" % newl)
         for node in self.childNodes:
             node.writexml(writer, indent + addindent, addindent, newl)
-        writer.write("%s</%s>%s" % (indent, self.tagName, newl))
+        writer.write(f"{indent}</{self.tagName}>{newl}")
     else:
         writer.write("/>%s" % newl)
 
 
-class XmlFix(object):
+class XmlFix:
     """Object to manage temporary patching of xml.dom.minidom."""
 
     def __init__(self):
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE
new file mode 100644
index 00000000..6f62d44e
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE
@@ -0,0 +1,3 @@
+This software is made available under the terms of *either* of the licenses
+found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made
+under the terms of *both* these licenses.
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE
new file mode 100644
index 00000000..f433b1a5
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE
@@ -0,0 +1,177 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD
new file mode 100644
index 00000000..42ce7b75
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD
@@ -0,0 +1,23 @@
+Copyright (c) Donald Stufft and individual contributors.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/__init__.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/__init__.py
new file mode 100644
index 00000000..5fd91838
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/__init__.py
@@ -0,0 +1,15 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+
+__title__ = "packaging"
+__summary__ = "Core utilities for Python packages"
+__uri__ = "https://github.com/pypa/packaging"
+
+__version__ = "23.3.dev0"
+
+__author__ = "Donald Stufft and individual contributors"
+__email__ = "donald@stufft.io"
+
+__license__ = "BSD-2-Clause or Apache-2.0"
+__copyright__ = "2014 %s" % __author__
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py
new file mode 100644
index 00000000..6fb19b30
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py
@@ -0,0 +1,108 @@
+"""
+ELF file parser.
+
+This provides a class ``ELFFile`` that parses an ELF executable in a similar
+interface to ``ZipFile``. Only the read interface is implemented.
+
+Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
+ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
+"""
+
+import enum
+import os
+import struct
+from typing import IO, Optional, Tuple
+
+
+class ELFInvalid(ValueError):
+    pass
+
+
+class EIClass(enum.IntEnum):
+    C32 = 1
+    C64 = 2
+
+
+class EIData(enum.IntEnum):
+    Lsb = 1
+    Msb = 2
+
+
+class EMachine(enum.IntEnum):
+    I386 = 3
+    S390 = 22
+    Arm = 40
+    X8664 = 62
+    AArc64 = 183
+
+
+class ELFFile:
+    """
+    Representation of an ELF executable.
+    """
+
+    def __init__(self, f: IO[bytes]) -> None:
+        self._f = f
+
+        try:
+            ident = self._read("16B")
+        except struct.error:
+            raise ELFInvalid("unable to parse identification")
+        magic = bytes(ident[:4])
+        if magic != b"\x7fELF":
+            raise ELFInvalid(f"invalid magic: {magic!r}")
+
+        self.capacity = ident[4]  # Format for program header (bitness).
+        self.encoding = ident[5]  # Data structure encoding (endianness).
+
+        try:
+            # e_fmt: Format for program header.
+            # p_fmt: Format for section header.
+            # p_idx: Indexes to find p_type, p_offset, and p_filesz.
+            e_fmt, self._p_fmt, self._p_idx = {
+                (1, 1): ("<HHIIIIIHHH", "<IIIIIIII", (0, 1, 4)),  # 32-bit LSB.
+                (1, 2): (">HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)),  # 32-bit MSB.
+                (2, 1): ("<HHIQQQIHHH", "<IIQQQQQQ", (0, 2, 5)),  # 64-bit LSB.
+                (2, 2): (">HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)),  # 64-bit MSB.
+            }[(self.capacity, self.encoding)]
+        except KeyError:
+            raise ELFInvalid(
+                f"unrecognized capacity ({self.capacity}) or "
+                f"encoding ({self.encoding})"
+            )
+
+        try:
+            (
+                _,
+                self.machine,  # Architecture type.
+                _,
+                _,
+                self._e_phoff,  # Offset of program header.
+                _,
+                self.flags,  # Processor-specific flags.
+                _,
+                self._e_phentsize,  # Size of section.
+                self._e_phnum,  # Number of sections.
+            ) = self._read(e_fmt)
+        except struct.error as e:
+            raise ELFInvalid("unable to parse machine and section information") from e
+
+    def _read(self, fmt: str) -> Tuple[int, ...]:
+        return struct.unpack(fmt, self._f.read(struct.calcsize(fmt)))
+
+    @property
+    def interpreter(self) -> Optional[str]:
+        """
+        The path recorded in the ``PT_INTERP`` section header.
+        """
+        for index in range(self._e_phnum):
+            self._f.seek(self._e_phoff + self._e_phentsize * index)
+            try:
+                data = self._read(self._p_fmt)
+            except struct.error:
+                continue
+            if data[self._p_idx[0]] != 3:  # Not PT_INTERP.
+                continue
+            self._f.seek(data[self._p_idx[1]])
+            return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0")
+        return None
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py
new file mode 100644
index 00000000..3705d50d
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py
@@ -0,0 +1,252 @@
+import collections
+import contextlib
+import functools
+import os
+import re
+import sys
+import warnings
+from typing import Dict, Generator, Iterator, NamedTuple, Optional, Sequence, Tuple
+
+from ._elffile import EIClass, EIData, ELFFile, EMachine
+
+EF_ARM_ABIMASK = 0xFF000000
+EF_ARM_ABI_VER5 = 0x05000000
+EF_ARM_ABI_FLOAT_HARD = 0x00000400
+
+
+# `os.PathLike` not a generic type until Python 3.9, so sticking with `str`
+# as the type for `path` until then.
+@contextlib.contextmanager
+def _parse_elf(path: str) -> Generator[Optional[ELFFile], None, None]:
+    try:
+        with open(path, "rb") as f:
+            yield ELFFile(f)
+    except (OSError, TypeError, ValueError):
+        yield None
+
+
+def _is_linux_armhf(executable: str) -> bool:
+    # hard-float ABI can be detected from the ELF header of the running
+    # process
+    # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf
+    with _parse_elf(executable) as f:
+        return (
+            f is not None
+            and f.capacity == EIClass.C32
+            and f.encoding == EIData.Lsb
+            and f.machine == EMachine.Arm
+            and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5
+            and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD
+        )
+
+
+def _is_linux_i686(executable: str) -> bool:
+    with _parse_elf(executable) as f:
+        return (
+            f is not None
+            and f.capacity == EIClass.C32
+            and f.encoding == EIData.Lsb
+            and f.machine == EMachine.I386
+        )
+
+
+def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool:
+    if "armv7l" in archs:
+        return _is_linux_armhf(executable)
+    if "i686" in archs:
+        return _is_linux_i686(executable)
+    allowed_archs = {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x", "loongarch64"}
+    return any(arch in allowed_archs for arch in archs)
+
+
+# If glibc ever changes its major version, we need to know what the last
+# minor version was, so we can build the complete list of all versions.
+# For now, guess what the highest minor version might be, assume it will
+# be 50 for testing. Once this actually happens, update the dictionary
+# with the actual value.
+_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50)
+
+
+class _GLibCVersion(NamedTuple):
+    major: int
+    minor: int
+
+
+def _glibc_version_string_confstr() -> Optional[str]:
+    """
+    Primary implementation of glibc_version_string using os.confstr.
+    """
+    # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely
+    # to be broken or missing. This strategy is used in the standard library
+    # platform module.
+    # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183
+    try:
+        # Should be a string like "glibc 2.17".
+        version_string: str = getattr(os, "confstr")("CS_GNU_LIBC_VERSION")
+        assert version_string is not None
+        _, version = version_string.rsplit()
+    except (AssertionError, AttributeError, OSError, ValueError):
+        # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)...
+        return None
+    return version
+
+
+def _glibc_version_string_ctypes() -> Optional[str]:
+    """
+    Fallback implementation of glibc_version_string using ctypes.
+    """
+    try:
+        import ctypes
+    except ImportError:
+        return None
+
+    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
+    # manpage says, "If filename is NULL, then the returned handle is for the
+    # main program". This way we can let the linker do the work to figure out
+    # which libc our process is actually using.
+    #
+    # We must also handle the special case where the executable is not a
+    # dynamically linked executable. This can occur when using musl libc,
+    # for example. In this situation, dlopen() will error, leading to an
+    # OSError. Interestingly, at least in the case of musl, there is no
+    # errno set on the OSError. The single string argument used to construct
+    # OSError comes from libc itself and is therefore not portable to
+    # hard code here. In any case, failure to call dlopen() means we
+    # can proceed, so we bail on our attempt.
+    try:
+        process_namespace = ctypes.CDLL(None)
+    except OSError:
+        return None
+
+    try:
+        gnu_get_libc_version = process_namespace.gnu_get_libc_version
+    except AttributeError:
+        # Symbol doesn't exist -> therefore, we are not linked to
+        # glibc.
+        return None
+
+    # Call gnu_get_libc_version, which returns a string like "2.5"
+    gnu_get_libc_version.restype = ctypes.c_char_p
+    version_str: str = gnu_get_libc_version()
+    # py2 / py3 compatibility:
+    if not isinstance(version_str, str):
+        version_str = version_str.decode("ascii")
+
+    return version_str
+
+
+def _glibc_version_string() -> Optional[str]:
+    """Returns glibc version string, or None if not using glibc."""
+    return _glibc_version_string_confstr() or _glibc_version_string_ctypes()
+
+
+def _parse_glibc_version(version_str: str) -> Tuple[int, int]:
+    """Parse glibc version.
+
+    We use a regexp instead of str.split because we want to discard any
+    random junk that might come after the minor version -- this might happen
+    in patched/forked versions of glibc (e.g. Linaro's version of glibc
+    uses version strings like "2.20-2014.11"). See gh-3588.
+    """
+    m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
+    if not m:
+        warnings.warn(
+            f"Expected glibc version with 2 components major.minor,"
+            f" got: {version_str}",
+            RuntimeWarning,
+        )
+        return -1, -1
+    return int(m.group("major")), int(m.group("minor"))
+
+
+@functools.lru_cache()
+def _get_glibc_version() -> Tuple[int, int]:
+    version_str = _glibc_version_string()
+    if version_str is None:
+        return (-1, -1)
+    return _parse_glibc_version(version_str)
+
+
+# From PEP 513, PEP 600
+def _is_compatible(arch: str, version: _GLibCVersion) -> bool:
+    sys_glibc = _get_glibc_version()
+    if sys_glibc < version:
+        return False
+    # Check for presence of _manylinux module.
+    try:
+        import _manylinux  # noqa
+    except ImportError:
+        return True
+    if hasattr(_manylinux, "manylinux_compatible"):
+        result = _manylinux.manylinux_compatible(version[0], version[1], arch)
+        if result is not None:
+            return bool(result)
+        return True
+    if version == _GLibCVersion(2, 5):
+        if hasattr(_manylinux, "manylinux1_compatible"):
+            return bool(_manylinux.manylinux1_compatible)
+    if version == _GLibCVersion(2, 12):
+        if hasattr(_manylinux, "manylinux2010_compatible"):
+            return bool(_manylinux.manylinux2010_compatible)
+    if version == _GLibCVersion(2, 17):
+        if hasattr(_manylinux, "manylinux2014_compatible"):
+            return bool(_manylinux.manylinux2014_compatible)
+    return True
+
+
+_LEGACY_MANYLINUX_MAP = {
+    # CentOS 7 w/ glibc 2.17 (PEP 599)
+    (2, 17): "manylinux2014",
+    # CentOS 6 w/ glibc 2.12 (PEP 571)
+    (2, 12): "manylinux2010",
+    # CentOS 5 w/ glibc 2.5 (PEP 513)
+    (2, 5): "manylinux1",
+}
+
+
+def platform_tags(archs: Sequence[str]) -> Iterator[str]:
+    """Generate manylinux tags compatible to the current platform.
+
+    :param archs: Sequence of compatible architectures.
+        The first one shall be the closest to the actual architecture and be the part of
+        platform tag after the ``linux_`` prefix, e.g. ``x86_64``.
+        The ``linux_`` prefix is assumed as a prerequisite for the current platform to
+        be manylinux-compatible.
+
+    :returns: An iterator of compatible manylinux tags.
+    """
+    if not _have_compatible_abi(sys.executable, archs):
+        return
+    # Oldest glibc to be supported regardless of architecture is (2, 17).
+    too_old_glibc2 = _GLibCVersion(2, 16)
+    if set(archs) & {"x86_64", "i686"}:
+        # On x86/i686 also oldest glibc to be supported is (2, 5).
+        too_old_glibc2 = _GLibCVersion(2, 4)
+    current_glibc = _GLibCVersion(*_get_glibc_version())
+    glibc_max_list = [current_glibc]
+    # We can assume compatibility across glibc major versions.
+    # https://sourceware.org/bugzilla/show_bug.cgi?id=24636
+    #
+    # Build a list of maximum glibc versions so that we can
+    # output the canonical list of all glibc from current_glibc
+    # down to too_old_glibc2, including all intermediary versions.
+    for glibc_major in range(current_glibc.major - 1, 1, -1):
+        glibc_minor = _LAST_GLIBC_MINOR[glibc_major]
+        glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor))
+    for arch in archs:
+        for glibc_max in glibc_max_list:
+            if glibc_max.major == too_old_glibc2.major:
+                min_minor = too_old_glibc2.minor
+            else:
+                # For other glibc major versions oldest supported is (x, 0).
+                min_minor = -1
+            for glibc_minor in range(glibc_max.minor, min_minor, -1):
+                glibc_version = _GLibCVersion(glibc_max.major, glibc_minor)
+                tag = "manylinux_{}_{}".format(*glibc_version)
+                if _is_compatible(arch, glibc_version):
+                    yield f"{tag}_{arch}"
+                # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags.
+                if glibc_version in _LEGACY_MANYLINUX_MAP:
+                    legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version]
+                    if _is_compatible(arch, glibc_version):
+                        yield f"{legacy_tag}_{arch}"
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py
new file mode 100644
index 00000000..86419df9
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py
@@ -0,0 +1,83 @@
+"""PEP 656 support.
+
+This module implements logic to detect if the currently running Python is
+linked against musl, and what musl version is used.
+"""
+
+import functools
+import re
+import subprocess
+import sys
+from typing import Iterator, NamedTuple, Optional, Sequence
+
+from ._elffile import ELFFile
+
+
+class _MuslVersion(NamedTuple):
+    major: int
+    minor: int
+
+
+def _parse_musl_version(output: str) -> Optional[_MuslVersion]:
+    lines = [n for n in (n.strip() for n in output.splitlines()) if n]
+    if len(lines) < 2 or lines[0][:4] != "musl":
+        return None
+    m = re.match(r"Version (\d+)\.(\d+)", lines[1])
+    if not m:
+        return None
+    return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2)))
+
+
+@functools.lru_cache()
+def _get_musl_version(executable: str) -> Optional[_MuslVersion]:
+    """Detect currently-running musl runtime version.
+
+    This is done by checking the specified executable's dynamic linking
+    information, and invoking the loader to parse its output for a version
+    string. If the loader is musl, the output would be something like::
+
+        musl libc (x86_64)
+        Version 1.2.2
+        Dynamic Program Loader
+    """
+    try:
+        with open(executable, "rb") as f:
+            ld = ELFFile(f).interpreter
+    except (OSError, TypeError, ValueError):
+        return None
+    if ld is None or "musl" not in ld:
+        return None
+    proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True)
+    return _parse_musl_version(proc.stderr)
+
+
+def platform_tags(archs: Sequence[str]) -> Iterator[str]:
+    """Generate musllinux tags compatible to the current platform.
+
+    :param archs: Sequence of compatible architectures.
+        The first one shall be the closest to the actual architecture and be the part of
+        platform tag after the ``linux_`` prefix, e.g. ``x86_64``.
+        The ``linux_`` prefix is assumed as a prerequisite for the current platform to
+        be musllinux-compatible.
+
+    :returns: An iterator of compatible musllinux tags.
+    """
+    sys_musl = _get_musl_version(sys.executable)
+    if sys_musl is None:  # Python not dynamically linked against musl.
+        return
+    for arch in archs:
+        for minor in range(sys_musl.minor, -1, -1):
+            yield f"musllinux_{sys_musl.major}_{minor}_{arch}"
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import sysconfig
+
+    plat = sysconfig.get_platform()
+    assert plat.startswith("linux-"), "not linux"
+
+    print("plat:", plat)
+    print("musl:", _get_musl_version(sys.executable))
+    print("tags:", end=" ")
+    for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])):
+        print(t, end="\n      ")
diff --git a/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_parser.py b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_parser.py
new file mode 100644
index 00000000..4576981c
--- /dev/null
+++ b/.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/gyp/pylib/packaging/_parser.py
@@ -0,0 +1,359 @@
+"""Handwritten parser of dependency specifiers.
+
+The docstring for each __parse_* function contains ENBF-inspired grammar representing
+the implementation.
+"""
+
+import ast
+from typing import Any, List, NamedTuple, Optional, Tuple, Union
+
+from ._tokenizer import DEFAULT_RULES, Tokenizer
+
+
+class Node:
... 44381 lines suppressed ...