diff --git a/.cargo/config.toml b/.cargo/config.toml index 5a294e43..77c6a38c 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,26 +1,13 @@ -[target.'cfg(debug_assertions)'] -runner = 'sudo -E' -rustflags = [ - "-C", "linker=clang", - "-C", "link-arg=-fuse-ld=lld", - "-C", "link-arg=--ld-path=/home/dnoland/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/gcc-ld/ld.lld", - "-C", "opt-level=0", - "-C", "lto=false", -] +[env] +DEV_ENV = { value = "compile-env", relative = true, force = false } +SYSROOT = { value = "compile-env/sysroot", relative = true, force = false } + +PATH = { value = "compile-env/bin", relative = true, force = true } +LD_LIBRARY_PATH = { value = "compile-env/lib", relative = true, force = true } +LIBCLANG_PATH = { value = "compile-env/lib", relative = true, force = true } -[target.'cfg(not(debug_assertions))'] -rustflags = [ - "-C", "linker=clang", - "-C", "link-arg=-fuse-ld=lld", - "-C", "link-arg=--ld-path=/home/dnoland/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/gcc-ld/ld.lld", - "-C", "opt-level=3", - "-C", "codegen-units=1", - "-C", "linker-plugin-lto", - "-C", "lto=thin", - "-C", "embed-bitcode=yes", - # Full RELRO as a basic security measure - # - "-C", "relro-level=full", - # "-Z", "sanitizer=cfi", - # "-Z", "sanitizer=safestack", -] \ No newline at end of file +[build] +target = [ + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl", +] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4bbda26f..9664fab2 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { - image: "dpdk-sysroot", - "name": "dpdk-dev-container", + image: "ghcr.io/githedgehog/dataplane/development-environment:debug", + "name": "datataplane-development-environment", "mounts": [ "source=/mnt/huge/2M,target=/mnt/huge/2M,type=bind", "source=/mnt/huge/1G,target=/mnt/huge/1G,type=bind" diff --git a/.github/workflows/build-project.yml b/.github/workflows/build-project.yml new file mode 100644 index 00000000..2610184c --- /dev/null +++ b/.github/workflows/build-project.yml @@ -0,0 +1,27 @@ +name: Build project +on: [ push, pull_request ] + +permissions: + contents: write + packages: read + id-token: write +jobs: + build: + name: build project + runs-on: + - lab + timeout-minutes: 180 + container: + image: ghcr.io/githedgehog/dpdk-sys/dev-env:main-rust-pinned + credentials: + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: compile-env is self + run: just _ci-compile-env-hack + - run: just cargo build + - run: just cargo build --release + - run: just cargo test + - run: just cargo test --release diff --git a/.github/workflows/check-developer-experience.yml b/.github/workflows/check-developer-experience.yml new file mode 100644 index 00000000..3b7b214c --- /dev/null +++ b/.github/workflows/check-developer-experience.yml @@ -0,0 +1,46 @@ +on: [ push, pull_request ] + +permissions: + contents: write + packages: read + id-token: write +jobs: + build: + strategy: + fail-fast: false + matrix: + profile: [ "debug", "release" ] + just_version: [ "1.36.0" ] + rust_toolchain: [ "stable", "1.82.0", "nightly-2024-10-22" ] + runs-on: + - lab + timeout-minutes: 180 + steps: + - name: login to ghcr.io + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: install just + uses: extractions/setup-just@v2 + with: + just-version: ${{matrix.just_version}} + - name: install rustup + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{matrix.rust_toolchain}} + targets: "x86_64-unknown-linux-gnu,x86_64-unknown-linux-musl" + - name: Checkout + uses: actions/checkout@v4 + - name: refresh-compile-env + run: just --yes refresh-compile-env + - run: just --yes fake-nix + - name: just build (glibc) + run: just cargo +${{matrix.rust_toolchain}} build --profile=${{matrix.profile}} --target=x86_64-unknown-linux-gnu + - name: just test (glibc) + run: just cargo +${{matrix.rust_toolchain}} test --profile=${{matrix.profile}} --target=x86_64-unknown-linux-gnu + - name: just build + run: just cargo +${{matrix.rust_toolchain}} build --profile=${{matrix.profile}} --target=x86_64-unknown-linux-musl + - name: just test + run: just cargo +${{matrix.rust_toolchain}} test --profile=${{matrix.profile}} --target=x86_64-unknown-linux-musl diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml deleted file mode 100644 index 1e0b58cb..00000000 --- a/.github/workflows/update-flake.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: update-flake-lock -on: - workflow_dispatch: - schedule: - - cron: "0 0 * * 0" - -jobs: - lockfile: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - issues: write - repository-projects: write - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install Nix - uses: DeterminateSystems/nix-installer-action@main - - name: Enable magic Nix cache - uses: DeterminateSystems/magic-nix-cache-action@main - - name: Check flake - uses: DeterminateSystems/flake-checker-action@main - - name: Update flake.lock - uses: DeterminateSystems/update-flake-lock@main - with: - pr-title: "Update flake.lock" # Title of PR to be created - pr-labels: | # Labels to be set on the PR - dependencies - automated diff --git a/.gitignore b/.gitignore index d41e3a74..dd3c1cb9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,10 @@ /result* /target/** /design-docs/src/mdbook/book/** -/dpdk-sys/sysroot/** +/sysroot/** +/nix/result* +/sysroot +/dev-env +/compile-env/ +/dev-env-template/etc +/sterile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..0bef74c5 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +export RUSTFLAGS?=-C linker=${HOME}/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/gcc-ld/ld.lld + +install-nix: + sh <(curl -L https://nixos.org/nix/install) --no-daemon + +sysroot: + echo "Building sysroot..." + rm sysroot || true + nix build -f default.nix 'env' --out-link sysroot + echo "Built sysroot." + +update-channel: + nix-channel --update + +update-flake: update-channel + nix flake update + +build: sysroot + cargo build --target=x86_64-unknown-linux-musl + +test: build + cargo test --target=x86_64-unknown-linux-musl diff --git a/README.md b/README.md new file mode 100644 index 00000000..c096dadf --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +# Hedgehog Dataplane + +## Build instructions + +### Prerequisites + +- Recent linux machine of some kind required for development + +> [!NOTE] +> I might be able to make this work on Mac if folks are interested and can help test. + +- Bash (you very likely have this) +- [Docker](https://www.docker.com/) (install through your package manager +- Cargo / Rust (install via [`rustup`](https://rustup.rs/)) +- [just](https://github.com/casey/just) (install through your package manager or cargo) + +> [!WARNING] +> System privileges required for testing! +> This project requires root privileges to run the tests. +> This is because the tests require access to raw network interfaces. +> You can either run in docker or with `sudo`. +> `sudo` happens by default when you run `cargo test`. + +## Step 0. Clone the repository + +```bash +git clone git@github.com:githedgehog/dataplane.git +pushd dataplane +``` + +## Step 1. Get the sysroot + +In the source directory, run + +```bash +just refresh-compile-env +``` + +You should now have a directory called `compile-env` which contains the tools needed to build `dpdk-sys` such as `clang` and `lld`. +You should also have `./compile-env/sysroot` which contains the libraries that `dpdk-sys` needs to link against. +Both `x86_64-unknown-linux-gnu` and `x86_64-unknown-linux-musl` targets are currently supported. + +## Step 3. Fake nix + +The sysroot is currently built using nix, but you don't need nix to build the project. +The idea is to symlink `/nix` to `./compile-env/nix` so that the build scripts can find the libraries they need. +This is a compromise between requiring the developer to understand nix (which can be non-trivial) and requiring the developer to have a bunch of libraries installed on their system. + +> [!WARNING] +> This is a hack! +> It works fine but the plan won't work if you already have /nix. +> If you already have /nix talk to me, and we will make it work. +> It should be pretty easy. + +```bash +just fake-nix +``` + +> [!NOTE] +> If you move your project directory, you will need to run `just fake-nix refake` to update the symlinks. + +## Step 3. Build the project + +At this point you should be able to run + +```bash +cargo build +``` + +You should now have statically linked ELF executables in `target/x86_64-unknown-linux-gnu/debug/scratch` and `target/x86_64-unknown-linux-musl/debug/scratch`. + +Additionally, you can run + +```bash +just build +``` + +## Step 4. Run the tests + +To run the test suite under glibc + +```bash +cargo test --target x86_64-unknown-linux-gnu +``` + +To run the test suite under musl + +```bash +cargo test --target x86_64-unknown-linux-musl +``` diff --git a/deny.toml b/deny.toml new file mode 100644 index 00000000..87fc3b4f --- /dev/null +++ b/deny.toml @@ -0,0 +1,232 @@ +[graph] +targets = [] +#exclude = [] +all-features = false +no-default-features = false +#features = [] + +# The output table provides options for how/if diagnostics are outputted +[output] +feature-depth = 1 + +[advisories] +ignore = [] +[licenses] +unused-allowed-license = "allow" +allow = [ + "AFL-1.1", + "AFL-1.2", + "AFL-2.0", + "AFL-2.1", + "AFL-3.0", + # "AGPL-3.0", # I don't have any problem with AGPL, but the Google _hates_ it + "Apache-1.1", + "Apache-2.0", + "APSL-2.0", + "Artistic-2.0", + "BSD-2-Clause", + "BSD-3-Clause", + "BSL-1.0", + "CDDL-1.0", + "CPAL-1.0", + "CPL-1.0", + "ECL-2.0", + "EFL-2.0", + "EPL-1.0", + "EPL-2.0", + "EUDatagrid", + "EUPL-1.1", + "EUPL-1.2", + "GPL-2.0", + "GPL-3.0", + "HPND", + "Intel", + "IPA", + "IPL-1.0", + "ISC", + "LGPL-2.1", + "LGPL-3.0", + "LPL-1.02", + "MIT", + "MPL-1.1", + "MPL-2.0", + "MS-PL", + "MS-RL", + "NCSA", + "Nokia", + "OFL-1.1", + "OSL-1.0", + "OSL-2.0", + "OSL-2.1", + "OSL-3.0", + "PHP-3.01", + "Python-2.0", + "QPL-1.0", + "RPSL-1.0", + "SISSL", + "Sleepycat", + "SPL-1.0", + "Unlicense", + "UPL-1.0", + "W3C", + "Zlib", + "ZPL-2.0", + "ZPL-2.1", +] +# The confidence threshold for detecting a license from license text. +# The higher the value, the more closely the license text must be to the +# canonical license text of a valid SPDX license file. +# [possible values: any between 0.0 and 1.0]. +confidence-threshold = 1.0 +# Allow 1 or more licenses on a per-crate basis, so that particular licenses +# aren't accepted for every possible crate as with the normal allow list +exceptions = [ + # Each entry is the crate and version constraint, and its specific allow + # list + #{ allow = ["Zlib"], crate = "adler32" }, + # mostly harmless + { allow = ["Unicode-DFS-2016"], crate = "unicode-ident" }, +] + +# Some crates don't have (easily) machine readable licensing information, +# adding a clarification entry for it allows you to manually specify the +# licensing information +#[[licenses.clarify]] +# The package spec the clarification applies to +#crate = "ring" +# The SPDX expression for the license requirements of the crate +#expression = "MIT AND ISC AND OpenSSL" +# One or more files in the crate's source used as the "source of truth" for +# the license expression. If the contents match, the clarification will be used +# when running the license check, otherwise the clarification will be ignored +# and the crate will be checked normally, which may produce warnings or errors +# depending on the rest of your configuration +#license-files = [ +# Each entry is a crate relative path, and the (opaque) hash of its contents +#{ path = "LICENSE", hash = 0xbd0eed23 } +#] + +[licenses.private] +# If true, ignores workspace crates that aren't published, or are only +# published to private registries. +# To see how to mark a crate as unpublished (to the official registry), +# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. +ignore = true +# One or more private registries that you might publish crates to, if a crate +# is only published to private registries, and ignore is true, the crate will +# not have its license(s) checked +registries = [ + #"https://sekretz.com/registry +] + +# This section is considered when running `cargo deny check bans`. +# More documentation about the 'bans' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html +[bans] +# Lint level for when multiple versions of the same crate are detected +multiple-versions = "deny" +# Lint level for when a crate version requirement is `*` +wildcards = "deny" +# The graph highlighting used when creating dotgraphs for crates +# with multiple versions +# * lowest-version - The path to the lowest versioned duplicate is highlighted +# * simplest-path - The path to the version with the fewest edges is highlighted +# * all - Both lowest-version and simplest-path are used +highlight = "all" +# The default lint level for `default` features for crates that are members of +# the workspace that is being checked. This can be overridden by allowing/denying +# `default` on a crate-by-crate basis if desired. +workspace-default-features = "allow" +# The default lint level for `default` features for external crates that are not +# members of the workspace. This can be overridden by allowing/denying `default` +# on a crate-by-crate basis if desired. +external-default-features = "allow" +# List of crates that are allowed. Use with care! +allow = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" }, +] +# List of crates to deny +deny = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" }, + # Wrapper crates can optionally be specified to allow the crate when it + # is a direct dependency of the otherwise banned crate + #{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] }, +] + +# List of features to allow/deny +# Each entry the name of a crate and a version range. If version is +# not specified, all versions will be matched. +#[[bans.features]] +#crate = "reqwest" +# Features to not allow +#deny = ["json"] +# Features to allow +#allow = [ +# "rustls", +# "__rustls", +# "__tls", +# "hyper-rustls", +# "rustls", +# "rustls-pemfile", +# "rustls-tls-webpki-roots", +# "tokio-rustls", +# "webpki-roots", +#] +# If true, the allowed features must exactly match the enabled feature set. If +# this is set there is no point setting `deny` +#exact = true + +# Similarly to `skip` allows you to skip certain crates during duplicate +# detection. Unlike skip, it also includes the entire tree of transitive +# dependencies starting at the specified crate, up to a certain depth, which is +# by default infinite. +skip-tree = [ + #"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies + #{ crate = "ansi_term@0.11.0", depth = 20 }, +] + +[[bans.skip]] +name = "dpdk-sys" +reason = "workspace internal" + +[[bans.skip]] +name = "scratch" +reason = "workspace internal" + +[[bans.skip]] +name = "dpdk" +reason = "workspace internal" + +[[bans.skip]] +name = "net" +reason = "workspace internal" + +[[bans.skip]] +name = "syn" +reason = "syn is basically always a build time dependency so we aren't shipping multiple versions" + +# This section is considered when running `cargo deny check sources`. +# More documentation about the 'sources' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html +[sources] +# Lint level for what to happen when a crate from a crate registry that is not +# in the allow list is encountered +unknown-registry = "deny" +# Lint level for what to happen when a crate from a git repository that is not +# in the allow list is encountered +unknown-git = "deny" +# List of URLs for allowed crate registries. Defaults to the crates.io index +# if not specified. If it is specified but empty, no registries are allowed. +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +# List of URLs for allowed Git repositories +allow-git = [] + +[sources.allow-org] +# github.com organizations to allow git sources for +github = [] +# gitlab.com organizations to allow git sources for +gitlab = [] +# bitbucket.org organizations to allow git sources for +bitbucket = [] diff --git a/design-docs/README.md b/design-docs/README.md deleted file mode 100644 index 3056823b..00000000 --- a/design-docs/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Modified mdbook - -I made some modifications to the base mdbook setup to make it more suitable for scientific writing. -The main changes are: - -1. Bibliography support using pandoc / citeproc. -2. Equation / figure numbering and references. -3. Greatly improved support for footnotes, end-notes, asides, and qualifications. -4. Support for glossaries. -5. Support for embedded YouTube videos. -6. Improved support for plantuml (linked diagrams are supported). -7. Revised page layout (I removed the left/right arrow bar and widened the page to make mobile reading easier). - -## Building the book - -It is possible to manually install all the needed dependencies and build the book, but it is much easier to use the provided [nix](https://nixos.org/) shell. - -Once you have installed `nix`, you can build the book by running: - -```bash -nix-build --attr book -``` - -or, if you are using nix flakes: - -```bash -nix build -``` - -## Developing the book - -I provided a nix shell that contains all the needed dependencies for developing the book. You can enter the shell by running: - -```bash -nix-shell -``` - -or, if you are using nix flakes: - -```bash -nix develop -``` - -Once you are in the shell, you can build the book by running: - -```bash -cd src/mdbook -mdbook build && mdbook serve -``` - -Then open a web browser and navigate to `http://localhost:3000` to see the book. -The page should live update as you edit the markdown files. diff --git a/design-docs/src/mdbook/sources/sources.bib b/design-docs/src/mdbook/sources/sources.bib index db1e1d9c..e69de29b 100644 --- a/design-docs/src/mdbook/sources/sources.bib +++ b/design-docs/src/mdbook/sources/sources.bib @@ -1,140 +0,0 @@ -@online{chromium/issue/add-quic, - title = {Issue 11125002: {{Add QuicFramer}} and Friends. - {{Code Review}}}, - author = {Hamilton, Ryan}, - url = {https://chromiumcodereview.appspot.com/11125002}, - urldate = {2024-02-21}, - file = {/home/dnoland/Zotero/storage/TGHUZ6MH/11125002.html} -} - -@online{chromium/patch/add-quic, - type = {chromium code reviews}, - title = {Add {{QuicFramer}} and Friends}, - author = {Hamilton, Ryan}, - date = {2012-10-16}, - url = {https://src.chromium.org/viewvc/chrome?revision=162259&view=revision}, - urldate = {2024-02-21}, - langid = {english}, - file = {/home/dnoland/Zotero/storage/HD5GZWSY/chrome.html} -} - -@online{chromium/quic/history, - title = {{{QUIC}}, a Multiplexed Transport over {{UDP}}}, - author = {The Chromium Projects}, - url = {https://www.chromium.org/quic/}, - urldate = {2024-02-26}, - abstract = {QUIC is a new multiplexed transport built on top of UDP. HTTP/3 is designed to take advantage of QUIC's features, including lack of Head-Of-Line blocking between streams.}, - organization = {{The Chromium Projects}}, - file = {/home/dnoland/Zotero/storage/K42HT8AA/quic.html} -} - -@online{google-doc/quic-design, - title = {{{QUIC}}: {{Design Document}} and {{Specification Rationale}}}, - shorttitle = {{{QUIC}}}, - author = {Roskind, Jim}, - url = {https://docs.google.com/document/d/1RNHkx_VvKWyWg6Lr8SZ-saqsQx7rFV-ev2jRFUoVD34/edit?usp=embed_facebook}, - urldate = {2024-02-21}, - langid = {english}, - organization = {{Google Docs}}, - file = {/home/dnoland/Zotero/storage/K43PQDLY/edit.html} -} - -@unpublished{ietf/88/tsv-area-presentation, - title = {Quick {{UDP Internet Connection}}}, - author = {Roskind, Jim}, - date = {2013-11-07}, - url = {https://www.ietf.org/proceedings/88/slides/slides-88-tsvarea-10.pdf}, - urldate = {2024-02-26}, - eventtitle = {The 88th {{Proceedings}} of {{IETF}}}, - venue = {{Vancouver, BC, Canada}}, - annotation = {archiveurl: https://web.archive.org/web/20240118041920/https://www.ietf.org/proceedings/88/slides/slides-88-tsvarea-10.pdf} -} - -@online{ietf/media/whats-happening-with-quic, - title = {What's {{Happening}} with {{QUIC}}}, - author = {Nottingham, Mark}, - date = {2018-10-29}, - url = {https://www.ietf.org/blog/whats-happening-quic/}, - urldate = {2024-02-21}, - abstract = {QUIC is no less than a new alternative to TCP, the Internet's venerable transport protocol. It provides a foundation for new applications, and existing ones–like HTTP–can be adapted to use it too.}, - langid = {english}, - organization = {{IETF}}, - file = {/home/dnoland/Zotero/storage/I3QSWHMT/whats-happening-quic.html} -} - -@report{ietf/quic/draft, - type = {Request for Comments}, - title = {{{QUIC}}: {{A UDP-Based Multiplexed}} and {{Secure Transport}}}, - shorttitle = {{{QUIC}}}, - author = {Iyengar, Jana and Thomson, Martin}, - date = {2021-05}, - number = {RFC 9000}, - institution = {{Internet Engineering Task Force}}, - doi = {10.17487/RFC9000}, - url = {https://datatracker.ietf.org/doc/draft-ietf-quic-transport/00}, - urldate = {2024-02-22}, - abstract = {This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.}, - pagetotal = {151}, - file = {/home/dnoland/Zotero/storage/2MU8SZLX/Iyengar and Thomson - 2021 - QUIC A UDP-Based Multiplexed and Secure Transport.pdf} -} - -@report{ietf/quic/rfc9000, - type = {Request for Comments}, - title = {{{QUIC}}: {{A UDP-Based Multiplexed}} and {{Secure Transport}}}, - shorttitle = {{{QUIC}}}, - author = {Iyengar, Jana and Thomson, Martin}, - date = {2021-05}, - number = {RFC 9000}, - institution = {{Internet Engineering Task Force}}, - doi = {10.17487/RFC9000}, - url = {https://www.rfc-editor.org/rfc/rfc9000.html}, - urldate = {2024-02-20}, - abstract = {This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.}, - pagetotal = {151}, - file = {/home/dnoland/Zotero/storage/Z7L6ZCJJ/Iyengar and Thomson - 2021 - QUIC A UDP-Based Multiplexed and Secure Transport.pdf} -} - -@report{ietf/quic/rfc9001, - type = {Request for Comments}, - title = {Using {{TLS}} to {{Secure QUIC}}}, - author = {Thomson, Martin and Turner, Sean}, - date = {2021-05}, - number = {RFC 9001}, - institution = {{Internet Engineering Task Force}}, - doi = {10.17487/RFC9001}, - url = {https://datatracker.ietf.org/doc/rfc9001}, - urldate = {2024-02-21}, - abstract = {This document describes how Transport Layer Security (TLS) is used to secure QUIC.}, - pagetotal = {52}, - file = {/home/dnoland/Zotero/storage/FPEHAYV5/Thomson and Turner - 2021 - Using TLS to Secure QUIC.pdf} -} - -@report{ietf/udp/rfc768, - type = {Request for Comments}, - title = {User {{Datagram Protocol}}}, - shorttitle = {{{UDP}}}, - author = {Postel, Jon}, - date = {1980-08-28}, - number = {RFC 768}, - pages = {3}, - institution = {{Internet Engineering Task Force}}, - doi = {10.17487/RFC0768}, - url = {https://datatracker.ietf.org/doc/rfc768}, - urldate = {2024-02-21}, - abstract = {This User Datagram Protocol (UDP) is defined to make available a datagram mode of packet-switched computer communication in the environment of an interconnected set of computer networks.}, - langid = {english}, - pagetotal = {3}, - keywords = {formal}, - file = {/home/dnoland/Zotero/storage/JQTKNEPQ/1980 - User Datagram Protocol.pdf} -} - -@inreference{wikipedia/quic/2024, - title = {{{QUIC}}}, - booktitle = {Wikipedia}, - date = {2024-01-20T23:00:10Z}, - url = {https://en.wikipedia.org/w/index.php?title=QUIC&oldid=1197534682}, - urldate = {2024-02-20}, - abstract = {QUIC () is a general-purpose transport layer network protocol initially designed by Jim Roskind at Google, implemented, and deployed in 2012, announced publicly in 2013 as experimentation broadened, and described at an IETF meeting. QUIC is used by more than half of all connections from the Chrome web browser to Google's servers. Microsoft Edge (which, after version series 1.x, is a derivative of the open-source Chromium browser), Firefox and Safari support it.Although its name was initially proposed as the acronym for "Quick UDP Internet Connections", IETF's use of the word QUIC is not an acronym; it is simply the name of the protocol. QUIC improves performance of connection-oriented web applications that are currently using TCP. It does this by establishing a number of multiplexed connections between two endpoints using User Datagram Protocol (UDP), and is designed to obsolete TCP at the transport layer for many applications, thus earning the protocol the occasional nickname "TCP/2".QUIC works hand-in-hand with HTTP/2's multiplexed connections, allowing multiple streams of data to reach all the endpoints independently, and hence independent of packet losses involving other streams. In contrast, HTTP/2 hosted on Transmission Control Protocol (TCP) can suffer head-of-line-blocking delays of all multiplexed streams if any of the TCP packets is delayed or lost. QUIC's secondary goals include reduced connection and transport latency, and bandwidth estimation in each direction to avoid congestion. It also moves congestion control algorithms into the user space at both endpoints, rather than the kernel space, which it is claimed will allow these algorithms to improve more rapidly. Additionally, the protocol can be extended with forward error correction (FEC) to further improve performance when errors are expected, and this is seen as the next step in the protocol's evolution. It has been designed to avoid protocol ossification so that it remains evolvable, unlike TCP, which has suffered significant ossification. In June 2015, an Internet Draft of a specification for QUIC was submitted to the IETF for standardization. A QUIC working group was established in 2016. In October 2018, the IETF's HTTP and QUIC Working Groups jointly decided to call the HTTP mapping over QUIC "HTTP/3" in advance of making it a worldwide standard. In May 2021, the IETF standardized QUIC in RFC 9000, supported by RFC 8999, RFC 9001 and RFC 9002. DNS-over-QUIC is another application.}, - langid = {english}, - annotation = {Page Version ID: 1197534682}, - file = {/home/dnoland/Zotero/storage/JHNK9ZBV/QUIC.html} -} diff --git a/design-docs/src/mdbook/theme/external/highlight/es/core.js b/design-docs/src/mdbook/theme/external/highlight/es/core.js index 7294b81d..a7f22d74 100644 --- a/design-docs/src/mdbook/theme/external/highlight/es/core.js +++ b/design-docs/src/mdbook/theme/external/highlight/es/core.js @@ -1,6 +1,6 @@ /*! Highlight.js v11.9.0 (git: b7ec4bfafc) - (c) 2006-2023 undefined and other contributors + (src) 2006-2023 undefined and other contributors License: BSD-3-Clause */ /* eslint-disable no-multi-assign */ @@ -1019,11 +1019,11 @@ const MultiClassError = new Error(); * * So what we need is a clean match like this: * - * (a)(b)(c) => [ "a", "b", "c" ] + * (a)(b)(src) => [ "a", "b", "src" ] * * But this falls apart with inner match groups: * - * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ] + * (a)(((b)))(src) => ["a", "b", "b", "b", "src" ] * * Our scopes are now "out of alignment" and we're repeating `b` 3 times. * What needs to happen is the numbers are remapped: @@ -1170,7 +1170,7 @@ function compileLanguage(language) { /** Stores multiple regular expressions and allows you to quickly search for them all in a string simultaneously - returning the first match. It does - this by creating a huge (a|b|c) regex - each individual item wrapped with () + this by creating a huge (a|b|src) regex - each individual item wrapped with () and joined by `|` - using match groups to track position. When a match is found checking which position in the array has content allows us to figure out which of the original regexes / match groups triggered the match. diff --git a/design-docs/src/mdbook/theme/external/highlight/es/highlight.js b/design-docs/src/mdbook/theme/external/highlight/es/highlight.js index 7294b81d..a7f22d74 100644 --- a/design-docs/src/mdbook/theme/external/highlight/es/highlight.js +++ b/design-docs/src/mdbook/theme/external/highlight/es/highlight.js @@ -1,6 +1,6 @@ /*! Highlight.js v11.9.0 (git: b7ec4bfafc) - (c) 2006-2023 undefined and other contributors + (src) 2006-2023 undefined and other contributors License: BSD-3-Clause */ /* eslint-disable no-multi-assign */ @@ -1019,11 +1019,11 @@ const MultiClassError = new Error(); * * So what we need is a clean match like this: * - * (a)(b)(c) => [ "a", "b", "c" ] + * (a)(b)(src) => [ "a", "b", "src" ] * * But this falls apart with inner match groups: * - * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ] + * (a)(((b)))(src) => ["a", "b", "b", "b", "src" ] * * Our scopes are now "out of alignment" and we're repeating `b` 3 times. * What needs to happen is the numbers are remapped: @@ -1170,7 +1170,7 @@ function compileLanguage(language) { /** Stores multiple regular expressions and allows you to quickly search for them all in a string simultaneously - returning the first match. It does - this by creating a huge (a|b|c) regex - each individual item wrapped with () + this by creating a huge (a|b|src) regex - each individual item wrapped with () and joined by `|` - using match groups to track position. When a match is found checking which position in the array has content allows us to figure out which of the original regexes / match groups triggered the match. diff --git a/design-docs/src/mdbook/theme/external/highlight/es/languages/c.js b/design-docs/src/mdbook/theme/external/highlight/es/languages/c.js index 403b489a..39263e65 100644 --- a/design-docs/src/mdbook/theme/external/highlight/es/languages/c.js +++ b/design-docs/src/mdbook/theme/external/highlight/es/languages/c.js @@ -1,4 +1,4 @@ -/*! `c` grammar compiled for Highlight.js 11.9.0 */ +/*! `src` grammar compiled for Highlight.js 11.9.0 */ var hljsGrammar = (function () { 'use strict'; @@ -287,7 +287,7 @@ var hljsGrammar = (function () { name: "C", aliases: [ 'h' ], keywords: KEYWORDS, - // Until differentiations are added between `c` and `cpp`, `c` will + // Until differentiations are added between `src` and `cpp`, `src` will // not be auto-detected to avoid auto-detect conflicts between C and C++ disableAutodetect: true, illegal: ' !! # @ @@ - 'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope ' + 'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw src|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope ' + 'cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ' + 'ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 ' + 'profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor ' @@ -134,4 +134,4 @@ var hljsGrammar = (function () { })(); ; -export default hljsGrammar; \ No newline at end of file +export default hljsGrammar; diff --git a/design-docs/src/mdbook/theme/external/highlight/highlight.js b/design-docs/src/mdbook/theme/external/highlight/highlight.js index cb39ee0e..ba988bd7 100644 --- a/design-docs/src/mdbook/theme/external/highlight/highlight.js +++ b/design-docs/src/mdbook/theme/external/highlight/highlight.js @@ -1,6 +1,6 @@ /*! Highlight.js v11.9.0 (git: b7ec4bfafc) - (c) 2006-2023 undefined and other contributors + (src) 2006-2023 undefined and other contributors License: BSD-3-Clause */ var hljs = (function () { @@ -1022,11 +1022,11 @@ var hljs = (function () { * * So what we need is a clean match like this: * - * (a)(b)(c) => [ "a", "b", "c" ] + * (a)(b)(src) => [ "a", "b", "src" ] * * But this falls apart with inner match groups: * - * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ] + * (a)(((b)))(src) => ["a", "b", "b", "b", "src" ] * * Our scopes are now "out of alignment" and we're repeating `b` 3 times. * What needs to happen is the numbers are remapped: @@ -1173,7 +1173,7 @@ var hljs = (function () { /** Stores multiple regular expressions and allows you to quickly search for them all in a string simultaneously - returning the first match. It does - this by creating a huge (a|b|c) regex - each individual item wrapped with () + this by creating a huge (a|b|src) regex - each individual item wrapped with () and joined by `|` - using match groups to track position. When a match is found checking which position in the array has content allows us to figure out which of the original regexes / match groups triggered the match. @@ -3464,7 +3464,7 @@ if (typeof exports === 'object' && typeof module !== 'undefined') { module.expor })(); hljs.registerLanguage('bash', hljsGrammar); - })();/*! `c` grammar compiled for Highlight.js 11.9.0 */ + })();/*! `src` grammar compiled for Highlight.js 11.9.0 */ (function(){ var hljsGrammar = (function () { 'use strict'; @@ -3754,7 +3754,7 @@ if (typeof exports === 'object' && typeof module !== 'undefined') { module.expor name: "C", aliases: [ 'h' ], keywords: KEYWORDS, - // Until differentiations are added between `c` and `cpp`, `c` will + // Until differentiations are added between `src` and `cpp`, `src` will // not be auto-detected to avoid auto-detect conflicts between C and C++ disableAutodetect: true, illegal: ' !! # @ @@ - 'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope ' + 'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw src|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope ' + 'cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ' + 'ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 ' + 'profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor ' @@ -26542,4 +26542,4 @@ if (typeof exports === 'object' && typeof module !== 'undefined') { module.expor })(); hljs.registerLanguage('yaml', hljsGrammar); - })(); \ No newline at end of file + })(); diff --git a/design-docs/src/mdbook/theme/external/highlight/languages/c.js b/design-docs/src/mdbook/theme/external/highlight/languages/c.js index 8d06b210..aa35768d 100644 --- a/design-docs/src/mdbook/theme/external/highlight/languages/c.js +++ b/design-docs/src/mdbook/theme/external/highlight/languages/c.js @@ -1,4 +1,4 @@ -/*! `c` grammar compiled for Highlight.js 11.9.0 */ +/*! `src` grammar compiled for Highlight.js 11.9.0 */ (function(){ var hljsGrammar = (function () { 'use strict'; @@ -288,7 +288,7 @@ name: "C", aliases: [ 'h' ], keywords: KEYWORDS, - // Until differentiations are added between `c` and `cpp`, `c` will + // Until differentiations are added between `src` and `cpp`, `src` will // not be auto-detected to avoid auto-detect conflicts between C and C++ disableAutodetect: true, illegal: ' !! # @ @@ - 'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope ' + 'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw src|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope ' + 'cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ' + 'ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 ' + 'profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor ' @@ -136,4 +136,4 @@ })(); hljs.registerLanguage('vim', hljsGrammar); - })(); \ No newline at end of file + })(); diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/agate.css b/design-docs/src/mdbook/theme/external/highlight/styles/agate.css index 8da57406..113c034f 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/agate.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/agate.css @@ -8,7 +8,7 @@ code.hljs { } /*! Theme: Agate - Author: (c) Taufik Nurrohman + Author: (src) Taufik Nurrohman Maintainer: @taufik-nurrohman Updated: 2021-04-24 @@ -124,4 +124,4 @@ code.hljs { .hljs mark { background: #555; color: inherit -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/agate.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/agate.min.css index bdbeed4e..e44eac1b 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/agate.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/agate.min.css @@ -1,6 +1,6 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! Theme: Agate - Author: (c) Taufik Nurrohman + Author: (src) Taufik Nurrohman Maintainer: @taufik-nurrohman Updated: 2021-04-24 @@ -17,4 +17,4 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5p #fcc28c #ffa #fff -*/.hljs{background:#333;color:#fff}.hljs-doctag,.hljs-meta-keyword,.hljs-name,.hljs-strong{font-weight:700}.hljs-code,.hljs-emphasis{font-style:italic}.hljs-section,.hljs-tag{color:#62c8f3}.hljs-selector-class,.hljs-selector-id,.hljs-template-variable,.hljs-variable{color:#ade5fc}.hljs-meta-string,.hljs-string{color:#a2fca2}.hljs-attr,.hljs-quote,.hljs-selector-attr{color:#7bd694}.hljs-tag .hljs-attr{color:inherit}.hljs-attribute,.hljs-title,.hljs-type{color:#ffa}.hljs-number,.hljs-symbol{color:#d36363}.hljs-bullet,.hljs-template-tag{color:#b8d8a2}.hljs-built_in,.hljs-keyword,.hljs-literal,.hljs-selector-tag{color:#fcc28c}.hljs-code,.hljs-comment,.hljs-formula{color:#888}.hljs-link,.hljs-regexp,.hljs-selector-pseudo{color:#c6b4f0}.hljs-meta{color:#fc9b9b}.hljs-deletion{background:#fc9b9b;color:#333}.hljs-addition{background:#a2fca2;color:#333}.hljs-subst{color:#fff}.hljs a{color:inherit}.hljs a:focus,.hljs a:hover{color:inherit;text-decoration:underline}.hljs mark{background:#555;color:inherit} \ No newline at end of file +*/.hljs{background:#333;color:#fff}.hljs-doctag,.hljs-meta-keyword,.hljs-name,.hljs-strong{font-weight:700}.hljs-code,.hljs-emphasis{font-style:italic}.hljs-section,.hljs-tag{color:#62c8f3}.hljs-selector-class,.hljs-selector-id,.hljs-template-variable,.hljs-variable{color:#ade5fc}.hljs-meta-string,.hljs-string{color:#a2fca2}.hljs-attr,.hljs-quote,.hljs-selector-attr{color:#7bd694}.hljs-tag .hljs-attr{color:inherit}.hljs-attribute,.hljs-title,.hljs-type{color:#ffa}.hljs-number,.hljs-symbol{color:#d36363}.hljs-bullet,.hljs-template-tag{color:#b8d8a2}.hljs-built_in,.hljs-keyword,.hljs-literal,.hljs-selector-tag{color:#fcc28c}.hljs-code,.hljs-comment,.hljs-formula{color:#888}.hljs-link,.hljs-regexp,.hljs-selector-pseudo{color:#c6b4f0}.hljs-meta{color:#fc9b9b}.hljs-deletion{background:#fc9b9b;color:#333}.hljs-addition{background:#a2fca2;color:#333}.hljs-subst{color:#fff}.hljs a{color:inherit}.hljs a:focus,.hljs a:hover{color:inherit;text-decoration:underline}.hljs mark{background:#555;color:inherit} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.css b/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.css index 6ecfe539..be5d723c 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.css @@ -8,7 +8,7 @@ code.hljs { } /*! Theme: An Old Hope – Star Wars Syntax - Author: (c) Gustavo Costa + Author: (src) Gustavo Costa Maintainer: @gusbemacbe Original theme - Ocean Dark Theme – by https://github.com/gavsiu @@ -72,4 +72,4 @@ code.hljs { } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.min.css index ffc7f8c7..c8d60251 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/an-old-hope.min.css @@ -1,9 +1,9 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! Theme: An Old Hope – Star Wars Syntax - Author: (c) Gustavo Costa + Author: (src) Gustavo Costa Maintainer: @gusbemacbe Original theme - Ocean Dark Theme – by https://github.com/gavsiu Based on Jesse Leite's Atom syntax theme 'An Old Hope' https://github.com/JesseLeite/an-old-hope-syntax-atom -*/.hljs{background:#1c1d21;color:#c0c5ce}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file +*/.hljs{background:#1c1d21;color:#c0c5ce}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/ascetic.css b/design-docs/src/mdbook/theme/external/highlight/styles/ascetic.css index 27a4dbe7..8d5c48c6 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/ascetic.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/ascetic.css @@ -8,7 +8,7 @@ code.hljs { } /* -Original style from softwaremaniacs.org (c) Ivan Sagalaev +Original style from softwaremaniacs.org (src) Ivan Sagalaev */ .hljs { @@ -42,4 +42,4 @@ Original style from softwaremaniacs.org (c) Ivan Sagalaev +Brown Paper style from goldblog.com.ua (src) Zaripov Yura */ .hljs { @@ -60,4 +60,4 @@ Brown Paper style from goldblog.com.ua (c) Zaripov Yura } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/color-brewer.css b/design-docs/src/mdbook/theme/external/highlight/styles/color-brewer.css index c0db73cc..6edf792b 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/color-brewer.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/color-brewer.css @@ -9,7 +9,7 @@ code.hljs { /* Colorbrewer theme -Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock +Original: https://github.com/mbostock/colorbrewer-theme (src) Mike Bostock Ported by Fabrício Tavares de Oliveira */ @@ -63,4 +63,4 @@ Ported by Fabrício Tavares de Oliveira } .hljs-attribute { color: #e6550d -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/dark.css b/design-docs/src/mdbook/theme/external/highlight/styles/dark.css index bdeceb22..e79b7615 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/dark.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/dark.css @@ -8,7 +8,7 @@ code.hljs { } /* -Dark style from softwaremaniacs.org (c) Ivan Sagalaev +Dark style from softwaremaniacs.org (src) Ivan Sagalaev */ .hljs { @@ -59,4 +59,4 @@ Dark style from softwaremaniacs.org (c) Ivan Sagalaev + Author: (src) Ivan Sagalaev Maintainer: @highlightjs/core-team Website: https://highlightjs.org/ License: see project LICENSE @@ -114,4 +114,4 @@ code.hljs { } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/default.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/default.min.css index a75ea911..84afda2c 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/default.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/default.min.css @@ -1,9 +1,9 @@ /*! Theme: Default Description: Original highlight.js style - Author: (c) Ivan Sagalaev + Author: (src) Ivan Sagalaev Maintainer: @highlightjs/core-team Website: https://highlightjs.org/ License: see project LICENSE Touched: 2021 -*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/far.css b/design-docs/src/mdbook/theme/external/highlight/styles/far.css index ecf7cf56..eede61ec 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/far.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/far.css @@ -8,7 +8,7 @@ code.hljs { } /* -FAR Style (c) MajestiC +FAR Style (src) MajestiC */ .hljs { @@ -64,4 +64,4 @@ FAR Style (c) MajestiC } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/felipec.css b/design-docs/src/mdbook/theme/external/highlight/styles/felipec.css index 282dfd6a..928fef75 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/felipec.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/felipec.css @@ -8,7 +8,7 @@ code.hljs { } /*! * Theme: FelipeC - * Author: (c) 2021 Felipe Contreras + * Author: (src) 2021 Felipe Contreras * Website: https://github.com/felipec/vim-felipec * * Autogenerated with vim-felipec's generator. @@ -91,4 +91,4 @@ code.hljs { } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/felipec.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/felipec.min.css index 3a21319a..297a5c87 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/felipec.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/felipec.min.css @@ -1,7 +1,7 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! * Theme: FelipeC - * Author: (c) 2021 Felipe Contreras + * Author: (src) 2021 Felipe Contreras * Website: https://github.com/felipec/vim-felipec * * Autogenerated with vim-felipec's generator. -*/.hljs{color:#dddde1;background:#1e1e22}.hljs ::selection,.hljs::selection{color:#1e1e22;background:#bf8fef}.hljs-code,.hljs-comment,.hljs-quote{color:#888896}.hljs-deletion,.hljs-literal,.hljs-number{color:#ef8f8f}.hljs-doctag,.hljs-meta,.hljs-operator,.hljs-punctuation,.hljs-selector-attr,.hljs-subst,.hljs-template-variable{color:#efbf8f}.hljs-type{color:#efef8f}.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-title{color:#bfef8f}.hljs-addition,.hljs-regexp,.hljs-string{color:#8fef8f}.hljs-class,.hljs-property{color:#8fefbf}.hljs-name,.hljs-selector-tag{color:#8fefef}.hljs-built_in,.hljs-keyword{color:#8fbfef}.hljs-bullet,.hljs-section{color:#8f8fef}.hljs-selector-pseudo{color:#bf8fef}.hljs-attr,.hljs-attribute,.hljs-params,.hljs-variable{color:#ef8fef}.hljs-link,.hljs-symbol{color:#ef8fbf}.hljs-literal,.hljs-strong,.hljs-title{font-weight:700}.hljs-emphasis{font-style:italic} \ No newline at end of file +*/.hljs{color:#dddde1;background:#1e1e22}.hljs ::selection,.hljs::selection{color:#1e1e22;background:#bf8fef}.hljs-code,.hljs-comment,.hljs-quote{color:#888896}.hljs-deletion,.hljs-literal,.hljs-number{color:#ef8f8f}.hljs-doctag,.hljs-meta,.hljs-operator,.hljs-punctuation,.hljs-selector-attr,.hljs-subst,.hljs-template-variable{color:#efbf8f}.hljs-type{color:#efef8f}.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-title{color:#bfef8f}.hljs-addition,.hljs-regexp,.hljs-string{color:#8fef8f}.hljs-class,.hljs-property{color:#8fefbf}.hljs-name,.hljs-selector-tag{color:#8fefef}.hljs-built_in,.hljs-keyword{color:#8fbfef}.hljs-bullet,.hljs-section{color:#8f8fef}.hljs-selector-pseudo{color:#bf8fef}.hljs-attr,.hljs-attribute,.hljs-params,.hljs-variable{color:#ef8fef}.hljs-link,.hljs-symbol{color:#ef8fbf}.hljs-literal,.hljs-strong,.hljs-title{font-weight:700}.hljs-emphasis{font-style:italic} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/googlecode.css b/design-docs/src/mdbook/theme/external/highlight/styles/googlecode.css index 135aaf29..744a8592 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/googlecode.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/googlecode.css @@ -8,7 +8,7 @@ code.hljs { } /* -Google Code style (c) Aahan Krish +Google Code style (src) Aahan Krish */ .hljs { @@ -76,4 +76,4 @@ Google Code style (c) Aahan Krish } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/gradient-dark.css b/design-docs/src/mdbook/theme/external/highlight/styles/gradient-dark.css index d8ed0206..00404bd4 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/gradient-dark.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/gradient-dark.css @@ -8,7 +8,7 @@ code.hljs { } /* -Gradient Dark (c) Samia Ali +Gradient Dark (src) Samia Ali */ .hljs { @@ -87,4 +87,4 @@ Gradient Dark (c) Samia Ali .hljs-section, .hljs-keyword { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/gradient-light.css b/design-docs/src/mdbook/theme/external/highlight/styles/gradient-light.css index f9b5cbf2..4ec9a494 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/gradient-light.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/gradient-light.css @@ -8,7 +8,7 @@ code.hljs { } /* -Gradient Light (c) Samia Ali +Gradient Light (src) Samia Ali */ .hljs { @@ -87,4 +87,4 @@ Gradient Light (c) Samia Ali .hljs-section, .hljs-keyword { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/grayscale.css b/design-docs/src/mdbook/theme/external/highlight/styles/grayscale.css index 9790a866..36dad4af 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/grayscale.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/grayscale.css @@ -8,7 +8,7 @@ code.hljs { } /* -grayscale style (c) MY Sun +grayscale style (src) MY Sun */ .hljs { @@ -86,4 +86,4 @@ grayscale style (c) MY Sun } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/idea.css b/design-docs/src/mdbook/theme/external/highlight/styles/idea.css index 03307df4..2384f7b3 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/idea.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/idea.css @@ -8,7 +8,7 @@ code.hljs { } /* -Intellij Idea-like styling (c) Vasily Polovnyov +Intellij Idea-like styling (src) Vasily Polovnyov */ .hljs { @@ -83,4 +83,4 @@ Intellij Idea-like styling (c) Vasily Polovnyov } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/intellij-light.css b/design-docs/src/mdbook/theme/external/highlight/styles/intellij-light.css index 9140f80c..cd2edbe7 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/intellij-light.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/intellij-light.css @@ -8,7 +8,7 @@ code.hljs { } /* -Intellij-light style (c) Pegasis +Intellij-light style (src) Pegasis */ .hljs { @@ -104,4 +104,4 @@ Intellij-light style (c) Pegasis .hljs-tag { /* purposely ignored */ -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/ir-black.css b/design-docs/src/mdbook/theme/external/highlight/styles/ir-black.css index 3557853b..c7ce90f3 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/ir-black.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/ir-black.css @@ -7,7 +7,7 @@ code.hljs { padding: 3px 5px } /* - IR_Black style (c) Vasily Mikhailitchenko + IR_Black style (src) Vasily Mikhailitchenko */ .hljs { background: #000; @@ -63,4 +63,4 @@ code.hljs { } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-dark.css b/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-dark.css index 4787d080..4157e4b6 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-dark.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-dark.css @@ -8,7 +8,7 @@ code.hljs { } /* -ISBL Editor style dark color scheme (c) Dmitriy Tarasov +ISBL Editor style dark color scheme (src) Dmitriy Tarasov */ .hljs { @@ -91,4 +91,4 @@ ISBL Editor style dark color scheme (c) Dmitriy Tarasov } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-light.css b/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-light.css index cdbabbeb..4c9e5f25 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-light.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/isbl-editor-light.css @@ -8,7 +8,7 @@ code.hljs { } /* -ISBL Editor style light color schemec (c) Dmitriy Tarasov +ISBL Editor style light color schemec (src) Dmitriy Tarasov */ .hljs { @@ -90,4 +90,4 @@ ISBL Editor style light color schemec (c) Dmitriy Tarasov } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/lightfair.css b/design-docs/src/mdbook/theme/external/highlight/styles/lightfair.css index 5142dff0..09656178 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/lightfair.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/lightfair.css @@ -8,7 +8,7 @@ code.hljs { } /* -Lightfair style (c) Tristian Kelly +Lightfair style (src) Tristian Kelly */ .hljs { @@ -78,4 +78,4 @@ Lightfair style (c) Tristian Kelly } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/night-owl.css b/design-docs/src/mdbook/theme/external/highlight/styles/night-owl.css index 3cad0ebf..7aef9315 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/night-owl.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/night-owl.css @@ -8,12 +8,12 @@ code.hljs { } /* -Night Owl for highlight.js (c) Carl Baxter +Night Owl for highlight.js (src) Carl Baxter An adaptation of Sarah Drasner's Night Owl VS Code Theme https://github.com/sdras/night-owl-vscode-theme -Copyright (c) 2018 Sarah Drasner +Copyright (src) 2018 Sarah Drasner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -171,4 +171,4 @@ SOFTWARE. .hljs-deletion { color: #EF535090; font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.css b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.css index cbacc288..40852169 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.css @@ -9,7 +9,7 @@ code.hljs { /*! Theme: nnfx dark Description: a theme inspired by Netscape Navigator/Firefox - Author: (c) 2020-2021 Jim Mason + Author: (src) 2020-2021 Jim Mason Maintainer: @RocketMan License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0 Updated: 2021-05-17 @@ -101,4 +101,4 @@ code.hljs { } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.min.css index 4e6403d6..baaf0a3d 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-dark.min.css @@ -1,10 +1,10 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! Theme: nnfx dark Description: a theme inspired by Netscape Navigator/Firefox - Author: (c) 2020-2021 Jim Mason + Author: (src) 2020-2021 Jim Mason Maintainer: @RocketMan License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0 Updated: 2021-05-17 @version 1.1.0 -*/.hljs{background:#333;color:#fff}.language-xml .hljs-meta,.language-xml .hljs-meta-string{font-weight:700;font-style:italic;color:#69f}.hljs-comment,.hljs-quote{font-style:italic;color:#9c6}.hljs-built_in,.hljs-keyword,.hljs-name{color:#a7a}.hljs-attr,.hljs-name{font-weight:700}.hljs-string{font-weight:400}.hljs-code,.hljs-link,.hljs-meta .hljs-string,.hljs-number,.hljs-regexp,.hljs-string{color:#bce}.hljs-bullet,.hljs-symbol,.hljs-template-variable,.hljs-title,.hljs-variable{color:#d40}.hljs-class .hljs-title,.hljs-title.class_,.hljs-type{font-weight:700;color:#96c}.hljs-attr,.hljs-function .hljs-title,.hljs-subst,.hljs-tag,.hljs-title.function_{color:#fff}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#797}.hljs-deletion{background-color:#c99}.hljs-meta{color:#69f}.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{font-weight:700;color:#69f}.hljs-selector-pseudo{font-style:italic}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic} \ No newline at end of file +*/.hljs{background:#333;color:#fff}.language-xml .hljs-meta,.language-xml .hljs-meta-string{font-weight:700;font-style:italic;color:#69f}.hljs-comment,.hljs-quote{font-style:italic;color:#9c6}.hljs-built_in,.hljs-keyword,.hljs-name{color:#a7a}.hljs-attr,.hljs-name{font-weight:700}.hljs-string{font-weight:400}.hljs-code,.hljs-link,.hljs-meta .hljs-string,.hljs-number,.hljs-regexp,.hljs-string{color:#bce}.hljs-bullet,.hljs-symbol,.hljs-template-variable,.hljs-title,.hljs-variable{color:#d40}.hljs-class .hljs-title,.hljs-title.class_,.hljs-type{font-weight:700;color:#96c}.hljs-attr,.hljs-function .hljs-title,.hljs-subst,.hljs-tag,.hljs-title.function_{color:#fff}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#797}.hljs-deletion{background-color:#c99}.hljs-meta{color:#69f}.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{font-weight:700;color:#69f}.hljs-selector-pseudo{font-style:italic}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.css b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.css index 87a04c69..1b1501e9 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.css @@ -9,7 +9,7 @@ code.hljs { /*! Theme: nnfx light Description: a theme inspired by Netscape Navigator/Firefox - Author: (c) 2020-2021 Jim Mason + Author: (src) 2020-2021 Jim Mason Maintainer: @RocketMan License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0 Updated: 2021-05-17 @@ -101,4 +101,4 @@ code.hljs { } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.min.css index 469223a9..1be72776 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/nnfx-light.min.css @@ -1,10 +1,10 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! Theme: nnfx light Description: a theme inspired by Netscape Navigator/Firefox - Author: (c) 2020-2021 Jim Mason + Author: (src) 2020-2021 Jim Mason Maintainer: @RocketMan License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0 Updated: 2021-05-17 @version 1.1.0 -*/.hljs{background:#fff;color:#000}.language-xml .hljs-meta,.language-xml .hljs-meta-string{font-weight:700;font-style:italic;color:#48b}.hljs-comment,.hljs-quote{font-style:italic;color:#070}.hljs-built_in,.hljs-keyword,.hljs-name{color:#808}.hljs-attr,.hljs-name{font-weight:700}.hljs-string{font-weight:400}.hljs-code,.hljs-link,.hljs-meta .hljs-string,.hljs-number,.hljs-regexp,.hljs-string{color:#00f}.hljs-bullet,.hljs-symbol,.hljs-template-variable,.hljs-title,.hljs-variable{color:#f40}.hljs-class .hljs-title,.hljs-title.class_,.hljs-type{font-weight:700;color:#639}.hljs-attr,.hljs-function .hljs-title,.hljs-subst,.hljs-tag,.hljs-title.function_{color:#000}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#beb}.hljs-deletion{background-color:#fbb}.hljs-meta{color:#269}.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{font-weight:700;color:#48b}.hljs-selector-pseudo{font-style:italic}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic} \ No newline at end of file +*/.hljs{background:#fff;color:#000}.language-xml .hljs-meta,.language-xml .hljs-meta-string{font-weight:700;font-style:italic;color:#48b}.hljs-comment,.hljs-quote{font-style:italic;color:#070}.hljs-built_in,.hljs-keyword,.hljs-name{color:#808}.hljs-attr,.hljs-name{font-weight:700}.hljs-string{font-weight:400}.hljs-code,.hljs-link,.hljs-meta .hljs-string,.hljs-number,.hljs-regexp,.hljs-string{color:#00f}.hljs-bullet,.hljs-symbol,.hljs-template-variable,.hljs-title,.hljs-variable{color:#f40}.hljs-class .hljs-title,.hljs-title.class_,.hljs-type{font-weight:700;color:#639}.hljs-attr,.hljs-function .hljs-title,.hljs-subst,.hljs-tag,.hljs-title.function_{color:#000}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#beb}.hljs-deletion{background-color:#fbb}.hljs-meta{color:#269}.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{font-weight:700;color:#48b}.hljs-selector-pseudo{font-style:italic}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/nord.css b/design-docs/src/mdbook/theme/external/highlight/styles/nord.css index 2e849af9..d6382e9d 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/nord.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/nord.css @@ -7,8 +7,8 @@ code.hljs { padding: 3px 5px } /* - * Copyright (c) 2017-present Arctic Ice Studio - * Copyright (c) 2017-present Sven Greb + * Copyright (src) 2017-present Arctic Ice Studio + * Copyright (src) 2017-present Sven Greb * * Project: Nord highlight.js * Version: 0.1.0 @@ -272,4 +272,4 @@ Aurora } .language-yaml .hljs-meta { color: #D08770 -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/school-book.css b/design-docs/src/mdbook/theme/external/highlight/styles/school-book.css index 8dcb9021..7d559503 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/school-book.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/school-book.css @@ -8,7 +8,7 @@ code.hljs { } /* -School Book style from goldblog.com.ua (c) Zaripov Yura +School Book style from goldblog.com.ua (src) Zaripov Yura */ .hljs { @@ -59,4 +59,4 @@ School Book style from goldblog.com.ua (c) Zaripov Yura } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/shades-of-purple.css b/design-docs/src/mdbook/theme/external/highlight/styles/shades-of-purple.css index 8a510501..219c80ee 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/shades-of-purple.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/shades-of-purple.css @@ -9,7 +9,7 @@ code.hljs { /** * Shades of Purple Theme — for Highlightjs. * - * @author (c) Ahmad Awais + * @author (src) Ahmad Awais * @link GitHub Repo → https://github.com/ahmadawais/Shades-of-Purple-HighlightJS * @version 1.5.0 */ @@ -81,4 +81,4 @@ code.hljs { } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/sunburst.css b/design-docs/src/mdbook/theme/external/highlight/styles/sunburst.css index 5b49f215..2b23a441 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/sunburst.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/sunburst.css @@ -8,7 +8,7 @@ code.hljs { } /* -Sunburst-like style (c) Vasily Polovnyov +Sunburst-like style (src) Vasily Polovnyov */ .hljs { @@ -86,4 +86,4 @@ Sunburst-like style (c) Vasily Polovnyov } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.css b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.css index e746b50c..89776b38 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.css @@ -10,7 +10,7 @@ code.hljs { Theme: Tokyo-night-Dark origin: https://github.com/enkia/tokyo-night-vscode-theme Description: Original highlight.js style - Author: (c) Henri Vandersleyen + Author: (src) Henri Vandersleyen License: see project LICENSE Touched: 2022 */ @@ -111,4 +111,4 @@ code.hljs { } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.min.css index dc63ad9e..3d9f3c0a 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-dark.min.css @@ -2,7 +2,7 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5p Theme: Tokyo-night-Dark origin: https://github.com/enkia/tokyo-night-vscode-theme Description: Original highlight.js style - Author: (c) Henri Vandersleyen + Author: (src) Henri Vandersleyen License: see project LICENSE Touched: 2022 -*/.hljs-comment,.hljs-meta{color:#565f89}.hljs-deletion,.hljs-doctag,.hljs-regexp,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-tag,.hljs-template-tag,.hljs-variable.language_{color:#f7768e}.hljs-link,.hljs-literal,.hljs-number,.hljs-params,.hljs-template-variable,.hljs-type,.hljs-variable{color:#ff9e64}.hljs-attribute,.hljs-built_in{color:#e0af68}.hljs-keyword,.hljs-property,.hljs-subst,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#7dcfff}.hljs-selector-tag{color:#73daca}.hljs-addition,.hljs-bullet,.hljs-quote,.hljs-string,.hljs-symbol{color:#9ece6a}.hljs-code,.hljs-formula,.hljs-section{color:#7aa2f7}.hljs-attr,.hljs-char.escape_,.hljs-keyword,.hljs-name,.hljs-operator{color:#bb9af7}.hljs-punctuation{color:#c0caf5}.hljs{background:#1a1b26;color:#9aa5ce}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file +*/.hljs-comment,.hljs-meta{color:#565f89}.hljs-deletion,.hljs-doctag,.hljs-regexp,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-tag,.hljs-template-tag,.hljs-variable.language_{color:#f7768e}.hljs-link,.hljs-literal,.hljs-number,.hljs-params,.hljs-template-variable,.hljs-type,.hljs-variable{color:#ff9e64}.hljs-attribute,.hljs-built_in{color:#e0af68}.hljs-keyword,.hljs-property,.hljs-subst,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#7dcfff}.hljs-selector-tag{color:#73daca}.hljs-addition,.hljs-bullet,.hljs-quote,.hljs-string,.hljs-symbol{color:#9ece6a}.hljs-code,.hljs-formula,.hljs-section{color:#7aa2f7}.hljs-attr,.hljs-char.escape_,.hljs-keyword,.hljs-name,.hljs-operator{color:#bb9af7}.hljs-punctuation{color:#c0caf5}.hljs{background:#1a1b26;color:#9aa5ce}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.css b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.css index 2c7ca12c..ef416943 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.css @@ -10,7 +10,7 @@ code.hljs { Theme: Tokyo-night-light origin: https://github.com/enkia/tokyo-night-vscode-theme Description: Original highlight.js style - Author: (c) Henri Vandersleyen + Author: (src) Henri Vandersleyen License: see project LICENSE Touched: 2022 */ @@ -111,4 +111,4 @@ code.hljs { } .hljs-strong { font-weight: bold -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.min.css b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.min.css index 0096d4d1..2688373e 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.min.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/tokyo-night-light.min.css @@ -2,7 +2,7 @@ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5p Theme: Tokyo-night-light origin: https://github.com/enkia/tokyo-night-vscode-theme Description: Original highlight.js style - Author: (c) Henri Vandersleyen + Author: (src) Henri Vandersleyen License: see project LICENSE Touched: 2022 -*/.hljs-comment,.hljs-meta{color:#9699a3}.hljs-deletion,.hljs-doctag,.hljs-regexp,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-tag,.hljs-template-tag,.hljs-variable.language_{color:#8c4351}.hljs-link,.hljs-literal,.hljs-number,.hljs-params,.hljs-template-variable,.hljs-type,.hljs-variable{color:#965027}.hljs-attribute,.hljs-built_in{color:#8f5e15}.hljs-keyword,.hljs-property,.hljs-subst,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#0f4b6e}.hljs-selector-tag{color:#33635c}.hljs-addition,.hljs-bullet,.hljs-quote,.hljs-string,.hljs-symbol{color:#485e30}.hljs-code,.hljs-formula,.hljs-section{color:#34548a}.hljs-attr,.hljs-char.escape_,.hljs-keyword,.hljs-name,.hljs-operator{color:#5a4a78}.hljs-punctuation{color:#343b58}.hljs{background:#d5d6db;color:#565a6e}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file +*/.hljs-comment,.hljs-meta{color:#9699a3}.hljs-deletion,.hljs-doctag,.hljs-regexp,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-tag,.hljs-template-tag,.hljs-variable.language_{color:#8c4351}.hljs-link,.hljs-literal,.hljs-number,.hljs-params,.hljs-template-variable,.hljs-type,.hljs-variable{color:#965027}.hljs-attribute,.hljs-built_in{color:#8f5e15}.hljs-keyword,.hljs-property,.hljs-subst,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#0f4b6e}.hljs-selector-tag{color:#33635c}.hljs-addition,.hljs-bullet,.hljs-quote,.hljs-string,.hljs-symbol{color:#485e30}.hljs-code,.hljs-formula,.hljs-section{color:#34548a}.hljs-attr,.hljs-char.escape_,.hljs-keyword,.hljs-name,.hljs-operator{color:#5a4a78}.hljs-punctuation{color:#343b58}.hljs{background:#d5d6db;color:#565a6e}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} diff --git a/design-docs/src/mdbook/theme/external/highlight/styles/xcode.css b/design-docs/src/mdbook/theme/external/highlight/styles/xcode.css index 6ed07fba..c195bd34 100644 --- a/design-docs/src/mdbook/theme/external/highlight/styles/xcode.css +++ b/design-docs/src/mdbook/theme/external/highlight/styles/xcode.css @@ -8,7 +8,7 @@ code.hljs { } /* -XCode style (c) Angel Garcia +XCode style (src) Angel Garcia */ .hljs { @@ -87,4 +87,4 @@ XCode style (c) Angel Garcia } .hljs-emphasis { font-style: italic -} \ No newline at end of file +} diff --git a/design-docs/src/mdbook/theme/highlight.js b/design-docs/src/mdbook/theme/highlight.js index 6068d59a..199fb297 100644 --- a/design-docs/src/mdbook/theme/highlight.js +++ b/design-docs/src/mdbook/theme/highlight.js @@ -1,6 +1,6 @@ /*! Highlight.js v11.8.0 (git: 65687a907b) - (c) 2006-2023 undefined and other contributors + (src) 2006-2023 undefined and other contributors License: BSD-3-Clause */ var hljs=function(){"use strict";function e(t){ @@ -510,7 +510,7 @@ className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0, contains:[r,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:p, relevance:0,contains:["self",r,e.C_BLOCK_COMMENT_MODE,o,l,s]}] },s,r,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", -aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:p,illegal:"",contains:[{beginKeywords:"in out"},a] },_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ -begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","src#"], keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ begin:"\x3c!--|--\x3e"},{begin:""}]}] @@ -2009,7 +2009,7 @@ const n="[a-zA-Z_\\-+\\*\\/<=>&#][a-zA-Z0-9_\\-+*\\/<=>&#!]*",a="\\|[^]*?\\|",i= className:"literal",begin:"\\b(t{1}|nil)\\b"},l={className:"number",variants:[{ begin:i,relevance:0},{begin:"#(b|B)[0-1]+(/[0-1]+)?"},{ begin:"#(o|O)[0-7]+(/[0-7]+)?"},{begin:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{ -begin:"#(c|C)\\("+i+" +"+i,end:"\\)"}]},b=e.inherit(e.QUOTE_STRING_MODE,{ +begin:"#(src|C)\\("+i+" +"+i,end:"\\)"}]},b=e.inherit(e.QUOTE_STRING_MODE,{ illegal:null}),g=e.COMMENT(";","$",{relevance:0}),r={begin:"\\*",end:"\\*"},t={ className:"symbol",begin:"[:&]"+n},c={begin:n,relevance:0},d={begin:a},o={ contains:[l,b,r,t,{begin:"\\(",end:"\\)",contains:["self",s,b,l,c]},c], @@ -2079,7 +2079,7 @@ const a=e.regex,n=/([-a-zA-Z$._][\w$.-]*)/,t={className:"variable",variants:[{ begin:a.concat(/%/,n)},{begin:/%\d+/},{begin:/#\d+/}]},i={className:"title", variants:[{begin:a.concat(/@/,n)},{begin:/@\d+/},{begin:a.concat(/!/,n)},{ begin:a.concat(/!\d+/,n)},{begin:/!\d+/}]};return{name:"LLVM IR", -keywords:"begin end true false declare define global constant private linker_private internal available_externally linkonce linkonce_odr weak weak_odr appending dllimport dllexport common default hidden protected extern_weak external thread_local zeroinitializer undef null to tail target triple datalayout volatile nuw nsw nnan ninf nsz arcp fast exact inbounds align addrspace section alias module asm sideeffect gc dbg linker_private_weak attributes blockaddress initialexec localdynamic localexec prefix unnamed_addr ccc fastcc coldcc x86_stdcallcc x86_fastcallcc arm_apcscc arm_aapcscc arm_aapcs_vfpcc ptx_device ptx_kernel intel_ocl_bicc msp430_intrcc spir_func spir_kernel x86_64_sysvcc x86_64_win64cc x86_thiscallcc cc c signext zeroext inreg sret nounwind noreturn noalias nocapture byval nest readnone readonly inlinehint noinline alwaysinline optsize ssp sspreq noredzone noimplicitfloat naked builtin cold nobuiltin noduplicate nonlazybind optnone returns_twice sanitize_address sanitize_memory sanitize_thread sspstrong uwtable returned type opaque eq ne slt sgt sle sge ult ugt ule uge oeq one olt ogt ole oge ord uno ueq une x acq_rel acquire alignstack atomic catch cleanup filter inteldialect max min monotonic nand personality release seq_cst singlethread umax umin unordered xchg add fadd sub fsub mul fmul udiv sdiv fdiv urem srem frem shl lshr ashr and or xor icmp fcmp phi call trunc zext sext fptrunc fpext uitofp sitofp fptoui fptosi inttoptr ptrtoint bitcast addrspacecast select va_arg ret br switch invoke unwind unreachable indirectbr landingpad resume malloc alloca free load store getelementptr extractelement insertelement shufflevector getresult extractvalue insertvalue atomicrmw cmpxchg fence argmemonly double", +keywords:"begin end true false declare define global constant private linker_private internal available_externally linkonce linkonce_odr weak weak_odr appending dllimport dllexport common default hidden protected extern_weak external thread_local zeroinitializer undef null to tail target triple datalayout volatile nuw nsw nnan ninf nsz arcp fast exact inbounds align addrspace section alias module asm sideeffect gc dbg linker_private_weak attributes blockaddress initialexec localdynamic localexec prefix unnamed_addr ccc fastcc coldcc x86_stdcallcc x86_fastcallcc arm_apcscc arm_aapcscc arm_aapcs_vfpcc ptx_device ptx_kernel intel_ocl_bicc msp430_intrcc spir_func spir_kernel x86_64_sysvcc x86_64_win64cc x86_thiscallcc cc src signext zeroext inreg sret nounwind noreturn noalias nocapture byval nest readnone readonly inlinehint noinline alwaysinline optsize ssp sspreq noredzone noimplicitfloat naked builtin cold nobuiltin noduplicate nonlazybind optnone returns_twice sanitize_address sanitize_memory sanitize_thread sspstrong uwtable returned type opaque eq ne slt sgt sle sge ult ugt ule uge oeq one olt ogt ole oge ord uno ueq une x acq_rel acquire alignstack atomic catch cleanup filter inteldialect max min monotonic nand personality release seq_cst singlethread umax umin unordered xchg add fadd sub fsub mul fmul udiv sdiv fdiv urem srem frem shl lshr ashr and or xor icmp fcmp phi call trunc zext sext fptrunc fpext uitofp sitofp fptoui fptosi inttoptr ptrtoint bitcast addrspacecast select va_arg ret br switch invoke unwind unreachable indirectbr landingpad resume malloc alloca free load store getelementptr extractelement insertelement shufflevector getresult extractvalue insertvalue atomicrmw cmpxchg fence argmemonly double", contains:[{className:"type",begin:/\bi\d+(?=\s|\b)/},e.COMMENT(/;\s*$/,null,{ relevance:0}),e.COMMENT(/;/,/$/),{className:"string",begin:/"/,end:/"/, contains:[{className:"char.escape",match:/\\\d\d/}]},i,{className:"punctuation", @@ -2201,7 +2201,7 @@ className:"string",begin:'"',end:'"',contains:[{begin:'""'}],starts:s $pattern:"[A-Za-z_%][0-9A-Za-z_%]*", keyword:"if then else elseif for thru do while unless step in and or not", literal:"true false unknown inf minf ind und %e %i %pi %phi %gamma", -built_in:" abasep abs absint absolute_real_time acos acosh acot acoth acsc acsch activate addcol add_edge add_edges addmatrices addrow add_vertex add_vertices adjacency_matrix adjoin adjoint af agd airy airy_ai airy_bi airy_dai airy_dbi algsys alg_type alias allroots alphacharp alphanumericp amortization %and annuity_fv annuity_pv antid antidiff AntiDifference append appendfile apply apply1 apply2 applyb1 apropos args arit_amortization arithmetic arithsum array arrayapply arrayinfo arraymake arraysetapply ascii asec asech asin asinh askinteger asksign assoc assoc_legendre_p assoc_legendre_q assume assume_external_byte_order asympa at atan atan2 atanh atensimp atom atvalue augcoefmatrix augmented_lagrangian_method av average_degree backtrace bars barsplot barsplot_description base64 base64_decode bashindices batch batchload bc2 bdvac belln benefit_cost bern bernpoly bernstein_approx bernstein_expand bernstein_poly bessel bessel_i bessel_j bessel_k bessel_simplify bessel_y beta beta_incomplete beta_incomplete_generalized beta_incomplete_regularized bezout bfallroots bffac bf_find_root bf_fmin_cobyla bfhzeta bfloat bfloatp bfpsi bfpsi0 bfzeta biconnected_components bimetric binomial bipartition block blockmatrixp bode_gain bode_phase bothcoef box boxplot boxplot_description break bug_report build_info|10 buildq build_sample burn cabs canform canten cardinality carg cartan cartesian_product catch cauchy_matrix cbffac cdf_bernoulli cdf_beta cdf_binomial cdf_cauchy cdf_chi2 cdf_continuous_uniform cdf_discrete_uniform cdf_exp cdf_f cdf_gamma cdf_general_finite_discrete cdf_geometric cdf_gumbel cdf_hypergeometric cdf_laplace cdf_logistic cdf_lognormal cdf_negative_binomial cdf_noncentral_chi2 cdf_noncentral_student_t cdf_normal cdf_pareto cdf_poisson cdf_rank_sum cdf_rayleigh cdf_signed_rank cdf_student_t cdf_weibull cdisplay ceiling central_moment cequal cequalignore cf cfdisrep cfexpand cgeodesic cgreaterp cgreaterpignore changename changevar chaosgame charat charfun charfun2 charlist charp charpoly chdir chebyshev_t chebyshev_u checkdiv check_overlaps chinese cholesky christof chromatic_index chromatic_number cint circulant_graph clear_edge_weight clear_rules clear_vertex_label clebsch_gordan clebsch_graph clessp clesspignore close closefile cmetric coeff coefmatrix cograd col collapse collectterms columnop columnspace columnswap columnvector combination combine comp2pui compare compfile compile compile_file complement_graph complete_bipartite_graph complete_graph complex_number_p components compose_functions concan concat conjugate conmetderiv connected_components connect_vertices cons constant constantp constituent constvalue cont2part content continuous_freq contortion contour_plot contract contract_edge contragrad contrib_ode convert coord copy copy_file copy_graph copylist copymatrix cor cos cosh cot coth cov cov1 covdiff covect covers crc24sum create_graph create_list csc csch csetup cspline ctaylor ct_coordsys ctransform ctranspose cube_graph cuboctahedron_graph cunlisp cv cycle_digraph cycle_graph cylindrical days360 dblint deactivate declare declare_constvalue declare_dimensions declare_fundamental_dimensions declare_fundamental_units declare_qty declare_translated declare_unit_conversion declare_units declare_weights decsym defcon define define_alt_display define_variable defint defmatch defrule defstruct deftaylor degree_sequence del delete deleten delta demo demoivre denom depends derivdegree derivlist describe desolve determinant dfloat dgauss_a dgauss_b dgeev dgemm dgeqrf dgesv dgesvd diag diagmatrix diag_matrix diagmatrixp diameter diff digitcharp dimacs_export dimacs_import dimension dimensionless dimensions dimensions_as_list direct directory discrete_freq disjoin disjointp disolate disp dispcon dispform dispfun dispJordan display disprule dispterms distrib divide divisors divsum dkummer_m dkummer_u dlange dodecahedron_graph dotproduct dotsimp dpart draw draw2d draw3d drawdf draw_file draw_graph dscalar echelon edge_coloring edge_connectivity edges eigens_by_jacobi eigenvalues eigenvectors eighth einstein eivals eivects elapsed_real_time elapsed_run_time ele2comp ele2polynome ele2pui elem elementp elevation_grid elim elim_allbut eliminate eliminate_using ellipse elliptic_e elliptic_ec elliptic_eu elliptic_f elliptic_kc elliptic_pi ematrix empty_graph emptyp endcons entermatrix entertensor entier equal equalp equiv_classes erf erfc erf_generalized erfi errcatch error errormsg errors euler ev eval_string evenp every evolution evolution2d evundiff example exp expand expandwrt expandwrt_factored expint expintegral_chi expintegral_ci expintegral_e expintegral_e1 expintegral_ei expintegral_e_simplify expintegral_li expintegral_shi expintegral_si explicit explose exponentialize express expt exsec extdiff extract_linear_equations extremal_subset ezgcd %f f90 facsum factcomb factor factorfacsum factorial factorout factorsum facts fast_central_elements fast_linsolve fasttimes featurep fernfale fft fib fibtophi fifth filename_merge file_search file_type fillarray findde find_root find_root_abs find_root_error find_root_rel first fix flatten flength float floatnump floor flower_snark flush flush1deriv flushd flushnd flush_output fmin_cobyla forget fortran fourcos fourexpand fourier fourier_elim fourint fourintcos fourintsin foursimp foursin fourth fposition frame_bracket freeof freshline fresnel_c fresnel_s from_adjacency_matrix frucht_graph full_listify fullmap fullmapl fullratsimp fullratsubst fullsetify funcsolve fundamental_dimensions fundamental_units fundef funmake funp fv g0 g1 gamma gamma_greek gamma_incomplete gamma_incomplete_generalized gamma_incomplete_regularized gauss gauss_a gauss_b gaussprob gcd gcdex gcdivide gcfac gcfactor gd generalized_lambert_w genfact gen_laguerre genmatrix gensym geo_amortization geo_annuity_fv geo_annuity_pv geomap geometric geometric_mean geosum get getcurrentdirectory get_edge_weight getenv get_lu_factors get_output_stream_string get_pixel get_plot_option get_tex_environment get_tex_environment_default get_vertex_label gfactor gfactorsum ggf girth global_variances gn gnuplot_close gnuplot_replot gnuplot_reset gnuplot_restart gnuplot_start go Gosper GosperSum gr2d gr3d gradef gramschmidt graph6_decode graph6_encode graph6_export graph6_import graph_center graph_charpoly graph_eigenvalues graph_flow graph_order graph_periphery graph_product graph_size graph_union great_rhombicosidodecahedron_graph great_rhombicuboctahedron_graph grid_graph grind grobner_basis grotzch_graph hamilton_cycle hamilton_path hankel hankel_1 hankel_2 harmonic harmonic_mean hav heawood_graph hermite hessian hgfred hilbertmap hilbert_matrix hipow histogram histogram_description hodge horner hypergeometric i0 i1 %ibes ic1 ic2 ic_convert ichr1 ichr2 icosahedron_graph icosidodecahedron_graph icurvature ident identfor identity idiff idim idummy ieqn %if ifactors iframes ifs igcdex igeodesic_coords ilt image imagpart imetric implicit implicit_derivative implicit_plot indexed_tensor indices induced_subgraph inferencep inference_result infix info_display init_atensor init_ctensor in_neighbors innerproduct inpart inprod inrt integerp integer_partitions integrate intersect intersection intervalp intopois intosum invariant1 invariant2 inverse_fft inverse_jacobi_cd inverse_jacobi_cn inverse_jacobi_cs inverse_jacobi_dc inverse_jacobi_dn inverse_jacobi_ds inverse_jacobi_nc inverse_jacobi_nd inverse_jacobi_ns inverse_jacobi_sc inverse_jacobi_sd inverse_jacobi_sn invert invert_by_adjoint invert_by_lu inv_mod irr is is_biconnected is_bipartite is_connected is_digraph is_edge_in_graph is_graph is_graph_or_digraph ishow is_isomorphic isolate isomorphism is_planar isqrt isreal_p is_sconnected is_tree is_vertex_in_graph items_inference %j j0 j1 jacobi jacobian jacobi_cd jacobi_cn jacobi_cs jacobi_dc jacobi_dn jacobi_ds jacobi_nc jacobi_nd jacobi_ns jacobi_p jacobi_sc jacobi_sd jacobi_sn JF jn join jordan julia julia_set julia_sin %k kdels kdelta kill killcontext kostka kron_delta kronecker_product kummer_m kummer_u kurtosis kurtosis_bernoulli kurtosis_beta kurtosis_binomial kurtosis_chi2 kurtosis_continuous_uniform kurtosis_discrete_uniform kurtosis_exp kurtosis_f kurtosis_gamma kurtosis_general_finite_discrete kurtosis_geometric kurtosis_gumbel kurtosis_hypergeometric kurtosis_laplace kurtosis_logistic kurtosis_lognormal kurtosis_negative_binomial kurtosis_noncentral_chi2 kurtosis_noncentral_student_t kurtosis_normal kurtosis_pareto kurtosis_poisson kurtosis_rayleigh kurtosis_student_t kurtosis_weibull label labels lagrange laguerre lambda lambert_w laplace laplacian_matrix last lbfgs lc2kdt lcharp lc_l lcm lc_u ldefint ldisp ldisplay legendre_p legendre_q leinstein length let letrules letsimp levi_civita lfreeof lgtreillis lhs li liediff limit Lindstedt linear linearinterpol linear_program linear_regression line_graph linsolve listarray list_correlations listify list_matrix_entries list_nc_monomials listoftens listofvars listp lmax lmin load loadfile local locate_matrix_entry log logcontract log_gamma lopow lorentz_gauge lowercasep lpart lratsubst lreduce lriemann lsquares_estimates lsquares_estimates_approximate lsquares_estimates_exact lsquares_mse lsquares_residual_mse lsquares_residuals lsum ltreillis lu_backsub lucas lu_factor %m macroexpand macroexpand1 make_array makebox makefact makegamma make_graph make_level_picture makelist makeOrders make_poly_continent make_poly_country make_polygon make_random_state make_rgb_picture makeset make_string_input_stream make_string_output_stream make_transform mandelbrot mandelbrot_set map mapatom maplist matchdeclare matchfix mat_cond mat_fullunblocker mat_function mathml_display mat_norm matrix matrixmap matrixp matrix_size mattrace mat_trace mat_unblocker max max_clique max_degree max_flow maximize_lp max_independent_set max_matching maybe md5sum mean mean_bernoulli mean_beta mean_binomial mean_chi2 mean_continuous_uniform mean_deviation mean_discrete_uniform mean_exp mean_f mean_gamma mean_general_finite_discrete mean_geometric mean_gumbel mean_hypergeometric mean_laplace mean_logistic mean_lognormal mean_negative_binomial mean_noncentral_chi2 mean_noncentral_student_t mean_normal mean_pareto mean_poisson mean_rayleigh mean_student_t mean_weibull median median_deviation member mesh metricexpandall mgf1_sha1 min min_degree min_edge_cut minfactorial minimalPoly minimize_lp minimum_spanning_tree minor minpack_lsquares minpack_solve min_vertex_cover min_vertex_cut mkdir mnewton mod mode_declare mode_identity ModeMatrix moebius mon2schur mono monomial_dimensions multibernstein_poly multi_display_for_texinfo multi_elem multinomial multinomial_coeff multi_orbit multiplot_mode multi_pui multsym multthru mycielski_graph nary natural_unit nc_degree ncexpt ncharpoly negative_picture neighbors new newcontext newdet new_graph newline newton new_variable next_prime nicedummies niceindices ninth nofix nonarray noncentral_moment nonmetricity nonnegintegerp nonscalarp nonzeroandfreeof notequal nounify nptetrad npv nroots nterms ntermst nthroot nullity nullspace num numbered_boundaries numberp number_to_octets num_distinct_partitions numerval numfactor num_partitions nusum nzeta nzetai nzetar octets_to_number octets_to_oid odd_girth oddp ode2 ode_check odelin oid_to_octets op opena opena_binary openr openr_binary openw openw_binary operatorp opsubst optimize %or orbit orbits ordergreat ordergreatp orderless orderlessp orthogonal_complement orthopoly_recur orthopoly_weight outermap out_neighbors outofpois pade parabolic_cylinder_d parametric parametric_surface parg parGosper parse_string parse_timedate part part2cont partfrac partition partition_set partpol path_digraph path_graph pathname_directory pathname_name pathname_type pdf_bernoulli pdf_beta pdf_binomial pdf_cauchy pdf_chi2 pdf_continuous_uniform pdf_discrete_uniform pdf_exp pdf_f pdf_gamma pdf_general_finite_discrete pdf_geometric pdf_gumbel pdf_hypergeometric pdf_laplace pdf_logistic pdf_lognormal pdf_negative_binomial pdf_noncentral_chi2 pdf_noncentral_student_t pdf_normal pdf_pareto pdf_poisson pdf_rank_sum pdf_rayleigh pdf_signed_rank pdf_student_t pdf_weibull pearson_skewness permanent permut permutation permutations petersen_graph petrov pickapart picture_equalp picturep piechart piechart_description planar_embedding playback plog plot2d plot3d plotdf ploteq plsquares pochhammer points poisdiff poisexpt poisint poismap poisplus poissimp poissubst poistimes poistrim polar polarform polartorect polar_to_xy poly_add poly_buchberger poly_buchberger_criterion poly_colon_ideal poly_content polydecomp poly_depends_p poly_elimination_ideal poly_exact_divide poly_expand poly_expt poly_gcd polygon poly_grobner poly_grobner_equal poly_grobner_member poly_grobner_subsetp poly_ideal_intersection poly_ideal_polysaturation poly_ideal_polysaturation1 poly_ideal_saturation poly_ideal_saturation1 poly_lcm poly_minimization polymod poly_multiply polynome2ele polynomialp poly_normal_form poly_normalize poly_normalize_list poly_polysaturation_extension poly_primitive_part poly_pseudo_divide poly_reduced_grobner poly_reduction poly_saturation_extension poly_s_polynomial poly_subtract polytocompanion pop postfix potential power_mod powerseries powerset prefix prev_prime primep primes principal_components print printf printfile print_graph printpois printprops prodrac product properties propvars psi psubst ptriangularize pui pui2comp pui2ele pui2polynome pui_direct puireduc push put pv qput qrange qty quad_control quad_qag quad_qagi quad_qagp quad_qags quad_qawc quad_qawf quad_qawo quad_qaws quadrilateral quantile quantile_bernoulli quantile_beta quantile_binomial quantile_cauchy quantile_chi2 quantile_continuous_uniform quantile_discrete_uniform quantile_exp quantile_f quantile_gamma quantile_general_finite_discrete quantile_geometric quantile_gumbel quantile_hypergeometric quantile_laplace quantile_logistic quantile_lognormal quantile_negative_binomial quantile_noncentral_chi2 quantile_noncentral_student_t quantile_normal quantile_pareto quantile_poisson quantile_rayleigh quantile_student_t quantile_weibull quartile_skewness quit qunit quotient racah_v racah_w radcan radius random random_bernoulli random_beta random_binomial random_bipartite_graph random_cauchy random_chi2 random_continuous_uniform random_digraph random_discrete_uniform random_exp random_f random_gamma random_general_finite_discrete random_geometric random_graph random_graph1 random_gumbel random_hypergeometric random_laplace random_logistic random_lognormal random_negative_binomial random_network random_noncentral_chi2 random_noncentral_student_t random_normal random_pareto random_permutation random_poisson random_rayleigh random_regular_graph random_student_t random_tournament random_tree random_weibull range rank rat ratcoef ratdenom ratdiff ratdisrep ratexpand ratinterpol rational rationalize ratnumer ratnump ratp ratsimp ratsubst ratvars ratweight read read_array read_binary_array read_binary_list read_binary_matrix readbyte readchar read_hashed_array readline read_list read_matrix read_nested_list readonly read_xpm real_imagpart_to_conjugate realpart realroots rearray rectangle rectform rectform_log_if_constant recttopolar rediff reduce_consts reduce_order region region_boundaries region_boundaries_plus rem remainder remarray rembox remcomps remcon remcoord remfun remfunction remlet remove remove_constvalue remove_dimensions remove_edge remove_fundamental_dimensions remove_fundamental_units remove_plot_option remove_vertex rempart remrule remsym remvalue rename rename_file reset reset_displays residue resolvante resolvante_alternee1 resolvante_bipartite resolvante_diedrale resolvante_klein resolvante_klein3 resolvante_produit_sym resolvante_unitaire resolvante_vierer rest resultant return reveal reverse revert revert2 rgb2level rhs ricci riemann rinvariant risch rk rmdir rncombine romberg room rootscontract round row rowop rowswap rreduce run_testsuite %s save saving scalarp scaled_bessel_i scaled_bessel_i0 scaled_bessel_i1 scalefactors scanmap scatterplot scatterplot_description scene schur2comp sconcat scopy scsimp scurvature sdowncase sec sech second sequal sequalignore set_alt_display setdifference set_draw_defaults set_edge_weight setelmx setequalp setify setp set_partitions set_plot_option set_prompt set_random_state set_tex_environment set_tex_environment_default setunits setup_autoload set_up_dot_simplifications set_vertex_label seventh sexplode sf sha1sum sha256sum shortest_path shortest_weighted_path show showcomps showratvars sierpinskiale sierpinskimap sign signum similaritytransform simp_inequality simplify_sum simplode simpmetderiv simtran sin sinh sinsert sinvertcase sixth skewness skewness_bernoulli skewness_beta skewness_binomial skewness_chi2 skewness_continuous_uniform skewness_discrete_uniform skewness_exp skewness_f skewness_gamma skewness_general_finite_discrete skewness_geometric skewness_gumbel skewness_hypergeometric skewness_laplace skewness_logistic skewness_lognormal skewness_negative_binomial skewness_noncentral_chi2 skewness_noncentral_student_t skewness_normal skewness_pareto skewness_poisson skewness_rayleigh skewness_student_t skewness_weibull slength smake small_rhombicosidodecahedron_graph small_rhombicuboctahedron_graph smax smin smismatch snowmap snub_cube_graph snub_dodecahedron_graph solve solve_rec solve_rec_rat some somrac sort sparse6_decode sparse6_encode sparse6_export sparse6_import specint spherical spherical_bessel_j spherical_bessel_y spherical_hankel1 spherical_hankel2 spherical_harmonic spherical_to_xyz splice split sposition sprint sqfr sqrt sqrtdenest sremove sremovefirst sreverse ssearch ssort sstatus ssubst ssubstfirst staircase standardize standardize_inverse_trig starplot starplot_description status std std1 std_bernoulli std_beta std_binomial std_chi2 std_continuous_uniform std_discrete_uniform std_exp std_f std_gamma std_general_finite_discrete std_geometric std_gumbel std_hypergeometric std_laplace std_logistic std_lognormal std_negative_binomial std_noncentral_chi2 std_noncentral_student_t std_normal std_pareto std_poisson std_rayleigh std_student_t std_weibull stemplot stirling stirling1 stirling2 strim striml strimr string stringout stringp strong_components struve_h struve_l sublis sublist sublist_indices submatrix subsample subset subsetp subst substinpart subst_parallel substpart substring subvar subvarp sum sumcontract summand_to_rec supcase supcontext symbolp symmdifference symmetricp system take_channel take_inference tan tanh taylor taylorinfo taylorp taylor_simplifier taytorat tcl_output tcontract tellrat tellsimp tellsimpafter tentex tenth test_mean test_means_difference test_normality test_proportion test_proportions_difference test_rank_sum test_sign test_signed_rank test_variance test_variance_ratio tex tex1 tex_display texput %th third throw time timedate timer timer_info tldefint tlimit todd_coxeter toeplitz tokens to_lisp topological_sort to_poly to_poly_solve totaldisrep totalfourier totient tpartpol trace tracematrix trace_options transform_sample translate translate_file transpose treefale tree_reduce treillis treinat triangle triangularize trigexpand trigrat trigreduce trigsimp trunc truncate truncated_cube_graph truncated_dodecahedron_graph truncated_icosahedron_graph truncated_tetrahedron_graph tr_warnings_get tube tutte_graph ueivects uforget ultraspherical underlying_graph undiff union unique uniteigenvectors unitp units unit_step unitvector unorder unsum untellrat untimer untrace uppercasep uricci uriemann uvect vandermonde_matrix var var1 var_bernoulli var_beta var_binomial var_chi2 var_continuous_uniform var_discrete_uniform var_exp var_f var_gamma var_general_finite_discrete var_geometric var_gumbel var_hypergeometric var_laplace var_logistic var_lognormal var_negative_binomial var_noncentral_chi2 var_noncentral_student_t var_normal var_pareto var_poisson var_rayleigh var_student_t var_weibull vector vectorpotential vectorsimp verbify vers vertex_coloring vertex_connectivity vertex_degree vertex_distance vertex_eccentricity vertex_in_degree vertex_out_degree vertices vertices_to_cycle vertices_to_path %w weyl wheel_graph wiener_index wigner_3j wigner_6j wigner_9j with_stdout write_binary_data writebyte write_data writefile wronskian xreduce xthru %y Zeilberger zeroequiv zerofor zeromatrix zeromatrixp zeta zgeev zheev zlange zn_add_table zn_carmichael_lambda zn_characteristic_factors zn_determinant zn_factor_generators zn_invert_by_lu zn_log zn_mult_table absboxchar activecontexts adapt_depth additive adim aform algebraic algepsilon algexact aliases allbut all_dotsimp_denoms allocation allsym alphabetic animation antisymmetric arrays askexp assume_pos assume_pos_pred assumescalar asymbol atomgrad atrig1 axes axis_3d axis_bottom axis_left axis_right axis_top azimuth background background_color backsubst berlefact bernstein_explicit besselexpand beta_args_sum_to_integer beta_expand bftorat bftrunc bindtest border boundaries_array box boxchar breakup %c capping cauchysum cbrange cbtics center cflength cframe_flag cnonmet_flag color color_bar color_bar_tics colorbox columns commutative complex cone context contexts contour contour_levels cosnpiflag ctaypov ctaypt ctayswitch ctayvar ct_coords ctorsion_flag ctrgsimp cube current_let_rule_package cylinder data_file_name debugmode decreasing default_let_rule_package delay dependencies derivabbrev derivsubst detout diagmetric diff dim dimensions dispflag display2d|10 display_format_internal distribute_over doallmxops domain domxexpt domxmxops domxnctimes dontfactor doscmxops doscmxplus dot0nscsimp dot0simp dot1simp dotassoc dotconstrules dotdistrib dotexptsimp dotident dotscrules draw_graph_program draw_realpart edge_color edge_coloring edge_partition edge_type edge_width %edispflag elevation %emode endphi endtheta engineering_format_floats enhanced3d %enumer epsilon_lp erfflag erf_representation errormsg error_size error_syms error_type %e_to_numlog eval even evenfun evflag evfun ev_point expandwrt_denom expintexpand expintrep expon expop exptdispflag exptisolate exptsubst facexpand facsum_combine factlim factorflag factorial_expand factors_only fb feature features file_name file_output_append file_search_demo file_search_lisp file_search_maxima|10 file_search_tests file_search_usage file_type_lisp file_type_maxima|10 fill_color fill_density filled_func fixed_vertices flipflag float2bf font font_size fortindent fortspaces fpprec fpprintprec functions gamma_expand gammalim gdet genindex gensumnum GGFCFMAX GGFINFINITY globalsolve gnuplot_command gnuplot_curve_styles gnuplot_curve_titles gnuplot_default_term_command gnuplot_dumb_term_command gnuplot_file_args gnuplot_file_name gnuplot_out_file gnuplot_pdf_term_command gnuplot_pm3d gnuplot_png_term_command gnuplot_postamble gnuplot_preamble gnuplot_ps_term_command gnuplot_svg_term_command gnuplot_term gnuplot_view_args Gosper_in_Zeilberger gradefs grid grid2d grind halfangles head_angle head_both head_length head_type height hypergeometric_representation %iargs ibase icc1 icc2 icounter idummyx ieqnprint ifb ifc1 ifc2 ifg ifgi ifr iframe_bracket_form ifri igeowedge_flag ikt1 ikt2 imaginary inchar increasing infeval infinity inflag infolists inm inmc1 inmc2 intanalysis integer integervalued integrate_use_rootsof integration_constant integration_constant_counter interpolate_color intfaclim ip_grid ip_grid_in irrational isolate_wrt_times iterations itr julia_parameter %k1 %k2 keepfloat key key_pos kinvariant kt label label_alignment label_orientation labels lassociative lbfgs_ncorrections lbfgs_nfeval_max leftjust legend letrat let_rule_packages lfg lg lhospitallim limsubst linear linear_solver linechar linel|10 linenum line_type linewidth line_width linsolve_params linsolvewarn lispdisp listarith listconstvars listdummyvars lmxchar load_pathname loadprint logabs logarc logcb logconcoeffp logexpand lognegint logsimp logx logx_secondary logy logy_secondary logz lriem m1pbranch macroexpansion macros mainvar manual_demo maperror mapprint matrix_element_add matrix_element_mult matrix_element_transpose maxapplydepth maxapplyheight maxima_tempdir|10 maxima_userdir|10 maxnegex MAX_ORD maxposex maxpsifracdenom maxpsifracnum maxpsinegint maxpsiposint maxtayorder mesh_lines_color method mod_big_prime mode_check_errorp mode_checkp mode_check_warnp mod_test mod_threshold modular_linear_solver modulus multiplicative multiplicities myoptions nary negdistrib negsumdispflag newline newtonepsilon newtonmaxiter nextlayerfactor niceindicespref nm nmc noeval nolabels nonegative_lp noninteger nonscalar noun noundisp nouns np npi nticks ntrig numer numer_pbranch obase odd oddfun opacity opproperties opsubst optimprefix optionset orientation origin orthopoly_returns_intervals outative outchar packagefile palette partswitch pdf_file pfeformat phiresolution %piargs piece pivot_count_sx pivot_max_sx plot_format plot_options plot_realpart png_file pochhammer_max_index points pointsize point_size points_joined point_type poislim poisson poly_coefficient_ring poly_elimination_order polyfactor poly_grobner_algorithm poly_grobner_debug poly_monomial_order poly_primary_elimination_order poly_return_term_list poly_secondary_elimination_order poly_top_reduction_only posfun position powerdisp pred prederror primep_number_of_tests product_use_gamma program programmode promote_float_to_bigfloat prompt proportional_axes props psexpand ps_file radexpand radius radsubstflag rassociative ratalgdenom ratchristof ratdenomdivide rateinstein ratepsilon ratfac rational ratmx ratprint ratriemann ratsimpexpons ratvarswitch ratweights ratweyl ratwtlvl real realonly redraw refcheck resolution restart resultant ric riem rmxchar %rnum_list rombergabs rombergit rombergmin rombergtol rootsconmode rootsepsilon run_viewer same_xy same_xyz savedef savefactors scalar scalarmatrixp scale scale_lp setcheck setcheckbreak setval show_edge_color show_edges show_edge_type show_edge_width show_id show_label showtime show_vertex_color show_vertex_size show_vertex_type show_vertices show_weight simp simplified_output simplify_products simpproduct simpsum sinnpiflag solvedecomposes solveexplicit solvefactors solvenullwarn solveradcan solvetrigwarn space sparse sphere spring_embedding_depth sqrtdispflag stardisp startphi starttheta stats_numer stringdisp structures style sublis_apply_lambda subnumsimp sumexpand sumsplitfact surface surface_hide svg_file symmetric tab taylordepth taylor_logexpand taylor_order_coefficients taylor_truncate_polynomials tensorkill terminal testsuite_files thetaresolution timer_devalue title tlimswitch tr track transcompile transform transform_xy translate_fast_arrays transparent transrun tr_array_as_ref tr_bound_function_applyp tr_file_tty_messagesp tr_float_can_branch_complex tr_function_call_default trigexpandplus trigexpandtimes triginverses trigsign trivial_solutions tr_numer tr_optimize_max_loop tr_semicompile tr_state_vars tr_warn_bad_function_calls tr_warn_fexpr tr_warn_meval tr_warn_mode tr_warn_undeclared tr_warn_undefined_variable tstep ttyoff tube_extremes ufg ug %unitexpand unit_vectors uric uriem use_fast_arrays user_preamble usersetunits values vect_cross verbose vertex_color vertex_coloring vertex_partition vertex_size vertex_type view warnings weyl width windowname windowtitle wired_surface wireframe xaxis xaxis_color xaxis_secondary xaxis_type xaxis_width xlabel xlabel_secondary xlength xrange xrange_secondary xtics xtics_axis xtics_rotate xtics_rotate_secondary xtics_secondary xtics_secondary_axis xu_grid x_voxel xy_file xyplane xy_scale yaxis yaxis_color yaxis_secondary yaxis_type yaxis_width ylabel ylabel_secondary ylength yrange yrange_secondary ytics ytics_axis ytics_rotate ytics_rotate_secondary ytics_secondary ytics_secondary_axis yv_grid y_voxel yx_ratio zaxis zaxis_color zaxis_type zaxis_width zeroa zerob zerobern zeta%pi zlabel zlabel_rotate zlength zmin zn_primroot_limit zn_primroot_pretest", +built_in:" abasep abs absint absolute_real_time acos acosh acot acoth acsc acsch activate addcol add_edge add_edges addmatrices addrow add_vertex add_vertices adjacency_matrix adjoin adjoint af agd airy airy_ai airy_bi airy_dai airy_dbi algsys alg_type alias allroots alphacharp alphanumericp amortization %and annuity_fv annuity_pv antid antidiff AntiDifference append appendfile apply apply1 apply2 applyb1 apropos args arit_amortization arithmetic arithsum array arrayapply arrayinfo arraymake arraysetapply ascii asec asech asin asinh askinteger asksign assoc assoc_legendre_p assoc_legendre_q assume assume_external_byte_order asympa at atan atan2 atanh atensimp atom atvalue augcoefmatrix augmented_lagrangian_method av average_degree backtrace bars barsplot barsplot_description base64 base64_decode bashindices batch batchload bc2 bdvac belln benefit_cost bern bernpoly bernstein_approx bernstein_expand bernstein_poly bessel bessel_i bessel_j bessel_k bessel_simplify bessel_y beta beta_incomplete beta_incomplete_generalized beta_incomplete_regularized bezout bfallroots bffac bf_find_root bf_fmin_cobyla bfhzeta bfloat bfloatp bfpsi bfpsi0 bfzeta biconnected_components bimetric binomial bipartition block blockmatrixp bode_gain bode_phase bothcoef box boxplot boxplot_description break bug_report build_info|10 buildq build_sample burn cabs canform canten cardinality carg cartan cartesian_product catch cauchy_matrix cbffac cdf_bernoulli cdf_beta cdf_binomial cdf_cauchy cdf_chi2 cdf_continuous_uniform cdf_discrete_uniform cdf_exp cdf_f cdf_gamma cdf_general_finite_discrete cdf_geometric cdf_gumbel cdf_hypergeometric cdf_laplace cdf_logistic cdf_lognormal cdf_negative_binomial cdf_noncentral_chi2 cdf_noncentral_student_t cdf_normal cdf_pareto cdf_poisson cdf_rank_sum cdf_rayleigh cdf_signed_rank cdf_student_t cdf_weibull cdisplay ceiling central_moment cequal cequalignore cf cfdisrep cfexpand cgeodesic cgreaterp cgreaterpignore changename changevar chaosgame charat charfun charfun2 charlist charp charpoly chdir chebyshev_t chebyshev_u checkdiv check_overlaps chinese cholesky christof chromatic_index chromatic_number cint circulant_graph clear_edge_weight clear_rules clear_vertex_label clebsch_gordan clebsch_graph clessp clesspignore close closefile cmetric coeff coefmatrix cograd col collapse collectterms columnop columnspace columnswap columnvector combination combine comp2pui compare compfile compile compile_file complement_graph complete_bipartite_graph complete_graph complex_number_p components compose_functions concan concat conjugate conmetderiv connected_components connect_vertices cons constant constantp constituent constvalue cont2part content continuous_freq contortion contour_plot contract contract_edge contragrad contrib_ode convert coord copy copy_file copy_graph copylist copymatrix cor cos cosh cot coth cov cov1 covdiff covect covers crc24sum create_graph create_list csc csch csetup cspline ctaylor ct_coordsys ctransform ctranspose cube_graph cuboctahedron_graph cunlisp cv cycle_digraph cycle_graph cylindrical days360 dblint deactivate declare declare_constvalue declare_dimensions declare_fundamental_dimensions declare_fundamental_units declare_qty declare_translated declare_unit_conversion declare_units declare_weights decsym defcon define define_alt_display define_variable defint defmatch defrule defstruct deftaylor degree_sequence del delete deleten delta demo demoivre denom depends derivdegree derivlist describe desolve determinant dfloat dgauss_a dgauss_b dgeev dgemm dgeqrf dgesv dgesvd diag diagmatrix diag_matrix diagmatrixp diameter diff digitcharp dimacs_export dimacs_import dimension dimensionless dimensions dimensions_as_list direct directory discrete_freq disjoin disjointp disolate disp dispcon dispform dispfun dispJordan display disprule dispterms distrib divide divisors divsum dkummer_m dkummer_u dlange dodecahedron_graph dotproduct dotsimp dpart draw draw2d draw3d drawdf draw_file draw_graph dscalar echelon edge_coloring edge_connectivity edges eigens_by_jacobi eigenvalues eigenvectors eighth einstein eivals eivects elapsed_real_time elapsed_run_time ele2comp ele2polynome ele2pui elem elementp elevation_grid elim elim_allbut eliminate eliminate_using ellipse elliptic_e elliptic_ec elliptic_eu elliptic_f elliptic_kc elliptic_pi ematrix empty_graph emptyp endcons entermatrix entertensor entier equal equalp equiv_classes erf erfc erf_generalized erfi errcatch error errormsg errors euler ev eval_string evenp every evolution evolution2d evundiff example exp expand expandwrt expandwrt_factored expint expintegral_chi expintegral_ci expintegral_e expintegral_e1 expintegral_ei expintegral_e_simplify expintegral_li expintegral_shi expintegral_si explicit explose exponentialize express expt exsec extdiff extract_linear_equations extremal_subset ezgcd %f f90 facsum factcomb factor factorfacsum factorial factorout factorsum facts fast_central_elements fast_linsolve fasttimes featurep fernfale fft fib fibtophi fifth filename_merge file_search file_type fillarray findde find_root find_root_abs find_root_error find_root_rel first fix flatten flength float floatnump floor flower_snark flush flush1deriv flushd flushnd flush_output fmin_cobyla forget fortran fourcos fourexpand fourier fourier_elim fourint fourintcos fourintsin foursimp foursin fourth fposition frame_bracket freeof freshline fresnel_c fresnel_s from_adjacency_matrix frucht_graph full_listify fullmap fullmapl fullratsimp fullratsubst fullsetify funcsolve fundamental_dimensions fundamental_units fundef funmake funp fv g0 g1 gamma gamma_greek gamma_incomplete gamma_incomplete_generalized gamma_incomplete_regularized gauss gauss_a gauss_b gaussprob gcd gcdex gcdivide gcfac gcfactor gd generalized_lambert_w genfact gen_laguerre genmatrix gensym geo_amortization geo_annuity_fv geo_annuity_pv geomap geometric geometric_mean geosum get getcurrentdirectory get_edge_weight getenv get_lu_factors get_output_stream_string get_pixel get_plot_option get_tex_environment get_tex_environment_default get_vertex_label gfactor gfactorsum ggf girth global_variances gn gnuplot_close gnuplot_replot gnuplot_reset gnuplot_restart gnuplot_start go Gosper GosperSum gr2d gr3d gradef gramschmidt graph6_decode graph6_encode graph6_export graph6_import graph_center graph_charpoly graph_eigenvalues graph_flow graph_order graph_periphery graph_product graph_size graph_union great_rhombicosidodecahedron_graph great_rhombicuboctahedron_graph grid_graph grind grobner_basis grotzch_graph hamilton_cycle hamilton_path hankel hankel_1 hankel_2 harmonic harmonic_mean hav heawood_graph hermite hessian hgfred hilbertmap hilbert_matrix hipow histogram histogram_description hodge horner hypergeometric i0 i1 %ibes ic1 ic2 ic_convert ichr1 ichr2 icosahedron_graph icosidodecahedron_graph icurvature ident identfor identity idiff idim idummy ieqn %if ifactors iframes ifs igcdex igeodesic_coords ilt image imagpart imetric implicit implicit_derivative implicit_plot indexed_tensor indices induced_subgraph inferencep inference_result infix info_display init_atensor init_ctensor in_neighbors innerproduct inpart inprod inrt integerp integer_partitions integrate intersect intersection intervalp intopois intosum invariant1 invariant2 inverse_fft inverse_jacobi_cd inverse_jacobi_cn inverse_jacobi_cs inverse_jacobi_dc inverse_jacobi_dn inverse_jacobi_ds inverse_jacobi_nc inverse_jacobi_nd inverse_jacobi_ns inverse_jacobi_sc inverse_jacobi_sd inverse_jacobi_sn invert invert_by_adjoint invert_by_lu inv_mod irr is is_biconnected is_bipartite is_connected is_digraph is_edge_in_graph is_graph is_graph_or_digraph ishow is_isomorphic isolate isomorphism is_planar isqrt isreal_p is_sconnected is_tree is_vertex_in_graph items_inference %j j0 j1 jacobi jacobian jacobi_cd jacobi_cn jacobi_cs jacobi_dc jacobi_dn jacobi_ds jacobi_nc jacobi_nd jacobi_ns jacobi_p jacobi_sc jacobi_sd jacobi_sn JF jn join jordan julia julia_set julia_sin %k kdels kdelta kill killcontext kostka kron_delta kronecker_product kummer_m kummer_u kurtosis kurtosis_bernoulli kurtosis_beta kurtosis_binomial kurtosis_chi2 kurtosis_continuous_uniform kurtosis_discrete_uniform kurtosis_exp kurtosis_f kurtosis_gamma kurtosis_general_finite_discrete kurtosis_geometric kurtosis_gumbel kurtosis_hypergeometric kurtosis_laplace kurtosis_logistic kurtosis_lognormal kurtosis_negative_binomial kurtosis_noncentral_chi2 kurtosis_noncentral_student_t kurtosis_normal kurtosis_pareto kurtosis_poisson kurtosis_rayleigh kurtosis_student_t kurtosis_weibull label labels lagrange laguerre lambda lambert_w laplace laplacian_matrix last lbfgs lc2kdt lcharp lc_l lcm lc_u ldefint ldisp ldisplay legendre_p legendre_q leinstein length let letrules letsimp levi_civita lfreeof lgtreillis lhs li liediff limit Lindstedt linear linearinterpol linear_program linear_regression line_graph linsolve listarray list_correlations listify list_matrix_entries list_nc_monomials listoftens listofvars listp lmax lmin load loadfile local locate_matrix_entry log logcontract log_gamma lopow lorentz_gauge lowercasep lpart lratsubst lreduce lriemann lsquares_estimates lsquares_estimates_approximate lsquares_estimates_exact lsquares_mse lsquares_residual_mse lsquares_residuals lsum ltreillis lu_backsub lucas lu_factor %m macroexpand macroexpand1 make_array makebox makefact makegamma make_graph make_level_picture makelist makeOrders make_poly_continent make_poly_country make_polygon make_random_state make_rgb_picture makeset make_string_input_stream make_string_output_stream make_transform mandelbrot mandelbrot_set map mapatom maplist matchdeclare matchfix mat_cond mat_fullunblocker mat_function mathml_display mat_norm matrix matrixmap matrixp matrix_size mattrace mat_trace mat_unblocker max max_clique max_degree max_flow maximize_lp max_independent_set max_matching maybe md5sum mean mean_bernoulli mean_beta mean_binomial mean_chi2 mean_continuous_uniform mean_deviation mean_discrete_uniform mean_exp mean_f mean_gamma mean_general_finite_discrete mean_geometric mean_gumbel mean_hypergeometric mean_laplace mean_logistic mean_lognormal mean_negative_binomial mean_noncentral_chi2 mean_noncentral_student_t mean_normal mean_pareto mean_poisson mean_rayleigh mean_student_t mean_weibull median median_deviation member mesh metricexpandall mgf1_sha1 min min_degree min_edge_cut minfactorial minimalPoly minimize_lp minimum_spanning_tree minor minpack_lsquares minpack_solve min_vertex_cover min_vertex_cut mkdir mnewton mod mode_declare mode_identity ModeMatrix moebius mon2schur mono monomial_dimensions multibernstein_poly multi_display_for_texinfo multi_elem multinomial multinomial_coeff multi_orbit multiplot_mode multi_pui multsym multthru mycielski_graph nary natural_unit nc_degree ncexpt ncharpoly negative_picture neighbors new newcontext newdet new_graph newline newton new_variable next_prime nicedummies niceindices ninth nofix nonarray noncentral_moment nonmetricity nonnegintegerp nonscalarp nonzeroandfreeof notequal nounify nptetrad npv nroots nterms ntermst nthroot nullity nullspace num numbered_boundaries numberp number_to_octets num_distinct_partitions numerval numfactor num_partitions nusum nzeta nzetai nzetar octets_to_number octets_to_oid odd_girth oddp ode2 ode_check odelin oid_to_octets op opena opena_binary openr openr_binary openw openw_binary operatorp opsubst optimize %or orbit orbits ordergreat ordergreatp orderless orderlessp orthogonal_complement orthopoly_recur orthopoly_weight outermap out_neighbors outofpois pade parabolic_cylinder_d parametric parametric_surface parg parGosper parse_string parse_timedate part part2cont partfrac partition partition_set partpol path_digraph path_graph pathname_directory pathname_name pathname_type pdf_bernoulli pdf_beta pdf_binomial pdf_cauchy pdf_chi2 pdf_continuous_uniform pdf_discrete_uniform pdf_exp pdf_f pdf_gamma pdf_general_finite_discrete pdf_geometric pdf_gumbel pdf_hypergeometric pdf_laplace pdf_logistic pdf_lognormal pdf_negative_binomial pdf_noncentral_chi2 pdf_noncentral_student_t pdf_normal pdf_pareto pdf_poisson pdf_rank_sum pdf_rayleigh pdf_signed_rank pdf_student_t pdf_weibull pearson_skewness permanent permut permutation permutations petersen_graph petrov pickapart picture_equalp picturep piechart piechart_description planar_embedding playback plog plot2d plot3d plotdf ploteq plsquares pochhammer points poisdiff poisexpt poisint poismap poisplus poissimp poissubst poistimes poistrim polar polarform polartorect polar_to_xy poly_add poly_buchberger poly_buchberger_criterion poly_colon_ideal poly_content polydecomp poly_depends_p poly_elimination_ideal poly_exact_divide poly_expand poly_expt poly_gcd polygon poly_grobner poly_grobner_equal poly_grobner_member poly_grobner_subsetp poly_ideal_intersection poly_ideal_polysaturation poly_ideal_polysaturation1 poly_ideal_saturation poly_ideal_saturation1 poly_lcm poly_minimization polymod poly_multiply polynome2ele polynomialp poly_normal_form poly_normalize poly_normalize_list poly_polysaturation_extension poly_primitive_part poly_pseudo_divide poly_reduced_grobner poly_reduction poly_saturation_extension poly_s_polynomial poly_subtract polytocompanion pop postfix potential power_mod powerseries powerset prefix prev_prime primep primes principal_components print printf printfile print_graph printpois printprops prodrac product properties propvars psi psubst ptriangularize pui pui2comp pui2ele pui2polynome pui_direct puireduc push put pv qput qrange qty quad_control quad_qag quad_qagi quad_qagp quad_qags quad_qawc quad_qawf quad_qawo quad_qaws quadrilateral quantile quantile_bernoulli quantile_beta quantile_binomial quantile_cauchy quantile_chi2 quantile_continuous_uniform quantile_discrete_uniform quantile_exp quantile_f quantile_gamma quantile_general_finite_discrete quantile_geometric quantile_gumbel quantile_hypergeometric quantile_laplace quantile_logistic quantile_lognormal quantile_negative_binomial quantile_noncentral_chi2 quantile_noncentral_student_t quantile_normal quantile_pareto quantile_poisson quantile_rayleigh quantile_student_t quantile_weibull quartile_skewness quit qunit quotient racah_v racah_w radcan radius random random_bernoulli random_beta random_binomial random_bipartite_graph random_cauchy random_chi2 random_continuous_uniform random_digraph random_discrete_uniform random_exp random_f random_gamma random_general_finite_discrete random_geometric random_graph random_graph1 random_gumbel random_hypergeometric random_laplace random_logistic random_lognormal random_negative_binomial random_network random_noncentral_chi2 random_noncentral_student_t random_normal random_pareto random_permutation random_poisson random_rayleigh random_regular_graph random_student_t random_tournament random_tree random_weibull range rank rat ratcoef ratdenom ratdiff ratdisrep ratexpand ratinterpol rational rationalize ratnumer ratnump ratp ratsimp ratsubst ratvars ratweight read read_array read_binary_array read_binary_list read_binary_matrix readbyte readchar read_hashed_array readline read_list read_matrix read_nested_list readonly read_xpm real_imagpart_to_conjugate realpart realroots rearray rectangle rectform rectform_log_if_constant recttopolar rediff reduce_consts reduce_order region region_boundaries region_boundaries_plus rem remainder remarray rembox remcomps remcon remcoord remfun remfunction remlet remove remove_constvalue remove_dimensions remove_edge remove_fundamental_dimensions remove_fundamental_units remove_plot_option remove_vertex rempart remrule remsym remvalue rename rename_file reset reset_displays residue resolvante resolvante_alternee1 resolvante_bipartite resolvante_diedrale resolvante_klein resolvante_klein3 resolvante_produit_sym resolvante_unitaire resolvante_vierer rest resultant return reveal reverse revert revert2 rgb2level rhs ricci riemann rinvariant risch rk rmdir rncombine romberg room rootscontract round row rowop rowswap rreduce run_testsuite %s save saving scalarp scaled_bessel_i scaled_bessel_i0 scaled_bessel_i1 scalefactors scanmap scatterplot scatterplot_description scene schur2comp sconcat scopy scsimp scurvature sdowncase sec sech second sequal sequalignore set_alt_display setdifference set_draw_defaults set_edge_weight setelmx setequalp setify setp set_partitions set_plot_option set_prompt set_random_state set_tex_environment set_tex_environment_default setunits setup_autoload set_up_dot_simplifications set_vertex_label seventh sexplode sf sha1sum sha256sum shortest_path shortest_weighted_path show showcomps showratvars sierpinskiale sierpinskimap sign signum similaritytransform simp_inequality simplify_sum simplode simpmetderiv simtran sin sinh sinsert sinvertcase sixth skewness skewness_bernoulli skewness_beta skewness_binomial skewness_chi2 skewness_continuous_uniform skewness_discrete_uniform skewness_exp skewness_f skewness_gamma skewness_general_finite_discrete skewness_geometric skewness_gumbel skewness_hypergeometric skewness_laplace skewness_logistic skewness_lognormal skewness_negative_binomial skewness_noncentral_chi2 skewness_noncentral_student_t skewness_normal skewness_pareto skewness_poisson skewness_rayleigh skewness_student_t skewness_weibull slength smake small_rhombicosidodecahedron_graph small_rhombicuboctahedron_graph smax smin smismatch snowmap snub_cube_graph snub_dodecahedron_graph solve solve_rec solve_rec_rat some somrac sort sparse6_decode sparse6_encode sparse6_export sparse6_import specint spherical spherical_bessel_j spherical_bessel_y spherical_hankel1 spherical_hankel2 spherical_harmonic spherical_to_xyz splice split sposition sprint sqfr sqrt sqrtdenest sremove sremovefirst sreverse ssearch ssort sstatus ssubst ssubstfirst staircase standardize standardize_inverse_trig starplot starplot_description status std std1 std_bernoulli std_beta std_binomial std_chi2 std_continuous_uniform std_discrete_uniform std_exp std_f std_gamma std_general_finite_discrete std_geometric std_gumbel std_hypergeometric std_laplace std_logistic std_lognormal std_negative_binomial std_noncentral_chi2 std_noncentral_student_t std_normal std_pareto std_poisson std_rayleigh std_student_t std_weibull stemplot stirling stirling1 stirling2 strim striml strimr string stringout stringp strong_components struve_h struve_l sublis sublist sublist_indices submatrix subsample subset subsetp subst substinpart subst_parallel substpart substring subvar subvarp sum sumcontract summand_to_rec supcase supcontext symbolp symmdifference symmetricp system take_channel take_inference tan tanh taylor taylorinfo taylorp taylor_simplifier taytorat tcl_output tcontract tellrat tellsimp tellsimpafter tentex tenth test_mean test_means_difference test_normality test_proportion test_proportions_difference test_rank_sum test_sign test_signed_rank test_variance test_variance_ratio tex tex1 tex_display texput %th third throw time timedate timer timer_info tldefint tlimit todd_coxeter toeplitz tokens to_lisp topological_sort to_poly to_poly_solve totaldisrep totalfourier totient tpartpol trace tracematrix trace_options transform_sample translate translate_file transpose treefale tree_reduce treillis treinat triangle triangularize trigexpand trigrat trigreduce trigsimp trunc truncate truncated_cube_graph truncated_dodecahedron_graph truncated_icosahedron_graph truncated_tetrahedron_graph tr_warnings_get tube tutte_graph ueivects uforget ultraspherical underlying_graph undiff union unique uniteigenvectors unitp units unit_step unitvector unorder unsum untellrat untimer untrace uppercasep uricci uriemann uvect vandermonde_matrix var var1 var_bernoulli var_beta var_binomial var_chi2 var_continuous_uniform var_discrete_uniform var_exp var_f var_gamma var_general_finite_discrete var_geometric var_gumbel var_hypergeometric var_laplace var_logistic var_lognormal var_negative_binomial var_noncentral_chi2 var_noncentral_student_t var_normal var_pareto var_poisson var_rayleigh var_student_t var_weibull vector vectorpotential vectorsimp verbify vers vertex_coloring vertex_connectivity vertex_degree vertex_distance vertex_eccentricity vertex_in_degree vertex_out_degree vertices vertices_to_cycle vertices_to_path %w weyl wheel_graph wiener_index wigner_3j wigner_6j wigner_9j with_stdout write_binary_data writebyte write_data writefile wronskian xreduce xthru %y Zeilberger zeroequiv zerofor zeromatrix zeromatrixp zeta zgeev zheev zlange zn_add_table zn_carmichael_lambda zn_characteristic_factors zn_determinant zn_factor_generators zn_invert_by_lu zn_log zn_mult_table absboxchar activecontexts adapt_depth additive adim aform algebraic algepsilon algexact aliases allbut all_dotsimp_denoms allocation allsym alphabetic animation antisymmetric arrays askexp assume_pos assume_pos_pred assumescalar asymbol atomgrad atrig1 axes axis_3d axis_bottom axis_left axis_right axis_top azimuth background background_color backsubst berlefact bernstein_explicit besselexpand beta_args_sum_to_integer beta_expand bftorat bftrunc bindtest border boundaries_array box boxchar breakup %src capping cauchysum cbrange cbtics center cflength cframe_flag cnonmet_flag color color_bar color_bar_tics colorbox columns commutative complex cone context contexts contour contour_levels cosnpiflag ctaypov ctaypt ctayswitch ctayvar ct_coords ctorsion_flag ctrgsimp cube current_let_rule_package cylinder data_file_name debugmode decreasing default_let_rule_package delay dependencies derivabbrev derivsubst detout diagmetric diff dim dimensions dispflag display2d|10 display_format_internal distribute_over doallmxops domain domxexpt domxmxops domxnctimes dontfactor doscmxops doscmxplus dot0nscsimp dot0simp dot1simp dotassoc dotconstrules dotdistrib dotexptsimp dotident dotscrules draw_graph_program draw_realpart edge_color edge_coloring edge_partition edge_type edge_width %edispflag elevation %emode endphi endtheta engineering_format_floats enhanced3d %enumer epsilon_lp erfflag erf_representation errormsg error_size error_syms error_type %e_to_numlog eval even evenfun evflag evfun ev_point expandwrt_denom expintexpand expintrep expon expop exptdispflag exptisolate exptsubst facexpand facsum_combine factlim factorflag factorial_expand factors_only fb feature features file_name file_output_append file_search_demo file_search_lisp file_search_maxima|10 file_search_tests file_search_usage file_type_lisp file_type_maxima|10 fill_color fill_density filled_func fixed_vertices flipflag float2bf font font_size fortindent fortspaces fpprec fpprintprec functions gamma_expand gammalim gdet genindex gensumnum GGFCFMAX GGFINFINITY globalsolve gnuplot_command gnuplot_curve_styles gnuplot_curve_titles gnuplot_default_term_command gnuplot_dumb_term_command gnuplot_file_args gnuplot_file_name gnuplot_out_file gnuplot_pdf_term_command gnuplot_pm3d gnuplot_png_term_command gnuplot_postamble gnuplot_preamble gnuplot_ps_term_command gnuplot_svg_term_command gnuplot_term gnuplot_view_args Gosper_in_Zeilberger gradefs grid grid2d grind halfangles head_angle head_both head_length head_type height hypergeometric_representation %iargs ibase icc1 icc2 icounter idummyx ieqnprint ifb ifc1 ifc2 ifg ifgi ifr iframe_bracket_form ifri igeowedge_flag ikt1 ikt2 imaginary inchar increasing infeval infinity inflag infolists inm inmc1 inmc2 intanalysis integer integervalued integrate_use_rootsof integration_constant integration_constant_counter interpolate_color intfaclim ip_grid ip_grid_in irrational isolate_wrt_times iterations itr julia_parameter %k1 %k2 keepfloat key key_pos kinvariant kt label label_alignment label_orientation labels lassociative lbfgs_ncorrections lbfgs_nfeval_max leftjust legend letrat let_rule_packages lfg lg lhospitallim limsubst linear linear_solver linechar linel|10 linenum line_type linewidth line_width linsolve_params linsolvewarn lispdisp listarith listconstvars listdummyvars lmxchar load_pathname loadprint logabs logarc logcb logconcoeffp logexpand lognegint logsimp logx logx_secondary logy logy_secondary logz lriem m1pbranch macroexpansion macros mainvar manual_demo maperror mapprint matrix_element_add matrix_element_mult matrix_element_transpose maxapplydepth maxapplyheight maxima_tempdir|10 maxima_userdir|10 maxnegex MAX_ORD maxposex maxpsifracdenom maxpsifracnum maxpsinegint maxpsiposint maxtayorder mesh_lines_color method mod_big_prime mode_check_errorp mode_checkp mode_check_warnp mod_test mod_threshold modular_linear_solver modulus multiplicative multiplicities myoptions nary negdistrib negsumdispflag newline newtonepsilon newtonmaxiter nextlayerfactor niceindicespref nm nmc noeval nolabels nonegative_lp noninteger nonscalar noun noundisp nouns np npi nticks ntrig numer numer_pbranch obase odd oddfun opacity opproperties opsubst optimprefix optionset orientation origin orthopoly_returns_intervals outative outchar packagefile palette partswitch pdf_file pfeformat phiresolution %piargs piece pivot_count_sx pivot_max_sx plot_format plot_options plot_realpart png_file pochhammer_max_index points pointsize point_size points_joined point_type poislim poisson poly_coefficient_ring poly_elimination_order polyfactor poly_grobner_algorithm poly_grobner_debug poly_monomial_order poly_primary_elimination_order poly_return_term_list poly_secondary_elimination_order poly_top_reduction_only posfun position powerdisp pred prederror primep_number_of_tests product_use_gamma program programmode promote_float_to_bigfloat prompt proportional_axes props psexpand ps_file radexpand radius radsubstflag rassociative ratalgdenom ratchristof ratdenomdivide rateinstein ratepsilon ratfac rational ratmx ratprint ratriemann ratsimpexpons ratvarswitch ratweights ratweyl ratwtlvl real realonly redraw refcheck resolution restart resultant ric riem rmxchar %rnum_list rombergabs rombergit rombergmin rombergtol rootsconmode rootsepsilon run_viewer same_xy same_xyz savedef savefactors scalar scalarmatrixp scale scale_lp setcheck setcheckbreak setval show_edge_color show_edges show_edge_type show_edge_width show_id show_label showtime show_vertex_color show_vertex_size show_vertex_type show_vertices show_weight simp simplified_output simplify_products simpproduct simpsum sinnpiflag solvedecomposes solveexplicit solvefactors solvenullwarn solveradcan solvetrigwarn space sparse sphere spring_embedding_depth sqrtdispflag stardisp startphi starttheta stats_numer stringdisp structures style sublis_apply_lambda subnumsimp sumexpand sumsplitfact surface surface_hide svg_file symmetric tab taylordepth taylor_logexpand taylor_order_coefficients taylor_truncate_polynomials tensorkill terminal testsuite_files thetaresolution timer_devalue title tlimswitch tr track transcompile transform transform_xy translate_fast_arrays transparent transrun tr_array_as_ref tr_bound_function_applyp tr_file_tty_messagesp tr_float_can_branch_complex tr_function_call_default trigexpandplus trigexpandtimes triginverses trigsign trivial_solutions tr_numer tr_optimize_max_loop tr_semicompile tr_state_vars tr_warn_bad_function_calls tr_warn_fexpr tr_warn_meval tr_warn_mode tr_warn_undeclared tr_warn_undefined_variable tstep ttyoff tube_extremes ufg ug %unitexpand unit_vectors uric uriem use_fast_arrays user_preamble usersetunits values vect_cross verbose vertex_color vertex_coloring vertex_partition vertex_size vertex_type view warnings weyl width windowname windowtitle wired_surface wireframe xaxis xaxis_color xaxis_secondary xaxis_type xaxis_width xlabel xlabel_secondary xlength xrange xrange_secondary xtics xtics_axis xtics_rotate xtics_rotate_secondary xtics_secondary xtics_secondary_axis xu_grid x_voxel xy_file xyplane xy_scale yaxis yaxis_color yaxis_secondary yaxis_type yaxis_width ylabel ylabel_secondary ylength yrange yrange_secondary ytics ytics_axis ytics_rotate ytics_rotate_secondary ytics_secondary ytics_secondary_axis yv_grid y_voxel yx_ratio zaxis zaxis_color zaxis_type zaxis_width zeroa zerob zerobern zeta%pi zlabel zlabel_rotate zlength zmin zn_primroot_limit zn_primroot_pretest", symbol:"_ __ %|0 %%|0"},contains:[{className:"comment",begin:"/\\*",end:"\\*/", contains:["self"]},e.QUOTE_STRING_MODE,{className:"number",relevance:0, variants:[{begin:"\\b(\\d+|\\d+\\.|\\.\\d+|\\d+\\.\\d+)[Ee][-+]?\\d+\\b"},{ @@ -2235,7 +2235,7 @@ case_insensitive:!0,aliases:["mips"],keywords:{$pattern:"\\.?"+e.IDENT_RE, meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .ltorg ", built_in:"$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31 zero at v0 v1 a0 a1 a2 a3 a4 a5 a6 a7 t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 s0 s1 s2 s3 s4 s5 s6 s7 s8 k0 k1 gp sp fp ra $f0 $f1 $f2 $f2 $f4 $f5 $f6 $f7 $f8 $f9 $f10 $f11 $f12 $f13 $f14 $f15 $f16 $f17 $f18 $f19 $f20 $f21 $f22 $f23 $f24 $f25 $f26 $f27 $f28 $f29 $f30 $f31 Context Random EntryLo0 EntryLo1 Context PageMask Wired EntryHi HWREna BadVAddr Count Compare SR IntCtl SRSCtl SRSMap Cause EPC PRId EBase Config Config1 Config2 Config3 LLAddr Debug DEPC DESAVE CacheErr ECC ErrorEPC TagLo DataLo TagHi DataHi WatchLo WatchHi PerfCtl PerfCnt " },contains:[{className:"keyword", -begin:"\\b(addi?u?|andi?|b(al)?|beql?|bgez(al)?l?|bgtzl?|blezl?|bltz(al)?l?|bnel?|cl[oz]|divu?|ext|ins|j(al)?|jalr(\\.hb)?|jr(\\.hb)?|lbu?|lhu?|ll|lui|lw[lr]?|maddu?|mfhi|mflo|movn|movz|move|msubu?|mthi|mtlo|mul|multu?|nop|nor|ori?|rotrv?|sb|sc|se[bh]|sh|sllv?|slti?u?|srav?|srlv?|subu?|sw[lr]?|xori?|wsbh|abs\\.[sd]|add\\.[sd]|alnv.ps|bc1[ft]l?|c\\.(s?f|un|u?eq|[ou]lt|[ou]le|ngle?|seq|l[et]|ng[et])\\.[sd]|(ceil|floor|round|trunc)\\.[lw]\\.[sd]|cfc1|cvt\\.d\\.[lsw]|cvt\\.l\\.[dsw]|cvt\\.ps\\.s|cvt\\.s\\.[dlw]|cvt\\.s\\.p[lu]|cvt\\.w\\.[dls]|div\\.[ds]|ldx?c1|luxc1|lwx?c1|madd\\.[sd]|mfc1|mov[fntz]?\\.[ds]|msub\\.[sd]|mth?c1|mul\\.[ds]|neg\\.[ds]|nmadd\\.[ds]|nmsub\\.[ds]|p[lu][lu]\\.ps|recip\\.fmt|r?sqrt\\.[ds]|sdx?c1|sub\\.[ds]|suxc1|swx?c1|break|cache|d?eret|[de]i|ehb|mfc0|mtc0|pause|prefx?|rdhwr|rdpgpr|sdbbp|ssnop|synci?|syscall|teqi?|tgei?u?|tlb(p|r|w[ir])|tlti?u?|tnei?|wait|wrpgpr)", +begin:"\\b(addi?u?|andi?|b(al)?|beql?|bgez(al)?l?|bgtzl?|blezl?|bltz(al)?l?|bnel?|cl[oz]|divu?|ext|ins|j(al)?|jalr(\\.hb)?|jr(\\.hb)?|lbu?|lhu?|ll|lui|lw[lr]?|maddu?|mfhi|mflo|movn|movz|move|msubu?|mthi|mtlo|mul|multu?|nop|nor|ori?|rotrv?|sb|sc|se[bh]|sh|sllv?|slti?u?|srav?|srlv?|subu?|sw[lr]?|xori?|wsbh|abs\\.[sd]|add\\.[sd]|alnv.ps|bc1[ft]l?|src\\.(s?f|un|u?eq|[ou]lt|[ou]le|ngle?|seq|l[et]|ng[et])\\.[sd]|(ceil|floor|round|trunc)\\.[lw]\\.[sd]|cfc1|cvt\\.d\\.[lsw]|cvt\\.l\\.[dsw]|cvt\\.ps\\.s|cvt\\.s\\.[dlw]|cvt\\.s\\.p[lu]|cvt\\.w\\.[dls]|div\\.[ds]|ldx?c1|luxc1|lwx?c1|madd\\.[sd]|mfc1|mov[fntz]?\\.[ds]|msub\\.[sd]|mth?c1|mul\\.[ds]|neg\\.[ds]|nmadd\\.[ds]|nmsub\\.[ds]|p[lu][lu]\\.ps|recip\\.fmt|r?sqrt\\.[ds]|sdx?c1|sub\\.[ds]|suxc1|swx?c1|break|cache|d?eret|[de]i|ehb|mfc0|mtc0|pause|prefx?|rdhwr|rdpgpr|sdbbp|ssnop|synci?|syscall|teqi?|tgei?u?|tlb(p|r|w[ir])|tlti?u?|tnei?|wait|wrpgpr)", end:"\\s" },e.COMMENT("[;#](?!\\s*$)","$"),e.C_BLOCK_COMMENT_MODE,e.QUOTE_STRING_MODE,{ className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title", @@ -2377,7 +2377,7 @@ beginKeywords:"Function PageEx Section SectionGroup FunctionEnd SectionEnd" (()=>{var e=(()=>{"use strict";return e=>{const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={ $pattern:n,keyword:["@interface","@class","@protocol","@implementation"]} ;return{name:"Objective-C", -aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:{ +aliases:["mm","objc","obj-src","obj-src++","objective-src++"],keywords:{ "variable.language":["this","super"],$pattern:n, keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], @@ -2834,7 +2834,7 @@ const a=e.regex,n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,i=a.eit ;return{name:"R",keywords:{$pattern:n, keyword:"function if in break next repeat else for while", literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", -built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser src call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" },contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, starts:{end:a.lookahead(a.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ @@ -3299,7 +3299,7 @@ function t(...a){return a.map((a=>e(a))).join("")}function n(...a){const t=(e=>{ const a=e[e.length-1] ;return"object"==typeof a&&a.constructor===Object?(e.splice(e.length-1,1),a):{} })(a);return"("+(t.capture?"":"?:")+a.map((a=>e(a))).join("|")+")"} -const i=e=>t(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],p=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],d=n(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=n(d,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=t(d,F,"*"),h=n(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=n(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=t(h,f,"*"),y=t(/[A-Z]/,f,"*"),g=["autoclosure",t(/convention\(/,n("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",t(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +const i=e=>t(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],p=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],d=n(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=n(d,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=t(d,F,"*"),h=n(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=n(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=t(h,f,"*"),y=t(/[A-Z]/,f,"*"),g=["autoclosure",t(/convention\(/,n("swift","block","src"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",t(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] ;return e=>{const d={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],A={match:[/\./,n(...s,...u)], className:{2:"keyword"}},N={match:t(/\./,n(...r)),relevance:0 @@ -3593,7 +3593,7 @@ className:"symbol",begin:"'[A-Za-z](_?[A-Za-z0-9])*", contains:[e.BACKSLASH_ESCAPE]}]}}})();hljs.registerLanguage("vhdl",e)})();/*! `vim` grammar compiled for Highlight.js 11.8.0 */ (()=>{var e=(()=>{"use strict";return e=>({name:"Vim Script",keywords:{ $pattern:/[!#@\w]+/, -keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank", +keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw src|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank", built_in:"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp" },illegal:/;/,contains:[e.NUMBER_MODE,{className:"string",begin:"'",end:"'", illegal:"\\n"},{className:"string",begin:/"(\\"|\n\\|[^"\n])*"/ @@ -3733,4 +3733,4 @@ contains:["self",e.C_BLOCK_COMMENT_MODE,n,s]}]},{className:"class", beginKeywords:"class interface",end:/\{/,excludeEnd:!0,illegal:/[:($"]/, contains:[{beginKeywords:"extends implements"},a]},{beginKeywords:"namespace", end:/;/,illegal:/[.']/,contains:[a]},{beginKeywords:"use",end:/;/,contains:[a] -},{begin:/=>/},n,s]}}})();hljs.registerLanguage("zephir",e)})(); \ No newline at end of file +},{begin:/=>/},n,s]}}})();hljs.registerLanguage("zephir",e)})(); diff --git a/dev-env-template/etc.template/group.template b/dev-env-template/etc.template/group.template new file mode 100644 index 00000000..e50338a7 --- /dev/null +++ b/dev-env-template/etc.template/group.template @@ -0,0 +1,2 @@ +root:x:0: +${USER}:x:${GID}: diff --git a/dev-env-template/etc.template/passwd.template b/dev-env-template/etc.template/passwd.template new file mode 100644 index 00000000..1f10405e --- /dev/null +++ b/dev-env-template/etc.template/passwd.template @@ -0,0 +1,2 @@ +root:x:0:0::/root:/bin/bash +${USER}:x:${UID}:${GID}::/home/${USER}:/bin/bash diff --git a/dpdk-sys/Cargo.toml b/dpdk-sys/Cargo.toml index 57360262..db912aa9 100644 --- a/dpdk-sys/Cargo.toml +++ b/dpdk-sys/Cargo.toml @@ -3,8 +3,9 @@ name = "dpdk-sys" version = "0.0.1" edition = "2021" description = "Low-level bindings to the Data Plane Development Kit (DPDK)" +publish = false [build-dependencies] bindgen = { workspace = true, features = ["runtime"] } -cc = { workspace = true } doxygen-rs = { workspace = true } +dpdk-sysroot-helper = { path = "../dpdk-sysroot-helper", version = "0.0.1" } diff --git a/dpdk-sys/build.rs b/dpdk-sys/build.rs index 2f7b687d..56a3ed82 100644 --- a/dpdk-sys/build.rs +++ b/dpdk-sys/build.rs @@ -1,7 +1,7 @@ use std::env; -use std::path::{Path, PathBuf}; use bindgen::callbacks::ParseCallbacks; +use std::path::{Path, PathBuf}; #[derive(Debug)] struct Cb; @@ -10,24 +10,20 @@ impl ParseCallbacks for Cb { fn process_comment(&self, comment: &str) -> Option { match doxygen_rs::generator::rustdoc(comment.into()) { Ok(transformed) => Some(transformed), - Err(_) => { - // eprintln!("Error transforming comment: {:?}", err); - Some(comment.into()) - } + Err(_) => Some(comment.into()), } } } -fn bind(path: &Path) { +fn bind(path: &Path, sysroot: &str) { bindgen::Builder::default() - .header("c/wrapper.h") + .header(format!("{sysroot}/include/dpdk_wrapper.h")) .anon_fields_prefix("annon") .generate_comments(true) .generate_inline_functions(false) .generate_block(true) .array_pointers_in_arguments(false) .detect_include_paths(true) - // .enable_function_attribute_detection() .prepend_enum_name(false) .translate_enum_integer_types(false) .generate_cstr(true) @@ -36,17 +32,36 @@ fn bind(path: &Path) { .derive_default(true) .derive_partialeq(true) .parse_callbacks(Box::new(Cb)) + .layout_tests(true) .default_enum_style(bindgen::EnumVariation::ModuleConsts) - // .bitfield_enum("rte_eth_tx_offload") .allowlist_item("rte.*") .allowlist_item("wrte_.*") .allowlist_item("RTE.*") .blocklist_item("__*") + .clang_macro_fallback() + + // Bindgen tests seem to object to the documentation in the following + // (not the items themselves, just the documentation associated with them) + // I suspect this is a bug in bindgen, but I'm not sure. + // I don't have any reason to think we need any of these functions and I'd + // rather have the doc comments on for the rest of the project + .blocklist_type("rte_bus_cmp_t") + .blocklist_type("rte_class_cmp_t") + .blocklist_function("rte_bus_find") + .blocklist_function("rte_bus_probe") + .blocklist_function("rte_class_find") + .blocklist_function("rte_dev_dma_map") + .blocklist_function("rte_dev_dma_unmap") + .blocklist_function("rte_pci_addr_cmp") + .blocklist_function("rte_pci_addr_parse") + + // rustc doesn't like repr(packed) types which contain other repr(packed) types .opaque_type("rte_arp_hdr") .opaque_type("rte_arp_ipv4") .opaque_type("rte_gtp_psc_generic_hdr") .opaque_type("rte_l2tpv2_combined_msg_hdr") - .clang_arg("-Isysroot/usr/include") + + .clang_arg(format!("-I{sysroot}/include")) .clang_arg("-fretain-comments-from-system-headers") .clang_arg("-fparse-all-comments") .clang_arg("-march=native") @@ -57,99 +72,52 @@ fn bind(path: &Path) { } fn main() { + let sysroot = dpdk_sysroot_helper::get_sysroot(); - env::set_var("CC", "clang"); - env::set_var("CXX", "clang++"); - env::set_var("AR", "llvm-ar"); - env::set_var("LD", "rust-lld"); - - - let outputs = cc::Build::new() - .file("c/wrapper.c") - .include("c") - .include("sysroot/usr/include") - .cargo_output(false) - .cargo_debug(false) - .flag("-Wno-deprecated-declarations") - .flag("-O3") - .flag("-flto=thin") - .compile_intermediates(); - - std::process::Command::new("llvm-ar") - .args(["r", "libdpdk_wrapper.a", outputs[0].to_str().unwrap()]) - .output() - .expect("failed to archive wrapper"); - - std::process::Command::new("mv") - .args(["libdpdk_wrapper.a", "sysroot/usr/lib"]) - .output() - .expect("failed to move wrapper"); - - // std::process::Command::new("mv") - // .args(["libdpdk_wrapper.a", "/usr/lib"]) - // .output() - // .expect("failed to move wrapper"); - - println!("cargo:rustc-link-search=native=dpdk-sys/sysroot/usr/lib"); - // println!("cargo:rustc-link-search=native=/usr/lib"); + println!("cargo:rustc-link-arg=--sysroot={sysroot}"); + println!("cargo:rustc-link-search=all={sysroot}/lib"); // NOTE: DPDK absolutely requires whole-archive in the linking command. // While I find this very questionable, it is what it is. // It is just more work for the LTO later on I suppose ¯\_(ツ)_/¯ - println!("cargo:rustc-link-lib=static:+whole-archive=dpdk_wrapper"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_net_mlx5"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_common_mlx5"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_ethdev"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_bus_auxiliary"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_net"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_bus_pci"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_pci"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_mbuf"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_mempool_ring"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_mempool"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_hash"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_rcu"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_ring"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_eal"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_kvargs"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_telemetry"); - println!("cargo:rustc-link-lib=static:+whole-archive=rte_log"); - - // TODO: do we need whole-archive for these? - println!("cargo:rustc-link-lib=static:+whole-archive=ibverbs"); - println!("cargo:rustc-link-lib=static:+whole-archive=mlx5"); - - // TODO: see if we can't get these to be static - println!("cargo:rustc-link-lib=dylib=nl-route-3"); - println!("cargo:rustc-link-lib=dylib=nl-3"); - - // println!("cargo:rustc-link-lib=dylib=archive"); - // println!("cargo:rustc-link-lib=dylib=acl"); - // println!("cargo:rustc-link-lib=dylib=bz2"); - // println!("cargo:rustc-link-lib=dylib=crypto"); - // println!("cargo:rustc-link-lib=dylib=lz4"); - - // TODO: Ideally this would be static, but numa fails to link statically - // due to some linker script issues I have not looked into yet. - println!("cargo:rustc-link-lib=dylib=numa"); - - // println!("cargo:rustc-link-lib=dylib=xml2"); - // println!("cargo:rustc-link-lib=dylib=z"); - // println!("cargo:rustc-link-lib=dylib=zstd"); - // println!("cargo:rustc-link-lib=dylib=icuuc"); - // println!("cargo:rustc-link-lib=dylib=icudata"); - // println!("cargo:rustc-link-lib=dylib=lzma"); - // println!("cargo:rustc-link-lib=dylib=atomic"); - - // re-run build.rs upon changes - println!("cargo:rerun-if-changed=build.rs"); - println!("cargo:rerun-if-changed=c/wrapper.h"); - println!("cargo:rerun-if-changed=c/wrapper.c"); - println!("cargo:rerun-if-changed=c/dpdk.h"); + let depends = [ + "dpdk_wrapper", + "rte_net_mlx5", + "rte_common_mlx5", + "rte_ethdev", + "rte_bus_auxiliary", + "rte_net", + "rte_bus_pci", + "rte_pci", + "rte_mbuf", + "rte_mempool_ring", + "rte_mempool", + "rte_hash", + "rte_rcu", + "rte_ring", + "rte_eal", + "rte_kvargs", + "rte_telemetry", + "rte_log", + "ibverbs", + "mlx5", + "nl-route-3", + "nl-3", + "numa", + ]; + + depends.iter().for_each(|dep| { + println!("cargo:rustc-link-lib=static:+whole-archive,+bundle={dep}"); + }); + + let rerun_if_changed = ["build.rs"]; + + rerun_if_changed.iter().for_each(|file| { + println!("cargo:rerun-if-changed={file}"); + }); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); // let out_path = PathBuf::from("src"); - bind(&out_path); - + bind(&out_path, sysroot.as_str()); } diff --git a/dpdk-sys/c/dpdk.h b/dpdk-sys/c/dpdk.h deleted file mode 100644 index 325d1804..00000000 --- a/dpdk-sys/c/dpdk.h +++ /dev/null @@ -1,217 +0,0 @@ -// Trace point and and trace point register need to be included before other headers -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//int const rte_get_errno(); - -//enum rte_eth_tx_offload: uint64_t { -// VLAN_INSERT = RTE_ETH_TX_OFFLOAD_VLAN_INSERT, -// IPV4_CKSUM = RTE_ETH_TX_OFFLOAD_IPV4_CKSUM, -// UDP_CKSUM = RTE_ETH_TX_OFFLOAD_UDP_CKSUM, -// TCP_CKSUM = RTE_ETH_TX_OFFLOAD_TCP_CKSUM, -// SCTP_CKSUM = RTE_ETH_TX_OFFLOAD_SCTP_CKSUM, -// TCP_TSO = RTE_ETH_TX_OFFLOAD_TCP_TSO, -// UDP_TSO = RTE_ETH_TX_OFFLOAD_UDP_TSO, -// OUTER_IPV4_CKSUM = RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM, -// QINQ_INSERT = RTE_ETH_TX_OFFLOAD_QINQ_INSERT, -// VXLAN_TNL_TSO = RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO, -// GRE_TNL_TSO = RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO, -// IPIP_TNL_TSO = RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO, -// GENEVE_TNL_TSO = RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO, -// MACSEC_INSERT = RTE_ETH_TX_OFFLOAD_MACSEC_INSERT, -//}; - -//enum rte_flow_port_flag: uint32_t { -// /** -// * Indicate all operations for a given flow rule will _strictly_ -// * happen on the same queue (create/destroy/query/update). -// */ -// STRICT_QUEUE = RTE_FLOW_PORT_FLAG_STRICT_QUEUE, -// -// /** -// * Indicate all steering objects should be created on contexts -// * of the host port, providing indirect object sharing between -// * ports. -// */ -// SHARE_INDIRECT = RTE_FLOW_PORT_FLAG_SHARE_INDIRECT -//}; - - - - -// Things which are either duplicated, totally inapplicable or not needed -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include // this is an internal header -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include -//#include diff --git a/dpdk-sys/c/wrapper.c b/dpdk-sys/c/wrapper.c deleted file mode 100644 index b4117944..00000000 --- a/dpdk-sys/c/wrapper.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "wrapper.h" - -int wrte_errno() { - return rte_errno; -} - -uint16_t wrte_eth_rx_burst(uint16_t const port_id, uint16_t const queue_id, struct rte_mbuf **rx_pkts, uint16_t const nb_pkts) { - return rte_eth_rx_burst(port_id, queue_id, rx_pkts, nb_pkts); -} - -uint16_t wrte_eth_tx_burst(uint16_t const port_id, uint16_t const queue_id, struct rte_mbuf **tx_pkts, uint16_t const nb_pkts) { - return rte_eth_tx_burst(port_id, queue_id, tx_pkts, nb_pkts); -} diff --git a/dpdk-sys/c/wrapper.h b/dpdk-sys/c/wrapper.h deleted file mode 100644 index 2d726c0d..00000000 --- a/dpdk-sys/c/wrapper.h +++ /dev/null @@ -1,89 +0,0 @@ -#include "dpdk.h" - -/** - * Thin wrapper to expose `rte_errno`. - * - * @return - * The last rte_errno value (thread local value). - */ -__rte_hot -__rte_warn_unused_result -int wrte_errno(); - -///** -// * DPDK specific error codes. -// * -// * I wrapped these because the original enum is anonymous (this irritates me). -// */ -//enum wrte_errno : uint32_t { -// RTE_MIN_ERRNO = __ELASTERROR, /**< Start numbering above std errno vals */ -// -// E_RTE_SECONDARY, /**< Operation not allowed in secondary processes */ -// E_RTE_NO_CONFIG, /**< Missing rte_config */ -// -// RTE_MAX_ERRNO /**< Max RTE error number */ -//}; - -/** - * TX offloads to be set in [`rte_eth_tx_mode.offloads`]. - * - * This is a bitfield. Union these to enable multiple offloads. - * - * I wrapped these because the enum must be explicitly typed as 64 bit, but - * DPDK is not yet using the C23 standard (which would allow the inheritance - * notation with `uint64_t` seen here.). - */ -enum wrte_eth_tx_offload: uint64_t { - VLAN_INSERT = RTE_ETH_TX_OFFLOAD_VLAN_INSERT, - IPV4_CKSUM = RTE_ETH_TX_OFFLOAD_IPV4_CKSUM, - UDP_CKSUM = RTE_ETH_TX_OFFLOAD_UDP_CKSUM, - TCP_CKSUM = RTE_ETH_TX_OFFLOAD_TCP_CKSUM, - SCTP_CKSUM = RTE_ETH_TX_OFFLOAD_SCTP_CKSUM, - TCP_TSO = RTE_ETH_TX_OFFLOAD_TCP_TSO, - UDP_TSO = RTE_ETH_TX_OFFLOAD_UDP_TSO, - OUTER_IPV4_CKSUM = RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM, - QINQ_INSERT = RTE_ETH_TX_OFFLOAD_QINQ_INSERT, - VXLAN_TNL_TSO = RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO, - GRE_TNL_TSO = RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO, - IPIP_TNL_TSO = RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO, - GENEVE_TNL_TSO = RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO, - MACSEC_INSERT = RTE_ETH_TX_OFFLOAD_MACSEC_INSERT, -}; - - -/** - * Thin wrapper around `rte_eth_rx_burst`. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param queue_id - * The index of the receive queue on the Ethernet device. - * @param rx_pkts - * The address of an array of pointers to [`rte_mbuf`] structures that must be - * large enough to store `nb_pkts` pointers in it. - * @param nb_pkts - * The maximum number of packets to receive. - * @return - * The number of packets received, which is the number of [`rte_mbuf`] structures - */ -__rte_hot -__rte_warn_unused_result -uint16_t wrte_eth_rx_burst(uint16_t const port_id, uint16_t const queue_id, struct rte_mbuf **rx_pkts, uint16_t const nb_pkts); - -/** - * Thin wrapper around [`rte_eth_tx_burst`]. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param queue_id - * The index of the transmit queue on the Ethernet device. - * @param tx_pkts - * The address of an array of pointers to [`rte_mbuf`] structures that contain - * @param nb_pkts - * The number of packets to transmit. - * @return - * The number of packets actually sent. - */ -__rte_hot -__rte_warn_unused_result -uint16_t wrte_eth_tx_burst(uint16_t const port_id, uint16_t const queue_id, struct rte_mbuf **tx_pkts, uint16_t const nb_pkts); diff --git a/dpdk-sys/gen-sysroot/Dockerfile b/dpdk-sys/gen-sysroot/Dockerfile index 8f5dbd4a..2f5b5f6e 100644 --- a/dpdk-sys/gen-sysroot/Dockerfile +++ b/dpdk-sys/gen-sysroot/Dockerfile @@ -1,4 +1,12 @@ -FROM archlinux +ARG CC=clang +ARG CFLAGS="" +ARG CPU_ARCH="native" +ARG CXX=clang++ +ARG CXXFLAGS="" +ARG LD="mold" +ARG LDFLAGS="" + +FROM archlinux as base SHELL ["/bin/bash", "-eu", "-o", "pipefail", "-c"] @@ -22,121 +30,24 @@ RUN pacman --sync --refresh --sysupgrade --noconfirm \ ; \ :; -WORKDIR /usr/src - -ENV IDEAL_LTO_TYPE="thin" -ENV IDEAL_OPT_LEVEL="3" -ENV IDEAL_CPU_ARCH="x86-64-v4" -#ENV CPU_ARCH="znver4" -ENV IDEAL_CPU_TUNE="znver4" - -ENV DEV_LTO_TYPE="thin" -# -Og optimizes for debugging -ENV DEV_OPT_LEVEL="g" -ENV DEV_CPU_ARCH="generic" -ENV DEV_CPU_TUNE="generic" - -ENV IDEAL_CC="clang" -ENV IDEAL_CPP="clang-cpp" -ENV IDEAL_LD="mold" -ENV IDEAL_CXX="clang++" -ENV IDEAL_AR="llvm-ar" -ENV IDEAL_NM="llvm-nm" -ENV IDEAL_RANLIB="llvm-ranlib" - -ENV DEV_CC="${IDEAL_CC}" -ENV DEV_CPP="${IDEAL_CPP}" -ENV DEV_LD="${IDEAL_LD}" -ENV DEV_CXX="${IDEAL_CXX}" -ENV DEV_AR="${IDEAL_AR}" -ENV DEV_NM="${IDEAL_NM}" -ENV DEV_RANLIB="${IDEAL_RANLIB}" -# -ENV IDEAL_CFLAGS_OPT_LEVEL="-O${IDEAL_OPT_LEVEL}" -ENV IDEAL_CFLAGS_MARCH="-march=${IDEAL_CPU_ARCH}" -ENV IDEAL_CFLAGS_TUNE="-mtune=${IDEAL_CPU_TUNE}" -ENV IDEAL_CFLAGS_LTO="-flto=${IDEAL_LTO_TYPE}" -ENV IDEAL_CFLAGS_WERROR="-Werror=odr -Werror=strict-aliasing" -ENV IDEAL_CFLAGS_PIC="-fPIC" -# TODO: when rustc stabilizes support for safe-stack and cfi we should enable this -# TODO: poke ibverbs and figure out why it is mad at the safe-stack and cfi sanitizers. -# It's not a priority right now, but it would be nice to have when it stabilizes in rustc. -#ENV IDEAL_CFLAGS_SECURITY_FLAGS="-fstack-protector-strong -fsanitize=safe-stack -fsanitize=cfi" -ENV IDEAL_CFLAGS_SECURITY_FLAGS="-fstack-protector-strong" - -ENV DEV_CFLAGS_OPT_LEVEL="-O${DEV_OPT_LEVEL}" -ENV DEV_CFLAGS_MARCH="-march=${DEV_CPU_ARCH}" -ENV DEV_CFLAGS_TUNE="-mtune=${DEV_CPU_TUNE}" -ENV DEV_CFLAGS_LTO="-flto=${DEV_LTO_TYPE}" -ENV DEV_CFLAGS_WERROR="${IDEAL_CFLAGS_WERROR}" -ENV DEV_CFLAGS_PIC="${IDEAL_CFLAGS_PIC}" -# TODO: when rustc stabilizes support for safe-stack and cfi we should enable this -# TODO: poke ibverbs and figure out why it is mad at the safe-stack and cfi sanitizers. -# It's not a priority right now, but it would be nice to have when it stabilizes in rustc. -#ENV DEV_CFLAGS_SECURITY_FLAGS="-fstack-protector-strong -fsanitize=safe-stack -fsanitize=cfi" -#ENV DEV_CFLAGS_SANITIZE_FLAGS="-fstack-protector-all -fsanitize=address -fno-inline -fno-omit-frame-pointer" -ENV DEV_CFLAGS_SANITIZE_FLAGS="" - -ENV IDEAL_CFLAGS="${IDEAL_CFLAGS} ${IDEAL_CFLAGS_OPT_LEVEL}" -#ENV IDEAL_CFLAGS="${IDEAL_CFLAGS} ${IDEAL_CFLAGS_MARCH}" -#ENV IDEAL_CFLAGS="${IDEAL_CFLAGS} ${IDEAL_CFLAGS_TUNE}" -ENV IDEAL_CFLAGS="${IDEAL_CFLAGS} ${IDEAL_CFLAGS_LTO}" -ENV IDEAL_CFLAGS="${IDEAL_CFLAGS} ${IDEAL_CFLAGS_WERROR}" -ENV IDEAL_CFLAGS="${IDEAL_CFLAGS} ${IDEAL_CFLAGS_PIC}" -ENV IDEAL_CFLAGS="${IDEAL_CFLAGS} ${IDEAL_CFLAGS_SECURITY_FLAGS}" - -ENV DEV_CFLAGS="${DEV_CFLAGS} ${DEV_CFLAGS_OPT_LEVEL}" -#ENV DEV_CFLAGS="${DEV_CFLAGS} ${DEV_CFLAGS_MARCH}" -#ENV DEV_CFLAGS="${DEV_CFLAGS} ${DEV_CFLAGS_TUNE}" -ENV DEV_CFLAGS="${DEV_CFLAGS} ${DEV_CFLAGS_LTO}" -ENV DEV_CFLAGS="${DEV_CFLAGS} ${DEV_CFLAGS_WERROR}" -ENV DEV_CFLAGS="${DEV_CFLAGS} ${DEV_CFLAGS_PIC}" -ENV DEV_CFLAGS="${DEV_CFLAGS} ${DEV_CFLAGS_SANITIZE_FLAGS} -ggdb3" - -ENV IDEAL_CXXFLAGS="${IDEAL_CFLAGS}" -ENV DEV_CXXFLAGS="${DEV_CFLAGS}" - -ENV IDEAL_LDFLAGS_USE_LD="-fuse-ld=${IDEAL_LD}" -ENV IDEAL_LDFLAGS_OPT_LEVEL="-Wl,-O2" -ENV IDEAL_LDFLAGS_GC_SECTIONS="-Wl,-gc-sections" -# Sadly we need this for DPDK -ENV IDEAL_LDFLAGS_AS_WHOLE_ARCHIVE="-Wl,--whole-archive" -ENV IDEAL_LDFLAGS_SECURITY_FLAGS="-Wl,-z,relro,-z,now" - -ENV IDEAL_LDFLAGS="" -ENV IDEAL_LDFLAGS="${IDEAL_LDFLAGS} ${IDEAL_LDFLAGS_USE_LD}" -ENV IDEAL_LDFLAGS="${IDEAL_LDFLAGS} ${IDEAL_LDFLAGS_OPT_LEVEL}" -ENV IDEAL_LDFLAGS="${IDEAL_LDFLAGS} ${IDEAL_LDFLAGS_GC_SECTIONS}" -ENV IDEAL_LDFLAGS="${IDEAL_LDFLAGS} ${IDEAL_LDFLAGS_AS_WHOLE_ARCHIVE}" -ENV IDEAL_LDFLAGS="${IDEAL_LDFLAGS} ${IDEAL_LDFLAGS_SECURITY_FLAGS}" -#ENV IDEAL_LDFLAGS="${IDEAL_LDFLAGS} -L/usr/lib" - -ENV DEV_LDFLAGS_USE_LD="-fuse-ld=${DEV_LD}" -ENV DEV_LDFLAGS_OPT_LEVEL="-Wl,-O2" -ENV DEV_LDFLAGS_GC_SECTIONS="-Wl,-gc-sections" -# Sadly we need this for DPDK -ENV DEV_LDFLAGS_AS_WHOLE_ARCHIVE="-Wl,--whole-archive" -ENV DEV_LDFLAGS_SECURITY_FLAGS="${DEV_CFLAGS_SANITIZE_FLAGS} -Wl,-z,relro,-z,now" -ENV DEV_LDFLAGS="" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_USE_LD}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_OPT_LEVEL}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_GC_SECTIONS}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_AS_WHOLE_ARCHIVE}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_SECURITY_FLAGS}" -#ENV DEV_LDFLAGS="${DEV_LDFLAGS} -L/usr/lib" +ARG CC +ARG CFLAGS +ARG CPU_ARCH +ARG CXX +ARG CXXFLAGS +ARG LD +ARG LDFLAGS -ENV CC="${IDEAL_CC}" -ENV LD="${IDEAL_LD}" -ENV CPP="${IDEAL_CPP}" -ENV CXX="${IDEAL_CXX}" -ENV AR="${IDEAL_AR}" -ENV NM="${IDEAL_NM}" -ENV RANLIB="${IDEAL_RANLIB}" +ENV CC="${CC}" +ENV CFLAGS="${CFLAGS}" +ENV CPU_ARCH="${CPU_ARCH}" +ENV CXX="${CXX}" +ENV CXXFLAGS="${CXXFLAGS}" +ENV LD="${LD}" +ENV LDFLAGS="${LDFLAGS}" -ENV CFLAGS="${IDEAL_CFLAGS}" -ENV CXXFLAGS="${CFLAGS}" -ENV LDFLAGS="${IDEAL_LDFLAGS} -fuse-ld=mold" +WORKDIR /usr/src ENV NUMACTL_VERSION="2.0.18" RUN mkdir --parent /usr/src/ \ @@ -148,12 +59,6 @@ RUN mkdir --parent /usr/src/ \ && make --jobs="$(nproc)" \ && make install -ENV CFLAGS="${IDEAL_CFLAGS} -ffat-lto-objects -funified-lto" -ENV CXXFLAGS="${CFLAGS}" - -ENV LD="${IDEAL_LD}" -ENV LDFLAGS="${IDEAL_LDFLAGS}" - ENV RDMA_CORE_VERSION="53.0" RUN mkdir --parent /usr/src/ \ && wget --output-document=- "https://github.com/linux-rdma/rdma-core/releases/download/v${RDMA_CORE_VERSION}/rdma-core-${RDMA_CORE_VERSION}.tar.gz" \ @@ -161,7 +66,7 @@ RUN mkdir --parent /usr/src/ \ && ln --relative --symbolic /usr/src/rdma-core-"${RDMA_CORE_VERSION}" /usr/src/rdma-core \ && mkdir /usr/src/rdma-core/build \ && cd /usr/src/rdma-core/build \ - && cmake \ + && CFLAGS="${CFLAGS:-""} -ffat-lto-objects" cmake \ -DNO_PYVERBS=1 \ -DNO_MAN_PAGES=1 \ -DENABLE_STATIC=1 \ @@ -197,19 +102,6 @@ RUN cd /usr/src/rdma-core/build \ # .. \ # && ninja install -ENV DEV_LDFLAGS="" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_USE_LD}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_OPT_LEVEL}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_GC_SECTIONS}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_AS_WHOLE_ARCHIVE}" -ENV DEV_LDFLAGS="${DEV_LDFLAGS} ${DEV_LDFLAGS_SECURITY_FLAGS}" - -ENV LD="lld" -ENV LDFLAGS="${DEV_LDFLAGS}" -ENV CPU_ARCH="${DEV_CPU_ARCH}" -ENV CFLAGS="${DEV_CFLAGS}" -ENV CXXFLAGS="${CFLAGS}" - # Fetch DPDK ENV DPDK_ARCH="x86_64" ENV DPDK_EXECENV="linuxapp" @@ -433,7 +325,7 @@ meson setup --reconfigure build \ -Db_coverage=false \ -Db_lto=true \ -Db_lundef=true \ - -Db_pch=true `#pch means pre-compiled headers which never seem to work out for me` \ + -Db_pch=true `#pch means pre-compiled headers` \ -Db_pgo=off `#turn this on later when we have a workload to test ` \ -Db_pie=true `#not clear if I still need this` \ -Db_sanitize=none `#see if we can't bully DPDK et al into building with -fsanitize=cfi` \ @@ -452,54 +344,43 @@ meson setup --reconfigure build \ -Ddisable_drivers="${_disabled_drivers}" \ -Ddisable_libs="${_disabled_libs}" \ -Denable_drivers="${_enabled_drivers}" \ - -Db_lto_mode="$([ "${IDEAL_LTO_TYPE}" = "thin" ] && echo thin || echo default)" \ + -Db_lto_mode="thin" \ -Dc_args="${CFLAGS}" \ - -Dc_link_args="${LDFLAGS}" \ + -Dc_link_args="${LDFLAGS} -fuse-ld=${LD}" \ -Dcpu_instruction_set="${CPU_ARCH}" \ - -Doptimization="${IDEAL_OPT_LEVEL}" \ + -Doptimization="3" \ ; \ cd /usr/src/dpdk/build; \ nice --adjustment=15 ninja; \ nice --adjustment=15 ninja install; \ :; -RUN pacman --sync --clean --noconfirm --clean \ - && pacman --sync --noconfirm --refresh --sysupgrade \ - && pacman --sync --noconfirm --clean --clean \ - && pacman --sync --noconfirm jdk-openjdk +#RUN pacman --sync --clean --noconfirm --clean \ +# && pacman --sync --noconfirm --refresh --sysupgrade \ +# && pacman --sync --noconfirm --clean --clean \ +# && pacman --sync --noconfirm jdk-openjdk RUN <<'EOS' pacman --sync --noconfirm \ + docker \ rustup \ + sudo \ ; rustup install stable-x86_64-unknown-linux-gnu -rustup install stable-x86_64-unknown-linux-musl -rustup install beta-x86_64-unknown-linux-gnu -rustup install beta-x86_64-unknown-linux-musl +#rustup install beta-x86_64-unknown-linux-gnu +#rustup install nightly-x86_64-unknown-linux-gnu +rustup +stable component add llvm-tools +#rustup +beta component add llvm-tools +#rustup +nightly component add llvm-tools +rustup default stable EOS -RUN <<'EOS' -rustup install nightly-x86_64-unknown-linux-gnu -rustup install nightly-x86_64-unknown-linux-musl -EOS +RUN rm -fr /usr/share/* +RUN rm -fr /usr/src/* +RUN rm -fr /var/cache/* -#RUN pacman -S --noconfirm libc++ libc++abi -#RUN ln -s /usr/lib /usr/lib/x86_64-pc-linux-gnu -# -#RUN groupadd builder --gid 1000 -#RUN useradd --create-home --gid builder --uid 1000 --shell /bin/bash --skel /dev/null builder -# -#USER builder:builder -# -#RUN <<'EOS' -#rustup install stable-x86_64-unknown-linux-gnu -#rustup install stable-x86_64-unknown-linux-musl -#rustup install beta-x86_64-unknown-linux-gnu -#rustup install beta-x86_64-unknown-linux-musl -#rustup install nightly-x86_64-unknown-linux-gnu -#rustup install nightly-x86_64-unknown-linux-musl -#EOS -CMD ["sleep", "infinity"] +FROM scratch as dpdk-sysroot +COPY --from=base / / diff --git a/dpdk-sys/gen-sysroot/debug-mode.env b/dpdk-sys/gen-sysroot/debug-mode.env new file mode 100644 index 00000000..d328715c --- /dev/null +++ b/dpdk-sys/gen-sysroot/debug-mode.env @@ -0,0 +1,8 @@ +AR="llvm-ar" +CC="clang" +CFLAGS="-Og -ggdb3" +CXX="clang++" +LD="mold" +LDFLAGS="-fuse-ld=mold" +NM="llvm-nm" +RANLIB="llvm-ranlib" diff --git a/dpdk-sys/gen-sysroot/default.nix b/dpdk-sys/gen-sysroot/default.nix deleted file mode 100644 index b6f754f9..00000000 --- a/dpdk-sys/gen-sysroot/default.nix +++ /dev/null @@ -1,97 +0,0 @@ -{ pkgsFn ? import }: - let - overlays = { - disableAppArmor = self: super: { libapparmor = null; }; - disableSystemd = self: super: { systemd = null; }; # git rekt - disableDoxygen = self: super: { doxygen = null; }; - useLlvm = self: super: { llvmPackages = super.llvmPackages_19; }; - }; - defaultOverlays = [ - overlays.disableAppArmor - overlays.disableSystemd - overlays.disableDoxygen - overlays.useLlvm - ]; - - # NOTE: this is obviously impure since it use -march=native - fancyCFLAGS = "-O3 -match=native -mtune=native -flto=thin -Wl,--plugin-opt=O3"; - fancyLDFLAGS = "-fuse-ld=mold -Wl,-z,relro,-z,now -pie -Wl,--as-needed"; - - useStdenv = stdenv: package: package.override { stdenv = stdenv; }; - useLto = super: pkg: (pkg.overrideAttrs (orig: { - nativeBuildInputs = (orig.nativeBuildInputs or []) ++ [ super.llvmPackages.bintools ]; - CFLAGS = "${orig.CFLAGS or ""} ${fancyCFLAGS}"; - CXXFLAGS = "${orig.CXXFLAGS or ""} ${fancyCFLAGS}"; - LDFLAGS = "${orig.LDFLAGS or ""} ${fancyLDFLAGS}"; - })); - pkgs = (pkgsFn { - overlays = defaultOverlays ++ [ - (self: super: let - cc = super.llvmPackages.clangUseLLVM; - stdenv = with super; overrideCC llvmPackages.stdenv cc; - useCustomStdenv = (pkg: (useStdenv stdenv pkg)); - optimize = (pkg: (useLto super (useCustomStdenv pkg))); - in { - rdma-core = optimize (super.rdma-core.overrideAttrs (orig: { - nativeBuildInputs = with super; [ cmake pkg-config python3 mold ]; - outputs = pkgs.lib.lists.remove "man" orig.outputs; - buildInputs = with super; [ libnl ethtool iproute2 ]; - CFLAGS = "${orig.CFLAGS or ""} ${fancyCFLAGS} -ffat-lto-objects -funified-lto"; - LDFLAGS = "${orig.LDFLAGS or ""} ${fancyLDFLAGS}"; - cmakeFlags = orig.cmakeFlags ++ [ - "-DENABLE_STATIC=1" - "-DNO_MAN_PAGES=1" - "-DNO_PY_VERBS=1" - ]; - })); - - overlayStdenv = stdenv; - } - ) - ]; - }).pkgsMusl; - overrides = (builtins.fromTOML (builtins.readFile ./toolchain.toml)); - libPath = with pkgs; lib.makeLibraryPath [ - # load external libraries that you need in your rust project here - ]; - llvm = pkgs.llvmPackages; - rustup = pkgs.rustup.overrideAttrs (orig: { doCheck = false; }); -in - pkgs.mkShell rec { - buildInputs = [ - llvm.clang - llvm.bintools - rustup - pkgs.rdma-core - ]; - - CFLAGS = "-O3 -match=native -flto=thin"; - NIX_CFLAGS = "${CFLAGS}"; - LDFLAGS = "-fuse-ld=mold"; - NIX_LDFLAGS = "${LDFLAGS}"; - RUSTC_VERSION = overrides.toolchain.channel; - # https://github.com/rust-lang/rust-bindgen#environment-variables - LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ llvm.libclang.lib ]; - shellHook = '' - export PATH=$PATH:''${CARGO_HOME:-~/.cargo}/bin - export PATH=$PATH:''${RUSTUP_HOME:-~/.rustup}/toolchains/${RUSTC_VERSION}-x86_64-unknown-linux-gnu/bin/ - ''; - # Add precompiled library to rustc search path - RUSTFLAGS = (builtins.map (a: ''-L ${a}/lib'') [ - # add libraries here (e.g. pkgs.libvmi) - ]); - LD_LIBRARY_PATH = libPath; - # Add glibc, clang, glib, and other headers to bindgen search path - BINDGEN_EXTRA_CLANG_ARGS = - # Includes normal include path - (builtins.map (a: ''-I"${a}/include"'') [ - # add dev libraries here (e.g. pkgs.libvmi.dev) - pkgs.glibc.dev - ]) - # Includes with special directory paths - ++ [ - ''-I"${pkgs.llvmPackages_latest.libclang.lib}/lib/clang/${llvm.libclang.version}/include"'' - ''-I"${pkgs.glib.dev}/include/glib-2.0"'' - ''-I${pkgs.glib.out}/lib/glib-2.0/include/'' - ]; - } diff --git a/dpdk-sys/gen-sysroot/gen-sysroot.sh b/dpdk-sys/gen-sysroot/gen-sysroot.sh old mode 100755 new mode 100644 index 39b90161..791db887 --- a/dpdk-sys/gen-sysroot/gen-sysroot.sh +++ b/dpdk-sys/gen-sysroot/gen-sysroot.sh @@ -23,24 +23,45 @@ die() { } pushd "${script_dir}" + +declare compile_mode="${1:-}" + + +if [[ "${compile_mode}" = "release" ]]; then + declare -r compile_mode="release" + source "./release-mode.env" +else + declare -r compile_mode="debug" + source "./debug-mode.env" +fi + +shift + + declare sysroot_dir -sysroot_dir="$(readlink --canonicalize-existing "${script_dir}/..")/sysroot" +sysroot_dir="$(readlink --canonicalize-existing "${script_dir}/../..")/sysroot/${compile_mode}" declare -r sysroot_dir -declare -r regen_sysroot="${1:-""}" +declare -r regen_sysroot="${1:-}" -if [[ "${regen_sysroot}" = "--regen-sysroot" && -d "${sysroot_dir}" ]]; then +if [[ "${regen_sysroot}" = "--regen-sysroot=yes" && -d "${sysroot_dir}" ]]; then printf -- "--regen-sysroot flag accepted, removing directory %s\n" "${sysroot_dir}" rm -fr "${sysroot_dir}" + shift fi -mkdir "${sysroot_dir}" \ - || { rmdir "${sysroot_dir}" && mkdir "${sysroot_dir}"; } \ - || die "${sysroot_dir} already exists and is not empty" +[[ -d "${sysroot_dir}" ]] && die "Directory %s already exists, exiting\n" "${sysroot_dir}" -docker build --pull --tag dpdk-sysroot --file "${script_dir}/Dockerfile" "${script_dir}" +mkdir --parent "${sysroot_dir}" +docker build \ + --pull \ + --build-arg=CC="${CC}" \ + --build-arg=CFLAGS="${CFLAGS}" \ + --build-arg=CXX="${CXX}" \ + --build-arg=LD="${LD}" \ + --build-arg=LDFLAGS="${LDFLAGS}" \ + --tag "dpdk-sysroot-${compile_mode}" --file "${script_dir}/Dockerfile" "${script_dir}" # clean up any prior sysroot -docker rm dpdk-sysroot || true -docker create --name dpdk-sysroot dpdk-sysroot true - -docker export dpdk-sysroot | tar xf - -C "${sysroot_dir}" \ No newline at end of file +docker rm "dpdk-sysroot-${compile_mode}" || true +docker create --name "dpdk-sysroot-${compile_mode}" "dpdk-sysroot-${compile_mode}" true +docker export "dpdk-sysroot-${compile_mode}" | tar xf - -C "${sysroot_dir}" diff --git a/dpdk-sys/gen-sysroot/release-mode.env b/dpdk-sys/gen-sysroot/release-mode.env new file mode 100644 index 00000000..a3686157 --- /dev/null +++ b/dpdk-sys/gen-sysroot/release-mode.env @@ -0,0 +1,8 @@ +CC="clang" +CXX="clang++" +LD="mold" +CFLAGS="-O3 -ggdb3 -march=x86-64-v4 -mtune=znver4 -flto=thin -Werror=odr -Werror=strict-aliasing -fstack-protector-strong" +LDFLAGS="-fuse-ld=mold -Wl,-O3 -Wl,--gc-sections -Wl,-z,relro,-z,now" +RANLIB="llvm-ranlib" +AR="llvm-ar" +NM="llvm-nm" diff --git a/dpdk-sys/gen-sysroot/toolchain.toml b/dpdk-sys/gen-sysroot/toolchain.toml deleted file mode 100644 index 271800cb..00000000 --- a/dpdk-sys/gen-sysroot/toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "nightly" \ No newline at end of file diff --git a/dpdk-sysroot-helper/Cargo.toml b/dpdk-sysroot-helper/Cargo.toml new file mode 100644 index 00000000..6f283585 --- /dev/null +++ b/dpdk-sysroot-helper/Cargo.toml @@ -0,0 +1,5 @@ +[package] +name = "dpdk-sysroot-helper" +version = "0.0.1" +edition = "2021" +publish = false diff --git a/dpdk-sysroot-helper/src/lib.rs b/dpdk-sysroot-helper/src/lib.rs new file mode 100644 index 00000000..758d63e3 --- /dev/null +++ b/dpdk-sysroot-helper/src/lib.rs @@ -0,0 +1,54 @@ +use std::env; +use std::path::Path; + +// from https://stackoverflow.com/questions/73595435/how-to-get-profile-from-cargo-toml-in-build-rs-or-at-runtime +pub fn get_profile_name() -> String { + // The profile name is always the 3rd last part of the path (with 1 based indexing). + // e.g., /code/core/target/cli/build/my-build-info-9f91ba6f99d7a061/out + env::var("OUT_DIR") + .unwrap() + .split(std::path::MAIN_SEPARATOR) + .nth_back(3) + .expect("failed to get profile name") + .to_string() +} + +pub fn get_target_name() -> String { + // The target name is always the 4th last part of the path (with 1 based indexing). + // e.g., /code/core/target/cli/build/my-build-info-9f91ba6f99d7a061/out + env::var("OUT_DIR") + .unwrap() + .split(std::path::MAIN_SEPARATOR) + .nth_back(4) + .expect("failed to get target name") + .to_string() +} + +pub fn get_project_root() -> String { + env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set") +} + +pub fn get_dev_env() -> String { + env::var("DEV_ENV").expect("DEV_ENV not set") +} + +pub fn get_sysroot() -> String { + let sysroot_env = env::var("SYSROOT").expect("sysroot env not set"); + let target = get_target_name(); + let profile = get_profile_name(); + let expected_sysroot = format!("{sysroot_env}/{target}/{profile}"); + let expected_sysroot_path = Path::new(&expected_sysroot); + match expected_sysroot_path.exists() { + true => expected_sysroot, + false => { + let fallback_sysroot = format!("/sysroot/{target}/{profile}"); + let fallback_sysroot_path = Path::new(&fallback_sysroot); + match fallback_sysroot_path.exists() { + true => fallback_sysroot, + false => { + panic!("sysroot not found at {expected_sysroot} or {fallback_sysroot}") + } + } + } + } +} diff --git a/dpdk/Cargo.toml b/dpdk/Cargo.toml index 89462d82..c9fb6b85 100644 --- a/dpdk/Cargo.toml +++ b/dpdk/Cargo.toml @@ -2,6 +2,7 @@ name = "dpdk" version = "0.1.0" edition = "2021" +publish = false [features] default = ["serde", "tracing_max_level_trace", "tracing_release_max_level_debug"] @@ -31,6 +32,8 @@ net = { path = "../net" } etherparse = { workspace = true, default-features = false, features = [] } serde = { workspace = true, optional = true } -syscalls = { workspace = true } thiserror = { workspace = true } -tracing = { workspace = true, features = ["attributes"] } \ No newline at end of file +tracing = { workspace = true, features = ["attributes"] } + +[build-dependencies] +dpdk-sysroot-helper = { path = "../dpdk-sysroot-helper" } diff --git a/dpdk/build.rs b/dpdk/build.rs new file mode 100644 index 00000000..a4430d29 --- /dev/null +++ b/dpdk/build.rs @@ -0,0 +1,5 @@ +fn main() { + let sysroot = dpdk_sysroot_helper::get_sysroot(); + println!("cargo:rustc-link-search=all={sysroot}/lib"); + println!("cargo:rustc-link-arg=--sysroot={sysroot}"); +} diff --git a/dpdk/src/eal.rs b/dpdk/src/eal.rs index 9094dded..9dcaeadd 100644 --- a/dpdk/src/eal.rs +++ b/dpdk/src/eal.rs @@ -1,5 +1,4 @@ //! DPDK Environment Abstraction Layer (EAL) - use alloc::format; use alloc::string::{String, ToString}; use crate::{dev, mem, socket}; diff --git a/errno/Cargo.toml b/errno/Cargo.toml index 0ae08123..c0a2296b 100644 --- a/errno/Cargo.toml +++ b/errno/Cargo.toml @@ -2,6 +2,7 @@ name = "errno" version = "0.1.0" edition = "2021" +publish = false [dependencies] diff --git a/just.env b/just.env new file mode 100644 index 00000000..b862ad5b --- /dev/null +++ b/just.env @@ -0,0 +1,19 @@ +DPDK_SYS_BRANCH="main" +DPDK_SYS_COMMIT="6fe60a60638ab11f189cb191ab4a93bc56e41d8b" +LINKER="-C link-arg=-fuse-ld=lld" +RELRO="-C relro-level=full" +CRT="-C target-feature=+crt-static" +DEBUG="-C debuginfo=full" +DEBUG_ASSERTIONS_ON="-C debug-assertions=on" +DEBUG_ASSERTIONS_OFF="-C debug-assertions=off" +OVERFLOW_CHECK_ON="-C overflow-checks=on" +OVERFLOW_CHECK_OFF="-C overflow-checks=off" +OPTIMIZE_OFF="-C opt-level=0" +OPTIMIZE_ON="-C opt-level=3" +SPLIT_DEBUGINFO="-C split-debuginfo=packed" +STRIP="-C strip=none" +LTO="-C linker-plugin-lto -C lto=thin -C embed-bitcode=yes -C codegen-units=1" + +RUSTFLAGS_COMMON="${LINKER} ${RELRO} ${CRT} ${DEBUG}" +RUSTFLAGS_DEBUG="${RUSTFLAGS_COMMON} ${OPTIMIZE_OFF} ${DEBUG} ${DEBUG_ASSERTIONS_ON} ${OVERFLOW_CHECK_ON}" +RUSTFLAGS_RELEASE="${RUSTFLAGS_COMMON} ${OPTIMIZE_ON} ${LTO} ${DEBUG} ${DEBUG_ASSERTIONS_OFF} ${OVERFLOW_CHECK_OFF} ${SPLIT_DEBUGINFO}" diff --git a/justfile b/justfile new file mode 100644 index 00000000..e8198770 --- /dev/null +++ b/justfile @@ -0,0 +1,295 @@ +set unstable := true + +SHELL := shell(""" + if ! set -e; then + >&2 echo "ERROR: failed to configure shell (set -e not supported by shell $SHELL)" + exit 1 + fi + if ! set -u; then + >&2 echo "ERROR: failed to configure shell (set -u not supported by shell $SHELL)" + exit 1 + fi + if ! set -o pipefail; then + >&2 echo "ERROR: failed to configure shell (set -o pipefail not supported by shell $SHELL)" + exit 1 + fi + if ! (set -x); then + >&2 echo "WARNING: shell does not support set -x: debug mode unavailable (shell $SHELL)" + fi + echo ${SHELL:-sh} +""") + +set shell := [x"${SHELL:-bash}", "-euo", "pipefail", "-c"] +set script-interpreter := [x"${SHELL:-bash}", "-euo", "pipefail"] +set dotenv-load := true +set dotenv-required := true +set dotenv-filename := "just.env" +set dotenv-path := "." + +debug := "false" +export DPDK_SYS_COMMIT := shell("source ./just.env && echo $DPDK_SYS_COMMIT") +hugepages_1g := "8" +hugepages_2m := "1024" +_just_debuggable_ := if debug == "true" { "set -x" } else { "" } +target := "x86_64-unknown-linux-gnu" +profile := "debug" +sterile_target_dir := `printf -- %s "/run/user/$(id -u)/hedgehog/dataplane/sterile"` +_container_source := "ghcr.io/githedgehog/dpdk-sys" +rust := "pinned" +_env_branch := "main" +_dev_env_container := _container_source + "/dev-env:" + _env_branch + "-rust-" + rust + "-" + DPDK_SYS_COMMIT +_compile_env_container := _container_source + "/compile-env:" + _env_branch + "-rust-" + rust + "-" + DPDK_SYS_COMMIT + +[group('ci')] +[private] +[script] +_ci-compile-env-hack: + {{ _just_debuggable_ }} + ln -s / ./compile-env + +[private] +[script] +_cargo-with-rust-flags *args: + {{ _just_debuggable_ }} + source ./just.env + declare -a args=({{ args }}) + PROFILE="{{ profile }}" + declare -a extra_args=() + for arg in "${args[@]}"; do + case "$arg" in + --debug|--profile=debug) + [ -z "${RUSTFLAGS:-}" ] && declare -rx RUSTFLAGS="${RUSTFLAGS_DEBUG}" + ;; + --release|--profile=release) + [ -z "${RUSTFLAGS:-}" ] && declare -rx RUSTFLAGS="${RUSTFLAGS_RELEASE}" + extra_args+=("$arg") + ;; + *) + extra_args+=("$arg") + ;; + esac + done + [ -z "${RUSTFLAGS:-}" ] && declare -rx RUSTFLAGS="${RUSTFLAGS_DEBUG}" + >&2 echo "With RUSTFLAGS=\"${RUSTFLAGS:-}\"" + cargo "${extra_args[@]}" + +[group('rust')] +[script] +cargo *args: (_cargo-with-rust-flags args) + +[group('env')] +[script] +dev-env *args="": allocate-2M-hugepages allocate-1G-hugepages mount-hugepages fill-out-dev-env-template && umount-hugepages + {{ _just_debuggable_ }} + declare hugemnt2M + hugemnt2M="/run/user/$(id -u)/hedgehog/dataplane/hugepages/2M" + declare -r hugemnt2M + declare hugemnt1G + hugemnt1G="/run/user/$(id -u)/hedgehog/dataplane/hugepages/1G" + declare -r hugemnt1G + sudo docker run \ + --rm \ + --interactive \ + --tty \ + --name dataplane-dev-env \ + --privileged \ + --network=host \ + --security-opt seccomp=unconfined \ + --mount type=tmpfs,destination=${HOME},tmpfs-mode=1777 \ + --mount type=bind,source="${hugemnt2M},destination=/mnt/hugepages/2M,bind-propagation=rprivate" \ + --mount type=bind,source="${hugemnt1G},destination=/mnt/hugepages/1G,bind-propagation=rprivate" \ + --mount type=bind,source="$(pwd),destination=$(pwd),bind-propagation=rprivate" \ + --mount type=bind,source=$(pwd)/dev-env-template/etc/passwd,destination=/etc/passwd,readonly \ + --mount type=bind,source=$(pwd)/dev-env-template/etc/group,destination=/etc/group,readonly \ + --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \ + --user "$(id -u):$(id -g)" \ + --workdir "$(pwd)" \ + "{{ _dev_env_container }}" \ + {{ args }} + +[script] +compile-env *args: + {{ _just_debuggable_ }} + mkdir -p "$(pwd)/sterile" + declare tmp_linkA + tmp_link=$(mktemp -d --suffix=dataplane-compile-env.link) + declare -r tmp_link + cleanup() { + rm -r "${tmp_link}" + } + trap cleanup EXIT + declare tmp_targetdir + tmp_targetdir="$(mktemp -p "$(pwd)/sterile" --directory --suffix=".$(date --iso-8601=s).target")" + declare -r tmp_targetdir + ln -s / "${tmp_link}/cheat" + ln -s /bin "${tmp_link}/bin" + ln -s /lib "${tmp_link}/lib" + ln -s /sysroot "${tmp_link}/sysroot" + ln -s /nix "${tmp_link}/nix" + docker run \ + --rm \ + --interactive \ + --tty \ + --read-only \ + --name dataplane-compile-env \ + --tmpfs /tmp:uid=$(id -u),gid=$(id -g),noexec,nosuid \ + --mount type=tmpfs,destination=${HOME},tmpfs-mode=1777 \ + --mount type=bind,source="$(pwd),destination=/work,bind-propagation=rprivate,readonly" \ + --mount type=bind,source="${tmp_link},destination=/work/compile-env,bind-propagation=rprivate,readonly" \ + --mount type=bind,source=$(pwd)/dev-env-template/etc/passwd,destination=/etc/passwd,readonly \ + --mount type=bind,source=$(pwd)/dev-env-template/etc/group,destination=/etc/group,readonly \ + --mount type=bind,source="${tmp_targetdir},destination=/work/target,bind-propagation=rprivate" \ + --user "$(id -u):$(id -g)" \ + --workdir /work \ + "{{ _compile_env_container }}" \ + {{ args }} +# "{{compile_env_container}}" \ +# sh -euxo pipefail -c "curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs > /tmp/rustup.sh" + +[script] +pull-compile-env: + {{ _just_debuggable_ }} + docker pull "{{ _compile_env_container }}" || true + +[script] +pull-dev-env: + {{ _just_debuggable_ }} + docker pull "{{ _dev_env_container }}" + +[script] +pull: pull-compile-env pull-dev-env + +[script] +create-dev-env: + {{ _just_debuggable_ }} + mkdir dev-env + docker create --name dpdk-sys-dev-env {{ _dev_env_container }} - fake + docker export dpdk-sys-dev-env | tar --no-same-owner --no-same-permissions -xf - -C dev-env + docker rm dpdk-sys-dev-env + +[private] +[script] +allocate-2M-hugepages: + {{ _just_debuggable_ }} + pages=$(< /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages) + if [ "$pages" -gt {{ hugepages_2m }}} ]; then + >&2 echo "INFO: ${pages} 2M hugepages already allocated" + exit 0 + fi + printf -- "%s" {{ hugepages_2m }} | sudo tee /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages >/dev/null + +[private] +[script] +allocate-1G-hugepages: + {{ _just_debuggable_ }} + pages=$(< /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages) + if [ "$pages" -gt {{ hugepages_1g }} ]; then + >&2 echo "INFO: ${pages} 1G hugepages already allocated" + exit 0 + fi + printf -- "%s" {{ hugepages_1g }} | sudo tee /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages >/dev/null + +[private] +[script] +umount-hugepages: + {{ _just_debuggable_ }} + declare hugemnt2M + hugemnt2M="/run/user/$(id -u)/hedgehog/dataplane/hugepages/2M" + declare -r hugemnt2M + declare hugemnt1G + hugemnt1G="/run/user/$(id -u)/hedgehog/dataplane/hugepages/1G" + declare -r hugemnt1G + if [ "$(findmnt -rno FSTYPE "${hugemnt2M}")" == "hugetlbfs" ]; then + sudo umount --lazy "${hugemnt2M}" + fi + if [ "$(findmnt -rno FSTYPE "${hugemnt1G}")" == "hugetlbfs" ]; then + sudo umount --lazy "${hugemnt1G}" + fi + sync + +[private] +[script] +mount-hugepages: + {{ _just_debuggable_ }} + declare hugemnt2M + hugemnt2M="/run/user/$(id -u)/hedgehog/dataplane/hugepages/2M" + declare -r hugemnt2M + declare hugemnt1G + hugemnt1G="/run/user/$(id -u)/hedgehog/dataplane/hugepages/1G" + declare -r hugemnt1G + [ ! -d "$hugemnt2M" ] && mkdir --parent "$hugemnt2M" + [ ! -d "$hugemnt1G" ] && mkdir --parent "$hugemnt1G" + if [ ! "$(findmnt -rno FSTYPE "${hugemnt2M}")" == "hugetlbfs" ]; then + sudo mount -t hugetlbfs -o pagesize=2M,noatime hugetlbfs "$hugemnt2M" + fi + if [ ! "$(findmnt -rno FSTYPE "${hugemnt1G}")" == "hugetlbfs" ]; then + sudo mount -t hugetlbfs -o pagesize=1G,noatime hugetlbfs "$hugemnt1G" + fi + sync + +[group('env')] +[script] +create-compile-env: + {{ _just_debuggable_ }} + mkdir compile-env + docker create --name dpdk-sys-compile-env "{{ _compile_env_container }}" - fake + docker export dpdk-sys-compile-env \ + | tar --no-same-owner --no-same-permissions -xf - -C compile-env + docker rm dpdk-sys-compile-env + +[confirm("Remove the compile environment? (yes/no)\n(you can recreate it with `just create-compile-env`)")] +[group('env')] +[script] +remove-compile-env: + {{ _just_debuggable_ }} + if [ -d compile-env ]; then sudo rm -rf compile-env; fi + +[group('env')] +[script] +refresh-compile-env: remove-compile-env pull-compile-env && create-compile-env + +[confirm("Fake a nix install (yes/no)")] +[group('env')] +[script] +fake-nix refake="": + {{ _just_debuggable_ }} + if [ -h /nix ]; then + if [ "$(readlink -e /nix)" = "$(readlink -e "$(pwd)/compile-env/nix")" ]; then + >&2 echo "Nix already faked!" + exit 0 + else + if [ "{{ refake }}" = "refake" ]; then + sudo rm /nix + else + >&2 echo "Nix already faked elsewhere!" + >&2 echo "Run \`just fake-nix refake\` to re-fake to this location" + exit 1 + fi + fi + elif [ -d /nix ]; then + >&2 echo "Nix already installed, can't fake it!" + exit 1 + fi + if [ ! -d ./compile-env/nix ]; then + just refresh-compile-env + fi + if [ ! -d ./compile-env/nix ]; then + >&2 echo "Failed to create nix environment" + exit 1 + fi + sudo ln -rs ./compile-env/nix /nix + +[group('env')] +[private] +[script] +fill-out-dev-env-template: + {{ _just_debuggable_ }} + mkdir -p dev-env-template/etc + declare -rxi UID + GID="$(id -g)" + declare -rxi GID + envsubst < dev-env-template/etc.template/group.template > dev-env-template/etc/group + envsubst < dev-env-template/etc.template/passwd.template > dev-env-template/etc/passwd + +[group('env')] +sterile *args: (compile-env "just" "debug={{debug}}" "rust={{rust}}" "target={{target}}" "profile={{profile}}" args) diff --git a/net/Cargo.lock b/net/Cargo.lock deleted file mode 100644 index 9d53cfb3..00000000 --- a/net/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "net" -version = "0.1.0" diff --git a/net/Cargo.toml b/net/Cargo.toml index 6e912153..994c52c4 100644 --- a/net/Cargo.toml +++ b/net/Cargo.toml @@ -2,6 +2,11 @@ name = "net" version = "0.0.1" edition = "2021" +publish = false + +[[bench]] +name = "parse" +harness = false [features] default = ["serde", "tracing_max_level_trace", "tracing_release_max_level_debug"] @@ -24,11 +29,13 @@ tracing_release_max_level_trace = ["tracing/release_max_level_trace"] tracing_release_max_level_warn = ["tracing/release_max_level_warn"] [dependencies] - serde = { workspace = true, optional = true } thiserror = { workspace = true } tracing = { workspace = true } [dev-dependencies] bolero = { workspace = true } +criterion = { workspace = true } +rand = { workspace = true } +etherparse = { workspace = true, default-features = false, features = ["std"] } diff --git a/net/benches/parse.rs b/net/benches/parse.rs new file mode 100644 index 00000000..13cf2bd3 --- /dev/null +++ b/net/benches/parse.rs @@ -0,0 +1,17 @@ +use std::hint::black_box; +use criterion::{criterion_group, criterion_main, Criterion}; + +fn fibonacci(n: u64) -> u64 { + match n { + 0 => 1, + 1 => 1, + n => fibonacci(n-1) + fibonacci(n-2), + } +} + +fn criterion_benchmark(c: &mut Criterion) { + c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20)))); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/net/build.rs b/net/build.rs index b98475fa..89b172a3 100644 --- a/net/build.rs +++ b/net/build.rs @@ -1,3 +1,3 @@ fn main() { println!("cargo::rustc-check-cfg=cfg(kani)"); -} \ No newline at end of file +} diff --git a/net/src/lib.rs b/net/src/lib.rs index ebe79b9a..a6fa5984 100644 --- a/net/src/lib.rs +++ b/net/src/lib.rs @@ -4,9 +4,57 @@ #![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic)] // Do you know where your towel is? //! A library for working with and strictly validating network data - + +extern crate alloc; + +use alloc::vec::Vec; + #[cfg(all(kani, feature = "_fake_kani"))] compile_error!("kani should not be used with internal _fake_kani feature."); pub mod vlan; pub mod vxlan; + +#[cfg(test)] +mod tests { + use super::*; + use alloc::vec::Vec; + use etherparse::PacketBuilder; + + pub fn gen_random_udp_packet() -> Vec { + use etherparse::PacketBuilder; + let src_mac: [u8; 6] = rand::random(); + let dst_mac: [u8; 6] = rand::random(); + let src_ip: [u8; 4] = rand::random(); + let dst_ip: [u8; 4] = rand::random(); + let src_port: u16 = rand::random(); + let dst_port: u16 = rand::random(); + let tll = rand::random::(); + let builder = PacketBuilder::ethernet2(src_mac, dst_mac) + .ipv4(src_ip, dst_ip, rand::random()) + .udp(src_port, dst_port); + let payload_length = (rand::random::() % 1200) as usize; + let mut payload = Vec::with_capacity(payload_length + 50); + for _ in 0..payload_length { + payload.push(rand::random()); + } + let mut result = Vec::with_capacity(builder.size(payload.len())); + builder.write(&mut result, &payload).unwrap(); + result + } + + #[test] + pub fn parse_udp_packet() { + let packet = gen_random_udp_packet(); + use etherparse::PacketHeaders; + let headers = PacketHeaders::from_ethernet_slice(packet.as_slice()).unwrap(); + tracing::info!("Headers: {:?}", headers); + } + + #[test] + fn parse_udp_packet_bit_by_bit() { + let packet = gen_random_udp_packet(); + let mut cursor = 0; + let mut eth = etherparse::Ethernet2Header::from_slice(&packet[cursor..]).unwrap(); + } +} diff --git a/net/src/vxlan.rs b/net/src/vxlan.rs index 2e9b8846..2e60ec86 100644 --- a/net/src/vxlan.rs +++ b/net/src/vxlan.rs @@ -3,8 +3,6 @@ use core::num::NonZero; use tracing::instrument; -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] -#[repr(transparent)] /// A VXLAN Network Identifier. /// /// The [`Vni`] is a 24-bit value that identifies a VXLAN network. @@ -25,6 +23,8 @@ use tracing::instrument; /// The memory / compute overhead of using this type as opposed to a `u32` is then strictly /// limited to the price of checking that the represented value is in fact a legal [`Vni`], (which /// we should generally be doing anyway). +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[repr(transparent)] pub struct Vni(NonZero); #[derive(Copy, Clone, Debug, PartialEq, Eq, thiserror::Error)] @@ -144,3 +144,27 @@ mod test { }); } } + +#[cfg(any(feature = "_fake_kani", kani))] +mod proof { + + use super::*; + + #[kani::proof] + fn meets_spec() { + let x: u32 = kani::any(); + match Vni::new(x) { + Ok(vni) => { + assert_eq!(vni.as_u32(), x); + assert!(vni.as_u32() >= Vni::MIN); + assert!(vni.as_u32() <= Vni::MAX); + } + Err(InvalidVni::ReservedZero) => assert_eq!(x, 0), + Err(InvalidVni::TooLarge(too_big)) => { + assert_eq!(x, too_big); + assert!(too_big > Vni::MAX); + }, + } + } + +} diff --git a/nix/README.md b/nix/README.md index 7e459527..4279810c 100644 --- a/nix/README.md +++ b/nix/README.md @@ -3,4 +3,6 @@ This directory contains [nix] build instructions for packages we would like to use with Nix but which are not available in the official Nixpkgs repository. Ideally this stays small and simple. -It is a very bad sign if it does not stay small :) \ No newline at end of file +It is a very bad sign if it does not stay small :) + +[nix]: https://nixos.org/nix/ diff --git a/nix/mdbook-alerts.nix b/nix/mdbook-alerts.nix index 18e20b3d..739c023e 100644 --- a/nix/mdbook-alerts.nix +++ b/nix/mdbook-alerts.nix @@ -9,16 +9,16 @@ }: rustPlatform.buildRustPackage rec { owner = "lambdalisue"; pname = "rs-mdbook-alerts"; - version = "0.6.4"; + version = "0.6.7"; src = fetchFromGitHub { inherit owner; repo = pname; rev = "v${version}"; - hash = "sha256-bg3X7M2H553tGxH8cEkkT0XK20fWwkp2nTVEgtZ819s="; + hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; }; - cargoHash = "sha256-N4fSfTOocWW9RbpAc137wcehUm+j5onKGJBFL8LzwQw="; + cargoHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; buildInputs = lib.optionals stdenv.isDarwin [ CoreServices @@ -29,4 +29,4 @@ mainProgram = "mdbook-alerts"; homepage = "https://github.com/${owner}/${pname}"; }; -} \ No newline at end of file +} diff --git a/nix/mdbook-citeproc.nix b/nix/mdbook-citeproc.nix index 5b1bd1de..e759f6c7 100644 --- a/nix/mdbook-citeproc.nix +++ b/nix/mdbook-citeproc.nix @@ -1,6 +1,4 @@ -# Builds the mdbook-alerts package for use in the mdbook preprocessor -# I like this more than mdbook-admonish in that it uses the same syntax as -# github (which makes our docs more portable) +# Builds the mdbook-citeproc package for use in the mdbook preprocessor { lib , stdenv , rustPlatform diff --git a/outside.nix b/outside.nix new file mode 100644 index 00000000..ed177c49 --- /dev/null +++ b/outside.nix @@ -0,0 +1,28 @@ +{ + pkgs ? import {}, + overlays ? import ./nix/overlays.nix { build-flags = (import ./nix/flags.nix).release; }, +}: { + muslEnv = (import pkgs.path { + overlays = [ + (self: prev: { + pkgsCross.musl64 = import prev.path { + overlays = builtins.attrValues (overlays { + targetPlatform = prev.pkgsCross.musl64.stdenv.targetPlatform; + }); + }; + }) + ]; + }).pkgsCross.musl64; + + gnuEnv = (import pkgs.path { + overlays = [ + (self: prev: { + pkgsCross.gnu64 = import prev.path { + overlays = builtins.attrValues (overlays { + targetPlatform = prev.pkgsCross.gnu64.stdenv.targetPlatform; + }); + }; + }) + ]; + }).pkgsCross.gnu64; +} diff --git a/runner.sh b/runner.sh new file mode 100755 index 00000000..2af7570f --- /dev/null +++ b/runner.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -euo pipefail + +declare script_dir +script_dir="$(dirname "$(readlink --canonicalize-existing "$(dirname "${BASH_SOURCE[0]}")")")" +declare -r script_dir + +declare -r project_dir="${script_dir}" + +exec docker run \ + --rm \ + -it \ + --privileged \ + --network=host \ + --name dataplane-runner \ + -v "${project_dir}:${project_dir}" \ + -v "/etc/passwd:/etc/passwd:ro" \ + --user "$(id -u):$(id -g)" \ + -w "${project_dir}" \ + ghcr.io/githedgehog/dataplane/development-environment:debug \ + "${@}" diff --git a/scratch/Cargo.toml b/scratch/Cargo.toml index 0c251335..5119fd47 100644 --- a/scratch/Cargo.toml +++ b/scratch/Cargo.toml @@ -2,15 +2,17 @@ name = "scratch" version = "0.1.0" edition = "2021" +publish = false [dependencies] - dpdk-sys = { path = "../dpdk-sys" } - dpdk = { path = "../dpdk" } thiserror = { workspace = true } tracing = { workspace = true, features = ["attributes"] } tracing-subscriber = { workspace = true } -rand = { version = "0.8" } \ No newline at end of file +rand = { version = "0.8" } + +[build-dependencies] +dpdk-sysroot-helper = { path = "../dpdk-sysroot-helper" } diff --git a/scratch/build.rs b/scratch/build.rs new file mode 100644 index 00000000..7a28a907 --- /dev/null +++ b/scratch/build.rs @@ -0,0 +1,10 @@ +fn main() { + let sysroot = dpdk_sysroot_helper::get_sysroot(); + let project_root = dpdk_sysroot_helper::get_project_root(); + let rerun_if_changed = ["build.rs".to_string(), format!("{project_root}/../sysroot")]; + rerun_if_changed.iter().for_each(|file| { + println!("cargo:rerun-if-changed={file}"); + }); + println!("cargo:rustc-link-search=all={sysroot}/lib"); + println!("cargo:rustc-link-arg=--sysroot={sysroot}"); +} diff --git a/scratch/src/main.rs b/scratch/src/main.rs index e882d021..5282f841 100644 --- a/scratch/src/main.rs +++ b/scratch/src/main.rs @@ -49,320 +49,6 @@ pub fn fatal_error>(message: T) -> ! { unsafe { rte_exit(1, message_cstring.as_ptr()) } } -// impl Drop for Eal { -// /// TODO: proper safety analysis -// #[tracing::instrument(level = "debug")] -// fn drop(&mut self) { -// let exit_code = unsafe { rte_eal_cleanup() }; -// if exit_code < 0 { -// fatal_error("EAL cleanup failed"); -// } else { -// info!("EAL cleanup successful"); -// } -// } -// } - -// impl Eal { -// #[tracing::instrument(level = "trace", ret)] -// /// Returns `true` if the [`Eal`] is using the PCI bus. -// /// -// /// This is mostly a safe wrapper around [`rte_eal_has_pci`] which simply converts to -// /// a bool instead of a `c_int`. -// pub fn has_pci(&self) -> bool { -// unsafe { rte_eal_has_pci() != 0 } -// } -// -// #[tracing::instrument(level = "trace", ret)] -// /// Safe wrapper around [`rte_eth_dev_count_avail`] -// pub fn eth_dev_count_avail(&self) -> u16 { -// unsafe { rte_eth_dev_count_avail() } -// } -// } - -// // /// Sets up flow rules for demo purposes -// fn main() { -// tracing_subscriber::fmt() -// .with_max_level(tracing::Level::DEBUG) -// .with_target(false) -// .with_thread_ids(true) -// .with_line_number(true) -// .init(); -// let args = vec![ -// "-c", -// "0xffffffffff", -// "--in-memory", -// "--huge-dir", -// "/mnt/huge/2M", -// "--huge-dir", -// "/mnt/huge/1G", -// "--allow", -// "0000:01:00.0,dv_flow_en=2", -// "--trace=.*", -// "--iova-mode=va", -// "-l", -// "8,9,10,11,12,13,14,15", -// // "--allow", -// // "0000:01:00.1", -// // "--allow", -// // "0000:02:00.0", -// "--huge-worker-stack=8192", -// "--socket-mem=4096,4096,4096,4096", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool.so", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool_ring.so", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool_stack.so", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_bus_pci.so", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_net_mlx5.so", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_common_mlx5.so", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_regex_mlx5.so", -// // "-d", -// // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_vdpa_mlx5.so", -// ]; -// info!("DPDK arguments: {args:?}"); -// let eal = Eal::new(args); -// let has_pci = eal.has_pci(); -// info!("Has PCI: {has_pci}"); -// -// if !has_pci { -// fatal_error("No PCI devices found") -// } -// let count = eal.eth_dev_count_avail(); -// -// info!("Available Ethernet devices: {count}"); -// if count == 0 { -// return fatal_error("No Ethernet devices found"); -// } -// -// if count > 1 { -// return fatal_error("Multiple Ethernet devices found"); -// } -// -// let socket_id = unsafe { rte_socket_id() } as c_int; -// -// info!("Socket ID: {socket_id}"); -// -// const MBUF_POOL_NAME: &str = "mbuf_pool"; -// let mbuf_pool_name = as_cstr(MBUF_POOL_NAME); -// -// const MBUF_POOL_SIZE: u32 = (1 << 12) - 1; -// const MBUF_CACHE_SIZE: u32 = 128; -// const MBUF_PRIV_SIZE: u16 = 0; -// const MBUF_DATA_SIZE: u32 = 2048 + 128; -// -// let mbuf_pool = { -// let mbuf_pool_ptr = unsafe { -// rte_pktmbuf_pool_create( -// mbuf_pool_name.as_ptr(), -// MBUF_POOL_SIZE, -// MBUF_CACHE_SIZE, -// MBUF_PRIV_SIZE, -// 2048 + 128, -// 3, -// ) -// }; -// -// if mbuf_pool_ptr.is_null() { -// let errno = unsafe { wrte_errno() }; -// let c_err_str = unsafe { rte_strerror(errno) }; -// let err_str = unsafe { std::ffi::CStr::from_ptr(c_err_str) }; -// let err_str = err_str.to_str().unwrap(); -// error!("Failed to create mbuf pool: errno {errno}, {err_str}"); -// unsafe { -// rte_exit( -// errno, -// format!("Failed to create mbuf pool: errno {errno}, {err_str}").as_ptr() -// as *const _, -// ); -// } -// } -// unsafe { &mut *mbuf_pool_ptr } -// }; -// -// let port_id = 0; -// init_port2(port_id, mbuf_pool); -// -// meter_stuff(port_id); -// -// { -// debug!("Setting up flow rules"); -// let mut err = rte_flow_error::default(); -// let flow = generate_ct_flow2(port_id, 4, &mut err); -// } -// -// debug!("Should have torn down flow rules"); -// -// let ret = unsafe { rte_eth_dev_stop(port_id) }; -// if ret != 0 { -// let err_msg = format!( -// "Failed to stop device: {ret}", -// ret = io::Error::from_raw_os_error(ret) -// ); -// fatal_error(err_msg.as_str()); -// } -// unsafe { -// rte_mempool_free(mbuf_pool); -// }; -// } - -// #[tracing::instrument(level = "info", skip(mbuf_pool))] -// fn init_port(port_id: u16, mbuf_pool: &mut rte_mempool) { -// let mut port_conf = rte_eth_conf { -// txmode: rte_eth_txmode { -// offloads: wrte_eth_tx_offload::VLAN_INSERT -// | wrte_eth_tx_offload::IPV4_CKSUM -// | wrte_eth_tx_offload::UDP_CKSUM -// | wrte_eth_tx_offload::TCP_CKSUM -// | wrte_eth_tx_offload::SCTP_CKSUM -// | wrte_eth_tx_offload::TCP_TSO, -// ..Default::default() -// }, -// ..Default::default() -// }; -// -// let mut txq_conf: rte_eth_txconf; -// let mut rxq_conf: rte_eth_rxconf = unsafe { std::mem::zeroed() }; -// let mut dev_info: rte_eth_dev_info = unsafe { std::mem::zeroed() }; -// -// let ret = unsafe { rte_eth_dev_info_get(port_id, &mut dev_info as *mut _) }; -// -// if ret != 0 { -// let err_msg = format!( -// "Failed to get device info: {ret}", -// ret = io::Error::from_raw_os_error(ret) -// ); -// fatal_error(err_msg.as_str()); -// } -// -// info!("Port ID {port_id}"); -// let driver_name = unsafe { CStr::from_ptr(dev_info.driver_name).to_str().unwrap() }; -// info!("Driver name: {driver_name}"); -// -// let nr_queues = 5; -// -// port_conf.txmode.offloads &= dev_info.tx_offload_capa; -// info!("Initialising port {port_id}"); -// let ret = unsafe { rte_eth_dev_configure(port_id, nr_queues, nr_queues, &port_conf) }; -// -// if ret != 0 { -// let err_msg = format!( -// "Failed to configure device: {ret}", -// ret = io::Error::from_raw_os_error(ret) -// ); -// fatal_error(err_msg.as_str()); -// } -// -// rxq_conf = dev_info.default_rxconf; -// rxq_conf.offloads = port_conf.rxmode.offloads; -// -// let nr_rx_descriptors = 512; -// -// // configure rx queues -// for queue_num in 0..nr_queues { -// info!("Configuring RX queue {queue_num}"); -// let ret = unsafe { -// rte_eth_rx_queue_setup( -// port_id, -// queue_num, -// nr_rx_descriptors, -// rte_eth_dev_socket_id(port_id) as c_uint, -// &rxq_conf, -// mbuf_pool, -// ) -// }; -// -// if ret < 0 { -// let err_msg = format!( -// "Failed to configure RX queue {queue_num}: {ret}", -// queue_num = queue_num, -// ret = io::Error::from_raw_os_error(ret) -// ); -// fatal_error(err_msg.as_str()); -// } -// info!("RX queue {queue_num} configured"); -// } -// -// txq_conf = dev_info.default_txconf; -// txq_conf.offloads = port_conf.txmode.offloads; -// -// for queue_num in 0..nr_queues { -// info!("Configuring TX queue {queue_num}"); -// let ret = unsafe { -// rte_eth_tx_queue_setup( -// port_id, -// queue_num, -// nr_rx_descriptors, -// rte_eth_dev_socket_id(port_id) as c_uint, -// &txq_conf as *const _, -// ) -// }; -// -// if ret < 0 { -// let err_msg = format!( -// "Failed to configure TX queue {queue_num}: {ret}", -// queue_num = queue_num, -// ret = io::Error::from_raw_os_error(ret) -// ); -// fatal_error(err_msg.as_str()); -// } -// info!("TX queue {queue_num} configured"); -// } -// -// info!("Port {port_id} configured"); -// -// let ret = unsafe { rte_eth_promiscuous_enable(port_id) }; -// if ret != 0 { -// let err_msg = format!( -// "Failed to enable promiscuous mode: {ret}", -// ret = io::Error::from_raw_os_error(ret) -// ); -// fatal_error(err_msg.as_str()); -// } -// info!("Port {port_id} set to promiscuous mode"); -// -// let ret = unsafe { rte_eth_dev_start(port_id) }; -// if ret != 0 { -// let err_msg = format!( -// "Failed to start device: {ret}", -// ret = io::Error::from_raw_os_error(ret) -// ); -// fatal_error(err_msg.as_str()); -// } -// -// info!("Port {port_id} started"); -// assert_link_status(port_id); -// info!("Port {port_id} has been initialized"); -// } -// - -// fn assert_link_status(port_id: u16) { -// let mut link: rte_eth_link = unsafe { std::mem::zeroed() }; -// let rep_cnt = 900; -// let mut link_get_err = -EINVAL; -// for _cycle in 0..rep_cnt { -// link_get_err = unsafe { rte_eth_link_get(port_id, &mut link as *mut _) }; -// if link_get_err == 0 { -// break; -// } -// std::thread::sleep(std::time::Duration::from_millis(10)); -// } -// -// if link_get_err < 0 { -// let err_str = unsafe { rte_strerror(-link_get_err) }; -// let err_msg = format!( -// "Failed to get link status ({link_get_err}): {err_str}", -// err_str = unsafe { CStr::from_ptr(err_str) }.to_str().unwrap() -// ); -// fatal_error(err_msg.as_str()); -// } -// -// // TODO: assert link status! -// } const MAX_PATTERN_NUM: usize = 8; @@ -947,7 +633,7 @@ fn eal_main() { .init(); let eal_args = vec![ - "-c", + "-src", "0xffffffffff", "--in-memory", // "--huge-dir", @@ -955,7 +641,7 @@ fn eal_main() { "--huge-dir", "/mnt/huge/1G", "--allow", - "0000:01:00.0,dv_flow_en=1", + "0000:02:00.0,dv_flow_en=1", // "--trace=.*", // "--iova-mode=va", // "-l", @@ -964,22 +650,6 @@ fn eal_main() { // "0000:01:00.1", "--huge-worker-stack=8192", "--socket-mem=4096,4096,4096,4096", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool.so", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool_ring.so", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool_stack.so", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_bus_pci.so", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_net_mlx5.so", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_common_mlx5.so", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_regex_mlx5.so", - // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_vdpa_mlx5.so", ]; let rte = eal::init(eal_args).unwrap_or_else(|err| match err { @@ -1081,7 +751,7 @@ fn eal_main() { my_dev.start().unwrap(); let mut start = Instant::now(); - + let flows: Vec<_> = (0..50_000_000) .map(|i: u32| { if i % 100_000 == 0 { @@ -1108,7 +778,7 @@ fn eal_main() { ) }) .collect(); - + warn!("Flows created"); // for i in 0..2000 { @@ -1143,16 +813,6 @@ fn eal_main() { }); } -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn call_eal_main() { - eal_main(); - } -} - #[tracing::instrument(level = "debug")] fn generate_modify_field_flow( i: u32, @@ -1201,6 +861,7 @@ fn generate_modify_field_flow( } let mut eth_mask = rte_flow_item_eth::default(); + unsafe { eth_mask.annon1.hdr.dst_addr = rte_ether_addr { addr_bytes: [0xff; 6], diff --git a/scripts/re-link-dev-env.sh b/scripts/re-link-dev-env.sh new file mode 100755 index 00000000..f3cbda62 --- /dev/null +++ b/scripts/re-link-dev-env.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +declare script_dir +script_dir="$(readlink -e "$(dirname "$(readlink -e "${BASH_SOURCE[0]}")")")" +declare -r script_dir + +#mkdir -p relinked +#find -L ./dev-env/ -not -path nix -exec ./scripts/smart-link.sh {} ./relinked/{} \; + + +#sudo find ./dev-env/nix/ -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; + +sudo find ./dev-env -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; +#find ./dev-env/bin -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; +#find ./dev-env/sysroot -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; + +#find ./dev-env/sysroot -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; + + +#for dir in ./dev-env/*; do +# if [ "${dir}" = "./dev-env/nix" ]; then +# continue +# fi +# find "${dir}/" -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; +#done +# +#for dir in ./dev-env/sysroot/*; do +# find "${dir}/" -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; +#done +# +#for dir in ./dev-env/sysroot/*/*; do +# find "${dir}/" -type l -lname '/nix/*' -exec "${script_dir}/re-link.sh" {} \; +#done + diff --git a/scripts/re-link.sh b/scripts/re-link.sh new file mode 100755 index 00000000..cbff733b --- /dev/null +++ b/scripts/re-link.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -euo pipefail + +deref() { + stat -c%N "$1" | sed -r 's/.*-> .//;s/.$//' +} + +nix_path="$(pwd)/dev-env/nix" +store_path="$(realpath -m --relative-to="/nix" "$(deref "$1")")" +#store_path="$(realpath -m --relative-base=/nix "$(readlink -m "$1")")" +new_target="$nix_path/$store_path" +mv "$1" "$1.bak" +if ln -rs "$new_target" "$1"; then + rm "$1.bak" +else + mv "$1.bak" "$1" +fi diff --git a/scripts/smart-link.sh b/scripts/smart-link.sh new file mode 100755 index 00000000..21bef4b3 --- /dev/null +++ b/scripts/smart-link.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [ -h "$1" ]; then + new_base="$(pwd)/relinked" + store_path="$(realpath -sm --relative-to="/nix" "$(readlink "$1")")" + new_target="$new_base/$store_path" + ln -s "$1" "$new_target" +fi diff --git a/scripts/test-runner.sh b/scripts/test-runner.sh new file mode 100755 index 00000000..c9fbcf2a --- /dev/null +++ b/scripts/test-runner.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +set -euo pipefail + +die() { + printf -- "ERROR: %s\n" "$@" >&2 + exit 1 +} + +_prog="${1}" + +if [ -z "${_prog}" ]; then + die "Usage: ${0} [args...]" +fi + +if [ ! -x "${_prog}" ]; then + die "${_prog} is not executable by user $(id -un)" +fi + +if [ -h "${_prog}" ]; then + die "${_prog} is a symbolic link, refusing to set caps" +fi + +if [ ! -O "${_prog}" ]; then + die "${_prog} is not owned by the current user, refusing to set caps" +fi + +if [ ! -G "${_prog}" ]; then + die "${_prog} is not owned by the current user's group, refusing to set caps" +fi + +SUDO="/bin/sudo" +SETCAP="/bin/setcap" +CHMOD="/bin/chmod" + +#cleanup() { +# "${SUDO}" /bin/setcap -r "${_prog}" +# "${SUDO}" /bin/chmod u=rwx "${_prog}" +#} +#trap cleanup EXIT + +# TODO: commenting this as a CI hack +#"${SUDO}" "${CHMOD}" u=rx,go= "${_prog}" +#"${SUDO}" "${SETCAP}" -r "${_prog}" 2>/dev/null || true +## TODO: work on removing or limiting cap_sys_rawio cuz that's a big one +#"${SUDO}" "${SETCAP}" cap_sys_rawio,cap_net_admin,cap_net_raw,cap_ipc_lock=ep "${_prog}" +exec "${@}" diff --git a/shell.nix b/shell.nix index b65195b7..4c27e41f 100644 --- a/shell.nix +++ b/shell.nix @@ -1,3 +1 @@ -{ default ? import ./default.nix {}, - nixpkgs ? default.nixpkgs, -}: default.shell.env \ No newline at end of file +{ default ? import ./default.nix {} }: default.shell