diff --git a/CyberChef_backport_changes-10.22.1.txt b/CyberChef_backport_changes-10.22.1.txt
new file mode 100644
index 00000000..ed42087f
--- /dev/null
+++ b/CyberChef_backport_changes-10.22.1.txt
@@ -0,0 +1,5755 @@
+CHANGED: .editorconfig — mkilijanek/.editorconfig +++ gchq/.editorconfig
+@@ -12,3 +12,7 @@ [{package.json,.travis.yml,nightwatch.json}]
+
+indent_style = space
+
+indent_size = 2
+
+-
+
++[.github/**.yml]
+
++indent_style = space
+
++indent_size = 2
+
+REMOVED in gchq (exists in mkilijanek): .github/dependabot.yml REMOVED
+in gchq (exists in mkilijanek): .github/workflows/codeql-analysis.yml
+REMOVED in gchq (exists in mkilijanek): .github/workflows/codeql.yml
+REMOVED in gchq (exists in mkilijanek):
+.github/workflows/dependency-review.yml
+
+CHANGED: .github/workflows/master.yml —
+mkilijanek/.github/workflows/master.yml +++
+gchq/.github/workflows/master.yml @@ -2,129 +2,64 @@
+
+on:
+
+workflow_dispatch:
+
+- inputs:
+
+- nightly:
+
+- description: "Tag build as nightly"
+
+- required: false
+
+- default: "false"
+
+ push:
+
+ branches:
+
+- - master
+
+- schedule:
+
+- Weekly build and publish to keep images fresh
+
+- - cron: ‘0 3 * * 1’
+
+- - master
+
+-env:
+
+- REGISTRY: ghcr.io
+
+- IMAGE_NAME: ${{ github.repository }}
+
+- PLATFORMS: linux/amd64,linux/arm64
+
+-
+
+-env:
+
+- REGISTRY: ghcr.io
+
+- IMAGE_NAME: ${{ github.repository }}
+
+- PLATFORMS: linux/amd64,linux/arm64
+
++permissions:
+
+- contents: read
+
+jobs:
+
+main:
+
+- permissions:
+
+- contents: write
+
+- pages: write
+
+ runs-on: ubuntu-latest
+
+ steps:
+
+- - uses: actions/checkout@v3
+
+- - uses: actions/checkout@v6
+
+- - name: Set node version
+
+- uses: actions/setup-node@v3
+
+- with:
+
+- node-version: '18.x'
+
+- - name: Set node version
+
+- uses: actions/setup-node@v6
+
+- with:
+
+- node-version: 18
+
+- registry-url: "https://registry.npmjs.org"
+
+- - name: Install
+
+- run: |
+
+- export DETECT_CHROMEDRIVER_VERSION=true
+
+- npm install
+
+- npm run setheapsize
+
+- - name: Install
+
+- run: |
+
+- export DETECT_CHROMEDRIVER_VERSION=true
+
+- npm install
+
+- npm run setheapsize
+
+- - name: Lint
+
+- run: npx grunt lint
+
+- - name: Lint
+
+- run: npx grunt lint
+
+- - name: Unit Tests
+
+- run: |
+
+- npm test
+
+- npm run testnodeconsumer
+
+- - name: Unit Tests
+
+- run: |
+
+- npm test
+
+- npm run testnodeconsumer
+
+- - name: Production Build
+
+- if: success()
+
+- run: npx grunt prod --msg="Version 10 is here! Read about the new features here"
+
+- - name: Production Build
+
+- if: success()
+
+- run: npx grunt prod --msg=""
+
+- - name: Generate sitemap
+
+- run: npx grunt exec:sitemap
+
+- - name: Generate sitemap
+
+- run: npx grunt exec:sitemap
+
+- - name: UI Tests
+
+- if: success()
+
+- run: |
+
+- sudo apt-get install xvfb
+
+- xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
+
+- - name: UI Tests
+
+- if: success()
+
+- run: |
+
+- sudo apt-get install xvfb
+
+- xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
+
+- - name: Prepare for GitHub Pages
+
+- if: success()
+
+- run: npx grunt copy:ghPages
+
+- - name: Prepare for GitHub Pages
+
+- if: success()
+
+- run: npx grunt copy:ghPages
+
+- - name: Deploy to GitHub Pages
+
+- if: success() && github.ref == 'refs/heads/master'
+
+- uses: crazy-max/ghaction-github-pages@v3
+
+- with:
+
+- target_branch: gh-pages
+
+- build_dir: ./build/prod
+
+- env:
+
+- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+-
+
+- docker-images:
+
+- name: Build & Publish Docker Images
+
+- runs-on: ubuntu-latest
+
+- needs: main
+
+- if: github.ref == ‘refs/heads/master’
+
+- permissions:
+
+- contents: read
+
+- packages: write
+
+- steps:
+
+- - uses: actions/checkout@v4
+
+-
+
+- - name: Set up QEMU
+
+- uses: docker/setup-qemu-action@v3
+
+-
+
+- - name: Set up Docker Buildx
+
+- uses: docker/setup-buildx-action@v3
+
+-
+
+- - name: Log in to GitHub Container Registry
+
+- uses: docker/login-action@v3
+
+- with:
+
+- registry: ${{ env.REGISTRY }}
+
+- username: ${{ github.actor }}
+
+- password: ${{ secrets.GITHUB_TOKEN }}
+
+-
+
+- - name: Set extra tags
+
+- run: |
+
+- if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ "${{ github.event.inputs.nightly }}" = "true" ]; then
+
+- echo "EXTRA_TAGS=type=raw,value=nightly" >> $GITHUB_ENV
+
+- else
+
+- echo "EXTRA_TAGS=" >> $GITHUB_ENV
+
+- fi
+
+-
+
+- - name: Docker metadata
+
+- id: meta
+
+- uses: docker/metadata-action@v5
+
+- with:
+
+- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+- tags: |
+
+- type=raw,value=latest
+
+- type=sha,format=long
+
+- ${{ env.EXTRA_TAGS }}
+
+-
+
+- - name: Build and push multi-arch image
+
+- uses: docker/build-push-action@v5
+
+- with:
+
+- context: .
+
+- file: ./Dockerfile
+
+- platforms: ${{ env.PLATFORMS }}
+
+- push: true
+
+- tags: ${{ steps.meta.outputs.tags }}
+
+- labels: ${{ steps.meta.outputs.labels }}
+
+- cache-from: type=gha
+
+- cache-to: type=gha,mode=max
+
+- - name: Deploy to GitHub Pages
+
+- if: success() && github.ref == 'refs/heads/master'
+
+- uses: crazy-max/ghaction-github-pages@v3
+
+- with:
+
+- target_branch: gh-pages
+
+- build_dir: ./build/prod
+
+- env:
+
+- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+CHANGED: .github/workflows/pull_requests.yml —
+mkilijanek/.github/workflows/pull_requests.yml +++
+gchq/.github/workflows/pull_requests.yml @@ -1,4 +1,7 @@ name: “Pull
+Requests”
+
+-
+
++permissions:
+
+- contents: read
+
+on:
+
+workflow_dispatch:
+
+@@ -9,47 +12,46 @@ main:
+
+ runs-on: ubuntu-latest
+
+ steps:
+
+- - uses: actions/checkout@v3
+
+- - uses: actions/checkout@v6
+
+- - name: Set node version
+
+- uses: actions/setup-node@v3
+
+- with:
+
+- node-version: '18.x'
+
+- - name: Set node version
+
+- uses: actions/setup-node@v6
+
+- with:
+
+- node-version: 18
+
+- registry-url: "https://registry.npmjs.org"
+
+- - name: Install
+
+- run: |
+
+- export DETECT_CHROMEDRIVER_VERSION=true
+
+- npm install
+
+- npm run setheapsize
+
+- - name: Install
+
+- run: |
+
+- export DETECT_CHROMEDRIVER_VERSION=true
+
+- npm install
+
+- npm run setheapsize
+
+- - name: Lint
+
+- run: npx grunt lint
+
+- - name: Lint
+
+- run: npx grunt lint
+
+- - name: Unit Tests
+
+- run: |
+
+- npm test
+
+- npm run testnodeconsumer
+
+- - name: Unit Tests
+
+- run: |
+
+- npm test
+
+- npm run testnodeconsumer
+
+- - name: Production Build
+
+- if: success()
+
+- run: npx grunt prod
+
+- - name: Production Build
+
+- if: success()
+
+- run: npx grunt prod
+
+- - name: Production Image Build
+
+- if: success()
+
+- id: build-image
+
+- uses: redhat-actions/buildah-build@v2
+
+- with:
+
+- # Not being uploaded to any registry, use a simple name to allow Buildah to build correctly.
+
+- image: cyberchef
+
+- containerfiles: ./Dockerfile
+
+- platforms: linux/amd64
+
+- oci: true
+
+- # Webpack seems to use a lot of open files, increase the max open file limit to accomodate.
+
+- extra-args: |
+
+- --ulimit nofile=10000
+
+- - name: Set up Docker Buildx
+
+- uses: docker/setup-buildx-action@v3
+
+- - name: UI Tests
+
+- if: success()
+
+- run: |
+
+- sudo apt-get install xvfb
+
+- xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
+
+- - name: Set up QEMU
+
+- uses: docker/setup-qemu-action@v3
+
+-
+
+- - name: Production Image Build
+
+- if: success()
+
+- id: build-image
+
+- uses: docker/build-push-action@v6
+
+- with:
+
+- platforms: linux/amd64,linux/arm64
+
+- - name: UI Tests
+
+- if: success()
+
+- run: |
+
+- sudo apt-get install xvfb
+
+- xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
+
+CHANGED: .github/workflows/releases.yml —
+mkilijanek/.github/workflows/releases.yml +++
+gchq/.github/workflows/releases.yml @@ -4,7 +4,10 @@ workflow_dispatch:
+
+push:
+
+ tags:
+
+- - ’v*’
+
+- - "v*"
+
+-
+
++permissions:
+
+- contents: read
+
+env:
+
+REGISTRY: ghcr.io
+
+@@ -14,83 +17,110 @@
+
+jobs:
+
+main:
+
+- permissions:
+
+- packages: write
+
+- contents: write
+
+ runs-on: ubuntu-latest
+
+ steps:
+
+- - uses: actions/checkout@v3
+
+- - uses: actions/checkout@v6
+
+- - name: Set node version
+
+- uses: actions/setup-node@v3
+
+- with:
+
+- node-version: '18.x'
+
+- - name: Set node version
+
+- uses: actions/setup-node@v6
+
+- with:
+
+- node-version: 18
+
+- registry-url: "https://registry.npmjs.org"
+
+- - name: Install
+
+- run: |
+
+- export DETECT_CHROMEDRIVER_VERSION=true
+
+- npm ci
+
+- npm run setheapsize
+
+- - name: Install
+
+- run: |
+
+- export DETECT_CHROMEDRIVER_VERSION=true
+
+- npm ci
+
+- npm run setheapsize
+
+- - name: Lint
+
+- run: npx grunt lint
+
+- - name: Lint
+
+- run: npx grunt lint
+
+- - name: Unit Tests
+
+- run: |
+
+- npm test
+
+- npm run testnodeconsumer
+
+- - name: Unit Tests
+
+- run: |
+
+- npm test
+
+- npm run testnodeconsumer
+
+- - name: Production Build
+
+- run: npx grunt prod
+
+- - name: Production Build
+
+- run: npx grunt prod
+
+- - name: UI Tests
+
+- run: |
+
+- sudo apt-get install xvfb
+
+- xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
+
+- - name: UI Tests
+
+- run: |
+
+- sudo apt-get install xvfb
+
+- xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
+
+- - name: Image Metadata
+
+- id: image-metadata
+
+- uses: docker/metadata-action@v4
+
+- with:
+
+- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+- tags: |
+
+- type=semver,pattern={{major}}
+
+- type=semver,pattern={{major}}.{{minor}}
+
+- type=semver,pattern={{version}}
+
+- - name: Set up Docker Buildx
+
+- uses: docker/setup-buildx-action@v3
+
+- - name: Production Image Build
+
+- id: build-image
+
+- uses: redhat-actions/buildah-build@v2
+
+- with:
+
+- tags: ${{ steps.image-metadata.outputs.tags }}
+
+- labels: ${{ steps.image-metadata.outputs.labels }}
+
+- containerfiles: ./Dockerfile
+
+- platforms: linux/amd64,linux/arm64
+
+- oci: true
+
+- # enable build layer caching between platforms
+
+- layers: true
+
+- # Webpack seems to use a lot of open files, increase the max open file limit to accomodate.
+
+- extra-args: |
+
+- --ulimit nofile=10000
+
+- - name: Set up QEMU
+
+- uses: docker/setup-qemu-action@v3
+
+- - name: Publish to GHCR
+
+- uses: redhat-actions/push-to-registry@v2
+
+- with:
+
+- image: ${{ steps.build-image.outputs.image }}
+
+- tags: ${{ steps.build-image.outputs.tags }}
+
+- registry: ${{ env.REGISTRY }}
+
+- username: ${{ env.REGISTRY_USER }}
+
+- password: ${{ env.REGISTRY_PASSWORD }}
+
+- - name: Image Metadata
+
+- id: image-metadata
+
+- uses: docker/metadata-action@v4
+
+- with:
+
+- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+- tags: |
+
+- type=semver,pattern={{major}}
+
+- type=semver,pattern={{major}}.{{minor}}
+
+- type=semver,pattern={{version}}
+
+- - name: Upload Release Assets
+
+- id: upload-release-assets
+
+- uses: svenstaro/upload-release-action@v2
+
+- with:
+
+- repo_token: ${{ secrets.GITHUB_TOKEN }}
+
+- file: build/prod/*.zip
+
+- tag: ${{ github.ref }}
+
+- overwrite: true
+
+- file_glob: true
+
+- body: "See the [CHANGELOG](https://github.com/gchq/CyberChef/blob/master/CHANGELOG.md) and [commit messages](https://github.com/gchq/CyberChef/commits/master) for details."
+
+- - name: Log in to GHCR
+
+- uses: docker/login-action@v3
+
+- with:
+
+- registry: ${{ env.REGISTRY }}
+
+- username: ${{ env.REGISTRY_USER }}
+
+- password: ${{ env.REGISTRY_PASSWORD }}
+
+- - name: Publish to NPM
+
+- uses: JS-DevTools/npm-publish@v1
+
+- with:
+
+- token: ${{ secrets.NPM_TOKEN }}
+
+- - name: Publish to GHCR
+
+- uses: docker/build-push-action@v6
+
+- with:
+
+- context: .
+
+- push: true
+
+- tags: ${{ steps.image-metadata.outputs.tags }}
+
+- labels: ${{ steps.image-metadata.outputs.labels }}
+
+- platforms: linux/amd64,linux/arm64
+
+-
+
+- - name: Upload Release Assets
+
+- id: upload-release-assets
+
+- uses: svenstaro/upload-release-action@v2
+
+- with:
+
+- repo_token: ${{ secrets.GITHUB_TOKEN }}
+
+- file: build/prod/*.zip
+
+- tag: ${{ github.ref }}
+
+- overwrite: true
+
+- file_glob: true
+
+- body: "See the [CHANGELOG](https://github.com/gchq/CyberChef/blob/master/CHANGELOG.md) and [commit messages](https://github.com/gchq/CyberChef/commits/master) for details."
+
+-
+
+- npm-publish:
+
+- permissions:
+
+- id-token: write
+
+- contents: read
+
+- needs: main
+
+- runs-on: ubuntu-latest
+
+- steps:
+
+- - uses: actions/checkout@v6
+
+-
+
+- - name: Set node version
+
+- uses: actions/setup-node@v6
+
+- with:
+
+- node-version: 18
+
+- registry-url: "https://registry.npmjs.org"
+
+-
+
+- - name: Install
+
+- run: npm ci
+
+-
+
+- - name: Create machine generated files
+
+- run: npm run node
+
+-
+
+- - name: Reset node version ready for publish
+
+- uses: actions/setup-node@v6
+
+- with:
+
+- node-version: ^24.5
+
+- registry-url: "https://registry.npmjs.org"
+
+-
+
+- - name: Publish to NPM
+
+- run: npm publish
+
+REMOVED in gchq (exists in mkilijanek):
+.github/workflows/security-auto-fix.yml
+
+CHANGED: CHANGELOG.md — mkilijanek/CHANGELOG.md +++ gchq/CHANGELOG.md @@
+-12,6 +12,104 @@
+
+## Details
+
+-
+
++### [10.22.0] - 2026-02-11
+
++- Separate npm publish out into separate job and run with Node 24.5
+[@GCHQDeveloper581] | [#2188]
+
++- Fixed Percent delimiter for hex encoding [@beneri] [@C85297] |
+[#2137]
+
++- Added the ability to paste one or more Images from the Clipboard
+[@t-martine] [@a3957273] [@C85297] | [#1876]
+
++- Quoted Printable - consistent reference to ‘email’ [@wesinator] |
+[#2186]
+
++- Fix freeze when output text decoding fails [@Raka-loah] | [#1573]
+
++- Update Browserslist DB [@C85297] | [#2183]
+
++- Add contents write permission to releases workflow [@C85297] |
+[#2182]
+
++- Fix release workflow permissions [@C85297] | [#2181]
+
+-
+
++### [10.21.0] - 2026-02-05
+
++- Fix import operations with special chars in them [@d98762625]
+[@jg42526] | [#1040]
+
++- Remove custom CodeQL workflow [@C85297] | [#2176]
+
++- Fix code scanning warnings in workflows [@GCHQDeveloper581] | [#2177]
+
++- Use NPM trusted publishing [@C85297] [@GCHQDeveloper581] | [#2174]
+
++- Fix: Correctly parse xxd odd byte hexdumps [@ThomasNotTom]
+[@GCHQDeveloper581] | [#2058]
+
++- Update Sitemap URLs to Use Valid Paths in sitemap.mjs [@rbpi]
+[@C85297] | [#1861]
+
++- Use recommended GitHub Actions to build image [@AlexGustafsson]
+[@C85297] | [#2055]
+
++- Remove version 10 message from banner [@C85297] | [#2169]
+
++- Bump form-data from 4.0.1 to 4.0.5 | [#2175]
+
++- Bump node-forge from 1.3.1 to 1.3.3 | [#2173]
+
++- Update crypto browserify [@C85297] | [#2172]
+
++- Update kbpgp package (resolves #2135) [@GCHQDeveloper581] | [#2136]
+
++- Fix the processing of ALPNs for JA4 to align with new specification
+update [@tuliperis] | [#2165]
+
++- Add Bech32 and Bech32m encoding/decoding operations [@thomasxm] |
+[#2159]
+
++- Exclude Delete character from hex dump output [@mikecat] [@C85297] |
+[#2086]
+
++- Tiny typo fix in “To Base85” operation [@twostraws] | [#2118]
+
++- Bump jsonpath-plus [@C85297] | [#2166]
+
+-
+
++### [10.20.0] - 2026-01-28
+
++- Fixed Optical Character Recognition and added tests [@n1474335] |
+[ab37c1e]
+
++- Fixed JA4 version fallback value [@n1474335] | [7a5225c]
+
++- Updated chromedriver [@n1474335] | [0e82e4b]
+
++- Fixed RSA Sign and Verify character encodings [@n1474335] | [895a929]
+
++- Updated chromedriver [@n1474335] | [d3adfc7]
+
++- Added message format arg to RSA Verify operation [@n1474335] |
+[47c85a1]
+
++- Add operation for parsing X.509 CRLs [@robinsandhu] | [#1887]
+
++- Fix typo in description of JWT Sign recipe [@GuilhermoReadonly] |
+[#1961]
+
++- Corrected path to generateNodeIndex.mjs [@simonarnell] | [#1959]
+
++- Add ‘header’ ingredient to JWT Sign operation [@RandomByte] | [#1957]
+
++- Add Parse TLS record operation [@c65722] | [#1936]
+
++- Automatically detect chrome driver version [@gchq] | [#1972]
+
++- Add Strip UDP header operation [@c65722] | [#1900]
+
++- Add Strip TCP header operation [@c65722] | [#1898]
+
++- Webpack compress with gzip and brotli [@max0x53] | [#1955]
+
++- add offset field to ‘Add Line Numbers’ operation [@Adamkadaban] |
+[#1866]
+
++- Disable flakey URL test [@a3957273] | [#1973]
+
++- Add Strip IPv4 header operation [@c65722] | [#1899]
+
++- IPv6 Transition Operation [@jb30795] | [#1780]
+
++- fix: Blowfish - ignore IV length in ECB mode [@FranciscoPombal] |
+[#1902]
+
++- Add ‘Drop nth bytes’ operation [@Oshawk] | [#1914]
+
++- Add ‘Take nth bytes’ operation [@Oshawk] | [#1915]
+
++- Add Leet Speak [@bartblaze] | [#1971]
+
++- Fix Generate TOTP & HOPT [@exactlyaron] | [#1966]
+
++- Updated luhn checksum operation to work with different bases [@k3ach]
+| [#1933]
+
++- automatically theme mode based on user preference [@vs4vijay] |
+[#1921]
+
++- fix: DES/Triple DES - misleading error messages [@FranciscoPombal] |
+[#1904]
+
++- fix: ROT13 - shifting numbers by negative amounts [@FranciscoPombal]
+| [#1903]
+
++- Introduce Yubico’s Modhex for Conversion [@linuxgemini] | [#1105]
+
++- Feature: MIME RFC2047 Decoding [@MShwed] | [#630]
+
++- CC-1889 add _ option [@depperm] | [#1977]
+
++- chore(root): add cspell [@evenstensberg] | [#1976]
+
++- Preserve uppercase for Leet Speak [@bartblaze] | [#1981]
+
++- Load the user’s preferred color scheme if the URL contains an invalid
+theme [@0xh3xa] | [#2007]
+
++- Add SM2 Encrypt and Decrypt Operations [@flakjacket95] | [#1909]
+
++- Support jq as an operation. [@zhzy0077] | [#1604]
+
++- Add fingerprints to the ‘Parse X.509 certificate’ operation
+[@JSCU-CNI] | [#1863]
+
++- Added a JSON to YAML and a YAML to JSON operation [@ccarpo] | [#1286]
+
++- Add CRC Operation [@r4mos] | [#1993]
+
++- Bug Fix: selected theme not loading when refreshing [@0xh3xa] |
+[#2006]
+
++- Fix(RecipeWaiter): sanitize user input in addOperation to prevent XSS
+[@0xh3xa] | [#2014]
+
++- Docker multiplatform build support [@PathToLife] | [#1974]
+
++- Add Base32 Hex Extended Alphabet and Base32 Tests. [@peterc-s] |
+[#1991]
+
++- Add ECB/NoPadding and CBC/NoPadding support to AES encryption
+[@plvie] | [#2013]
+
++- Add new operation: PHP Serialize [@brun0ne] | [#1548]
+
++- Push input through postmessage [@kenduguay1] | [#1992]
+
++- Add jsonata query operation [@jonking-ajar] | [#1587]
+
++- Re-enable Npm Release in github workflows [@PathToLife] | [#2031]
+
++- Add to ECDSA Verify the message format [@r4mos] | [#2027]
+
++- Added alternating caps functionality [@sw5678] | [#1897]
+
++- XOR Checksum operation added [@jg42526] | [#2035]
+
++- Add GenerateAllChecksums operation * Remove checksums from
+GenerateAllHashes operation [@es45411] | [66d445c]
+
++- Update GenerateAllChecksums infoURL [@es45411] | [#2037]
+
++- Add toggle “+” character to URLDecode operation [@es45411] | [#2040]
+
++- Workaround for Safari load bug [@GCHQDeveloper94872] | [#2038]
+
++- Updated Dockerfile to correctly build on ARM64 platforms [@Sma-Das] |
+[#2042]
+
++- Addresses bug report #2008 Added explicit support for octal IP
+addresses. Changed approach to IPv4 regex to be string manipulation
+generated. Added some unit tests for IP address parsing - probably not
+full coverage. Added lookahead and lookbehind tricks to resolve warned
+issue that 1.2.3.256 would still be extracted as 1.2.3.25. Now only
+accepts valid IP addresses. Warning replaced with clause about infinite
+length dotted decimal forms. [@gchqdev364] | [#2041]
+
++- Remove trim from rail fence [@Odyhibit] | [#1986]
+
++- Fix email regex [@ericli-splunk] | [#2025]
+
++- Add Blake3 hashing [@xumptex] | [#2023]
+
++- Use defaultIndex instead of 0 in transformArgs [@bartvanandel] |
+[#2015]
+
++- Add “Generate UUID” and “Analyse UUID” operations [@bartvanandel] |
+[#2011]
+
++- Add new operation: Template [@kendallgoto] | [#2021]
+
++- Add more clear build instructions [@remingtr] | [#1873]
+
++- Show On Map updated to use leaflet over WikiMedia [@0xff1ce] |
+[#1884]
+
++- Fixed ToDecimal signed logic [@starplanet] | [#1545]
+
++- Use BigInt for encoding/decoding VarInt [@mikecat] | [#1978]
+
+### 10.19.0 - 2024-06-21
+
+- Add support for ECDSA and DSA in ‘Parse CSR’ [@robinsandhu] |
+ [#1828]
+
+@@ -440,6 +538,9 @@ ## [4.0.0] - 2016-11-28
+
+- Initial open source commit [@n1474335] | b1d73a72
+
++[10.22.0]: https://github.com/gchq/CyberChef/releases/tag/v10.22.0
+
++[10.21.0]: https://github.com/gchq/CyberChef/releases/tag/v10.21.0
+
++[10.20.0]: https://github.com/gchq/CyberChef/releases/tag/v10.20.0
+
+@@ -630,6 +731,72 @@ [@cplussharp]: https://github.com/cplussharp
+
+[@robinsandhu]: https://github.com/robinsandhu
+
+[@eltociear]: https://github.com/eltociear
+
++[@GuilhermoReadonly]: https://github.com/GuilhermoReadonly
+
++[@simonarnell]: https://github.com/simonarnell
+
++[@RandomByte]: https://github.com/RandomByte
+
++[@c65722]: https://github.com/c65722
+
++[@c65722]: https://github.com/c65722
+
++[@c65722]: https://github.com/c65722
+
++[@max0x53]: https://github.com/max0x53
+
++[@Adamkadaban]: https://github.com/Adamkadaban
+
++[@c65722]: https://github.com/c65722
+
++[@jb30795]: https://github.com/jb30795
+
++[@FranciscoPombal]: https://github.com/FranciscoPombal
+
++[@Oshawk]: https://github.com/Oshawk
+
++[@Oshawk]: https://github.com/Oshawk
+
++[@bartblaze]: https://github.com/bartblaze
+
++[@exactlyaron]: https://github.com/exactlyaron
+
++[@k3ach]: https://github.com/k3ach
+
++[@vs4vijay]: https://github.com/vs4vijay
+
++[@FranciscoPombal]: https://github.com/FranciscoPombal
+
++[@FranciscoPombal]: https://github.com/FranciscoPombal
+
++[@linuxgemini]: https://github.com/linuxgemini
+
++[@depperm]: https://github.com/depperm
+
++[@evenstensberg]: https://github.com/evenstensberg
+
++[@bartblaze]: https://github.com/bartblaze
+
++[@0xh3xa]: https://github.com/0xh3xa
+
++[@flakjacket95]: https://github.com/flakjacket95
+
++[@zhzy0077]: https://github.com/zhzy0077
+
++[@JSCU-CNI]: https://github.com/JSCU-CNI
+
++[@ccarpo]: https://github.com/ccarpo
+
++[@r4mos]: https://github.com/r4mos
+
++[@0xh3xa]: https://github.com/0xh3xa
+
++[@0xh3xa]: https://github.com/0xh3xa
+
++[@PathToLife]: https://github.com/PathToLife
+
++[@peterc-s]: https://github.com/peterc-s
+
++[@plvie]: https://github.com/plvie
+
++[@kenduguay1]: https://github.com/kenduguay1
+
++[@jonking-ajar]: https://github.com/jonking-ajar
+
++[@PathToLife]: https://github.com/PathToLife
+
++[@r4mos]: https://github.com/r4mos
+
++[@jg42526]: https://github.com/jg42526
+
++[@es45411]: https://github.com/es45411
+
++[@gchq]: https://github.com/gchq
+
++[@gchqdev364]: https://github.com/gchqdev364
+
++[@GCHQDeveloper94872]: https://github.com/GCHQDeveloper94872
+
++[@Sma-Das]: https://github.com/Sma-Das
+
++[@gchq]: https://github.com/gchq
+
++[@Odyhibit]: https://github.com/Odyhibit
+
++[@ericli-splunk]: https://github.com/ericli-splunk
+
++[@xumptex]: https://github.com/xumptex
+
++[@bartvanandel]: https://github.com/bartvanandel
+
++[@bartvanandel]: https://github.com/bartvanandel
+
++[@kendallgoto]: https://github.com/kendallgoto
+
++[@remingtr]: https://github.com/remingtr
+
++[@0xff1ce]: https://github.com/0xff1ce
+
++[@starplanet]: https://github.com/starplanet
+
++[@C85297]: https://github.com/C85297
+
++[@GCHQDeveloper581]: https://github.com/GCHQDeveloper581
+
++[@ThomasNotTom]: https://github.com/ThomasNotTom
+
++[@rbpi]: https://github.com/rbpi
+
++[@AlexGustafsson]: https://github.com/AlexGustafsson
+
++[@tuliperis]: https://github.com/tuliperis
+
++[@thomasxm]: https://github.com/thomasxm
+
++[@twostraws]: https://github.com/twostraws
+
++[@beneri]: https://github.com/beneri
+
++[@t-martine]: https://github.com/t-martine
+
++[@wesinator]: https://github.com/wesinator
+
++[@Raka-loah]: https://github.com/Raka-loah
+
+@@ -642,6 +809,46 @@ [760eff4]:
+https://github.com/gchq/CyberChef/commit/760eff49b5307aaa3104c5e5b437ffe62299acd1
+
++[66d445c]:
+https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
+
++[ab37c1e]:
+https://github.com/gchq/CyberChef/commit/ab37c1e562dbee0495ed32876ecbb8225282af25
+
++[965570d]:
+https://github.com/gchq/CyberChef/commit/965570d2504c17ee1f96211a1dc10ed40cd2b332
+
++[a477f47]:
+https://github.com/gchq/CyberChef/commit/a477f47aecd01d78b11fe186ed4b20d9c487cfac
+
++[7a5225c]:
+https://github.com/gchq/CyberChef/commit/7a5225c961a5e0d192b03152117cd10a761f73d6
+
++[5f88ae4]:
+https://github.com/gchq/CyberChef/commit/5f88ae44ec77228d9bed8f11e8cc8e7dcfb36914
+
++[0e82e4b]:
+https://github.com/gchq/CyberChef/commit/0e82e4b7c6c77cadb8be61cb145e081d6ecfdc88
+
++[d635cca]:
+https://github.com/gchq/CyberChef/commit/d635cca2106aae2a59caf0e5d7e3633ee1ea3155
+
++[895a929]:
+https://github.com/gchq/CyberChef/commit/895a9299255525cb57886deb9d9fd4ba17ae9548
+
++[270a333]:
+https://github.com/gchq/CyberChef/commit/270a33317944612d27ea1cc15275ad6b0ed097e5
+
++[d3adfc7]:
+https://github.com/gchq/CyberChef/commit/d3adfc7c3e5719279524356bce5261bd8350c0f8
+
++[47c85a1]:
+https://github.com/gchq/CyberChef/commit/47c85a105ddbdd4cabfa44ddddbc56e3907a8c33
+
++[3822c6c]:
+https://github.com/gchq/CyberChef/commit/3822c6c520a0b4200abc675c33f46082f5b9efc6
+
++[66d445c]:
+https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
+
++[ab37c1e]:
+https://github.com/gchq/CyberChef/commit/ab37c1e562dbee0495ed32876ecbb8225282af25
+
++[965570d]:
+https://github.com/gchq/CyberChef/commit/965570d2504c17ee1f96211a1dc10ed40cd2b332
+
++[a477f47]:
+https://github.com/gchq/CyberChef/commit/a477f47aecd01d78b11fe186ed4b20d9c487cfac
+
++[7a5225c]:
+https://github.com/gchq/CyberChef/commit/7a5225c961a5e0d192b03152117cd10a761f73d6
+
++[5f88ae4]:
+https://github.com/gchq/CyberChef/commit/5f88ae44ec77228d9bed8f11e8cc8e7dcfb36914
+
++[0e82e4b]:
+https://github.com/gchq/CyberChef/commit/0e82e4b7c6c77cadb8be61cb145e081d6ecfdc88
+
++[d635cca]:
+https://github.com/gchq/CyberChef/commit/d635cca2106aae2a59caf0e5d7e3633ee1ea3155
+
++[895a929]:
+https://github.com/gchq/CyberChef/commit/895a9299255525cb57886deb9d9fd4ba17ae9548
+
++[270a333]:
+https://github.com/gchq/CyberChef/commit/270a33317944612d27ea1cc15275ad6b0ed097e5
+
++[d3adfc7]:
+https://github.com/gchq/CyberChef/commit/d3adfc7c3e5719279524356bce5261bd8350c0f8
+
++[47c85a1]:
+https://github.com/gchq/CyberChef/commit/47c85a105ddbdd4cabfa44ddddbc56e3907a8c33
+
++[3822c6c]:
+https://github.com/gchq/CyberChef/commit/3822c6c520a0b4200abc675c33f46082f5b9efc6
+
++[66d445c]:
+https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
+
++[ab37c1e]:
+https://github.com/gchq/CyberChef/commit/ab37c1e562dbee0495ed32876ecbb8225282af25
+
++[965570d]:
+https://github.com/gchq/CyberChef/commit/965570d2504c17ee1f96211a1dc10ed40cd2b332
+
++[a477f47]:
+https://github.com/gchq/CyberChef/commit/a477f47aecd01d78b11fe186ed4b20d9c487cfac
+
++[7a5225c]:
+https://github.com/gchq/CyberChef/commit/7a5225c961a5e0d192b03152117cd10a761f73d6
+
++[5f88ae4]:
+https://github.com/gchq/CyberChef/commit/5f88ae44ec77228d9bed8f11e8cc8e7dcfb36914
+
++[0e82e4b]:
+https://github.com/gchq/CyberChef/commit/0e82e4b7c6c77cadb8be61cb145e081d6ecfdc88
+
++[d635cca]:
+https://github.com/gchq/CyberChef/commit/d635cca2106aae2a59caf0e5d7e3633ee1ea3155
+
++[895a929]:
+https://github.com/gchq/CyberChef/commit/895a9299255525cb57886deb9d9fd4ba17ae9548
+
++[270a333]:
+https://github.com/gchq/CyberChef/commit/270a33317944612d27ea1cc15275ad6b0ed097e5
+
++[d3adfc7]:
+https://github.com/gchq/CyberChef/commit/d3adfc7c3e5719279524356bce5261bd8350c0f8
+
++[47c85a1]:
+https://github.com/gchq/CyberChef/commit/47c85a105ddbdd4cabfa44ddddbc56e3907a8c33
+
++[3822c6c]:
+https://github.com/gchq/CyberChef/commit/3822c6c520a0b4200abc675c33f46082f5b9efc6
+
++[66d445c]:
+https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
+
+@@ -778,4 +985,29 @@ [#512]:
+https://github.com/gchq/CyberChef/issues/512
+
+-
+
++[#1040]: https://github.com/gchq/CyberChef/pull/1040
+
++[#2176]: https://github.com/gchq/CyberChef/pull/2176
+
++[#2177]: https://github.com/gchq/CyberChef/pull/2177
+
++[#2174]: https://github.com/gchq/CyberChef/pull/2174
+
++[#2058]: https://github.com/gchq/CyberChef/pull/2058
+
++[#1861]: https://github.com/gchq/CyberChef/pull/1861
+
++[#2055]: https://github.com/gchq/CyberChef/pull/2055
+
++[#2169]: https://github.com/gchq/CyberChef/pull/2169
+
++[#2175]: https://github.com/gchq/CyberChef/pull/2175
+
++[#2173]: https://github.com/gchq/CyberChef/pull/2173
+
++[#2172]: https://github.com/gchq/CyberChef/pull/2172
+
++[#2136]: https://github.com/gchq/CyberChef/pull/2136
+
++[#2165]: https://github.com/gchq/CyberChef/pull/2165
+
++[#2159]: https://github.com/gchq/CyberChef/pull/2159
+
++[#2086]: https://github.com/gchq/CyberChef/pull/2086
+
++[#2118]: https://github.com/gchq/CyberChef/pull/2118
+
++[#2166]: https://github.com/gchq/CyberChef/pull/2166
+
++[#2188]: https://github.com/gchq/CyberChef/pull/2188
+
++[#2137]: https://github.com/gchq/CyberChef/pull/2137
+
++[#1876]: https://github.com/gchq/CyberChef/pull/1876
+
++[#2186]: https://github.com/gchq/CyberChef/pull/2186
+
++[#1573]: https://github.com/gchq/CyberChef/pull/1573
+
++[#2183]: https://github.com/gchq/CyberChef/pull/2183
+
++[#2182]: https://github.com/gchq/CyberChef/pull/2182
+
++[#2181]: https://github.com/gchq/CyberChef/pull/2181
+
+-
+
+CHANGED: Dockerfile — mkilijanek/Dockerfile +++ gchq/Dockerfile @@ -27,9
++27,6 @@ #########################################
+
+# Package static build files into nginx #
+
+#########################################
+
+-# We are using Github Actions: redhat-actions/buildah-build@v2 which
+needs manual selection of arch in base image
+
+-# Remove TARGETARCH if docker buildx is supported in the CI release as
+–platform=$TARGETPLATFORM will be automatically set
+
+-ARG TARGETPLATFORM
+
+-FROM –platform=${TARGETPLATFORM} nginx:stable-alpine AS cyberchef
+
++FROM nginx:stable-alpine AS cyberchef
+
+COPY –from=builder /app/build/prod /usr/share/nginx/html/
+
+REMOVED in gchq (exists in mkilijanek): Makefile REMOVED in gchq (exists
+in mkilijanek): SECURITY_ANALYSIS.md REMOVED in gchq (exists in
+mkilijanek): SECURITY_AUTOMATION.md REMOVED in gchq (exists in
+mkilijanek): SECURITY_FIXES_APPLIED.md REMOVED in gchq (exists in
+mkilijanek): SECURITY_QUICK_START.md
+
+CHANGED: package-lock.json — mkilijanek/package-lock.json +++
+gchq/package-lock.json @@ -1,12 +1,12 @@ {
+
+“name”: “cyberchef”,
+
+- “version”: “10.19.4”,
+
+- “version”: “10.22.1”,
+
+ “lockfileVersion”: 3,
+
+ “requires”: true,
+
+ “packages”: {
+
+ ““: {
+
+ "name": "cyberchef",
+
+- "version": "10.19.4",
+
+- "version": "10.22.1",
+
+ "hasInstallScript": true,
+
+ "license": "Apache-2.0",
+
+ "dependencies": {
+
+@@ -31,7 +31,7 @@ “chi-squared”: “^1.1.0”,
+
+ "codepage": "^1.15.0",
+
+ "crypto-api": "^0.8.5",
+
+- "crypto-browserify": "^3.12.0",
+
+- "crypto-browserify": "^3.12.1",
+
+ "crypto-js": "^4.2.0",
+
+ "ctph.js": "0.0.5",
+
+ "d3": "7.9.0",
+
+@@ -58,10 +58,10 @@ “json5”: “^2.2.3”,
+
+ "jsonata": "^2.0.3",
+
+ "jsonpath-plus": "^10.3.0",
+
+- "jsonwebtoken": "9.0.0",
+
+- "jsonwebtoken": "8.5.1",
+
+ "jsqr": "^1.4.0",
+
+ "jsrsasign": "^11.1.0",
+
+- "kbpgp": "2.1.15",
+
+- "kbpgp": "^2.1.17",
+
+ "libbzip2-wasm": "0.0.4",
+
+ "libyara-wasm": "^1.2.1",
+
+ "lodash": "^4.17.21",
+
+@@ -156,7 +156,7 @@ “terser”: “^5.31.1”,
+
+ "webpack": "^5.91.0",
+
+ "webpack-bundle-analyzer": "^4.10.2",
+
+- "webpack-dev-server": "5.2.1",
+
+- "webpack-dev-server": "5.0.4",
+
+ "webpack-node-externals": "^3.0.0",
+
+ "worker-loader": "^3.0.8"
+
+ }
+
+@@ -255,7 +255,6 @@ “integrity”:
+“sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@ampproject/remapping": "^2.2.0",
+
+ "@babel/code-frame": "^7.26.0",
+
+@@ -1744,16 +1743,23 @@ }
+
+ },
+
+ "node_modules/@babel/runtime-corejs3": {
+
+- "version": "7.28.4",
+
+- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz",
+
+- "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==",
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "core-js-pure": "^3.43.0"
+
+- "version": "7.26.0",
+
+- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz",
+
+- "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==",
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "core-js-pure": "^3.30.2",
+
+- "regenerator-runtime": "^0.14.0"
+
+ },
+
+ "engines": {
+
+ "node": ">=6.9.0"
+
+ }
+
+- },
+
+- “node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime”:
+ {
+
+- "version": "0.14.1",
+
+- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+
+- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+
+- "license": "MIT"
+
+ },
+
+ “node_modules/@babel/runtime/node_modules/regenerator-runtime”: {
+
+ "version": "0.14.1",
+
+@@ -2098,8 +2104,7 @@ “resolved”:
+“https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.17.tgz”,
+
+ "integrity": "sha512-2EisRLHk6X/PdicybwlajLGKF5aJf4xnX2uuG5lexuYKt05xV/J/OiBADmi8q9obhxf1nesrMQbqAt+6CsHo/w==",
+
+ "dev": true,
+
+- "license": "MIT",
+
+- "peer": true
+
+- "license": "MIT"
+
+ },
+
+ “node_modules/@cspell/dict-dart”: {
+
+ "version": "2.3.0",
+
+@@ -2239,16 +2244,14 @@ “resolved”:
+“https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.11.tgz”,
+
+ "integrity": "sha512-QR3b/PB972SRQ2xICR1Nw/M44IJ6rjypwzA4jn+GH8ydjAX9acFNfc+hLZVyNe0FqsE90Gw3evLCOIF0vy1vQw==",
+
+ "dev": true,
+
+- "license": "MIT",
+
+- "peer": true
+
+- "license": "MIT"
+
+ },
+
+ “node_modules/@cspell/dict-html-symbol-entities”: {
+
+ "version": "4.0.3",
+
+ "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.3.tgz",
+
+ "integrity": "sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A==",
+
+ "dev": true,
+
+- "license": "MIT",
+
+- "peer": true
+
+- "license": "MIT"
+
+ },
+
+ “node_modules/@cspell/dict-java”: {
+
+ "version": "5.0.11",
+
+@@ -2446,8 +2449,7 @@ “resolved”:
+“https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.0.tgz”,
+
+ "integrity": "sha512-Pk3zNePLT8qg51l0M4g1ISowYAEGxTuNfZlgkU5SvHa9Cu7x/BWoyYq9Fvc3kAyoisCjRPyvWF4uRYrPitPDFw==",
+
+ "dev": true,
+
+- "license": "MIT",
+
+- "peer": true
+
+- "license": "MIT"
+
+ },
+
+ “node_modules/@cspell/dict-vue”: {
+
+ "version": "3.0.4",
+
+@@ -2588,7 +2590,6 @@ }
+
+ ],
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "engines": {
+
+ "node": ">=18"
+
+ },
+
+@@ -2612,7 +2613,6 @@ }
+
+ ],
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "engines": {
+
+ "node": ">=18"
+
+ }
+
+@@ -2847,6 +2847,109 @@ “funding”: {
+
+ "type": "github",
+
+ "url": "https://github.com/sponsors/nzakas"
+
+- }
+
+- },
+
+- “node_modules/@isaacs/cliui”: {
+
+- "version": "8.0.2",
+
+- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+
+- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+
+- "dev": true,
+
+- "license": "ISC",
+
+- "dependencies": {
+
+- "string-width": "^5.1.2",
+
+- "string-width-cjs": "npm:string-width@^4.2.0",
+
+- "strip-ansi": "^7.0.1",
+
+- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+
+- "wrap-ansi": "^8.1.0",
+
+- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+
+- },
+
+- "engines": {
+
+- "node": ">=12"
+
+- }
+
+- },
+
+- “node_modules/@isaacs/cliui/node_modules/ansi-regex”: {
+
+- "version": "6.1.0",
+
+- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+
+- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=12"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+
+- }
+
+- },
+
+- “node_modules/@isaacs/cliui/node_modules/ansi-styles”: {
+
+- "version": "6.2.1",
+
+- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+
+- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=12"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
+- }
+
+- },
+
+- “node_modules/@isaacs/cliui/node_modules/emoji-regex”: {
+
+- "version": "9.2.2",
+
+- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+
+- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+
+- "dev": true,
+
+- "license": "MIT"
+
+- },
+
+- “node_modules/@isaacs/cliui/node_modules/string-width”: {
+
+- "version": "5.1.2",
+
+- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+
+- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "eastasianwidth": "^0.2.0",
+
+- "emoji-regex": "^9.2.2",
+
+- "strip-ansi": "^7.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=12"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/sindresorhus"
+
+- }
+
+- },
+
+- “node_modules/@isaacs/cliui/node_modules/strip-ansi”: {
+
+- "version": "7.1.0",
+
+- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+
+- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "ansi-regex": "^6.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=12"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+
+- }
+
+- },
+
+- “node_modules/@isaacs/cliui/node_modules/wrap-ansi”: {
+
+- "version": "8.1.0",
+
+- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+
+- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "ansi-styles": "^6.1.0",
+
+- "string-width": "^5.0.1",
+
+- "strip-ansi": "^7.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=12"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
+ }
+
+ },
+
+ “node_modules/@jimp/bmp”: {
+
+@@ -2907,7 +3010,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/custom/-/custom-0.22.12.tgz”,
+
+ "integrity": "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/core": "^0.22.12"
+
+ }
+
+@@ -2944,7 +3046,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz”,
+
+ "integrity": "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/utils": "^0.22.12"
+
+ },
+
+@@ -2957,7 +3058,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz”,
+
+ "integrity": "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/utils": "^0.22.12"
+
+ },
+
+@@ -2982,7 +3082,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.12.tgz”,
+
+ "integrity": "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/utils": "^0.22.12",
+
+ "tinycolor2": "^1.6.0"
+
+@@ -3026,7 +3125,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz”,
+
+ "integrity": "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/utils": "^0.22.12"
+
+ },
+
+@@ -3150,7 +3248,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz”,
+
+ "integrity": "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/utils": "^0.22.12"
+
+ },
+
+@@ -3163,7 +3260,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz”,
+
+ "integrity": "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/utils": "^0.22.12"
+
+ },
+
+@@ -3179,7 +3275,6 @@ “resolved”:
+“https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz”,
+
+ "integrity": "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@jimp/utils": "^0.22.12"
+
+ },
+
+@@ -3887,6 +3982,17 @@ “node”: “>= 8”
+
+ }
+
+ },
+
+- “node_modules/@pkgjs/parseargs”: {
+
+- "version": "0.11.0",
+
+- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+
+- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "optional": true,
+
+- "engines": {
+
+- "node": ">=14"
+
+- }
+
+- },
+
+ “node_modules/@pkgr/core”: {
+
+ “version”: “0.1.1”,
+
+ “resolved”:
+ “https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz”,
+
+@@ -4508,7 +4614,6 @@ “integrity”:
+“sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "bin": {
+
+ "acorn": "bin/acorn"
+
+ },
+
+@@ -4555,7 +4660,6 @@ “integrity”:
+“sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "fast-deep-equal": "^3.1.1",
+
+ "fast-json-stable-stringify": "^2.0.0",
+
+@@ -5064,14 +5168,14 @@ }
+
+ },
+
+ "node_modules/axios": {
+
+- "version": "1.13.2",
+
+- "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
+
+- "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
+
+- "version": "1.7.9",
+
+- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+
+- "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "follow-redirects": "^1.15.6",
+
+- "form-data": "^4.0.4",
+
+- "form-data": "^4.0.0",
+
+ "proxy-from-env": "^1.1.0"
+
+ }
+
+ },
+
+@@ -5898,7 +6002,6 @@ }
+
+ ],
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "caniuse-lite": "^1.0.30001688",
+
+ "electron-to-chromium": "^1.5.73",
+
+@@ -6120,9 +6223,9 @@ }
+
+ },
+
+ "node_modules/caniuse-lite": {
+
+- "version": "1.0.30001695",
+
+- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
+
+- "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==",
+
+- "version": "1.0.30001769",
+
+- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz",
+
+- "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==",
+
+ "dev": true,
+
+ "funding": [
+
+ {
+
+@@ -6653,9 +6756,9 @@ }
+
+ },
+
+ "node_modules/compression": {
+
+- "version": "1.8.1",
+
+- "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+
+- "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+
+- "version": "1.7.5",
+
+- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz",
+
+- "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+@@ -6663,7 +6766,7 @@ “compressible”: “~2.0.18”,
+
+ "debug": "2.6.9",
+
+ "negotiator": "~0.6.4",
+
+- "on-headers": "~1.1.0",
+
+- "on-headers": "~1.0.2",
+
+ "safe-buffer": "5.2.1",
+
+ "vary": "~1.1.2"
+
+ },
+
+@@ -6894,9 +6997,9 @@ }
+
+ },
+
+ "node_modules/core-js-pure": {
+
+- "version": "3.47.0",
+
+- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz",
+
+- "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==",
+
+- "version": "3.40.0",
+
+- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.40.0.tgz",
+
+- "integrity": "sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==",
+
+ "hasInstallScript": true,
+
+ "license": "MIT",
+
+ "funding": {
+
+@@ -7801,7 +7904,6 @@ “resolved”:
+“https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz”,
+
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+
+ "license": "ISC",
+
+- "peer": true,
+
+ "engines": {
+
+ "node": ">=12"
+
+ }
+
+@@ -8043,6 +8145,19 @@ },
+
+ "funding": {
+
+ "url": "https://github.com/sponsors/sindresorhus"
+
+- }
+
+- },
+
+- “node_modules/default-gateway”: {
+
+- "version": "6.0.3",
+
+- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+
+- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+
+- "dev": true,
+
+- "license": "BSD-2-Clause",
+
+- "dependencies": {
+
+- "execa": "^5.0.0"
+
+- },
+
+- "engines": {
+
+- "node": ">= 10"
+
+ }
+
+ },
+
+ “node_modules/defaults”: {
+
+@@ -8387,6 +8502,13 @@ “readable-stream”: “^2.0.0”,
+
+ "stream-shift": "^1.0.0"
+
+ }
+
+- },
+
+- “node_modules/eastasianwidth”: {
+
+- "version": "0.2.0",
+
+- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+
+- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+
+- "dev": true,
+
+- "license": "MIT"
+
+ },
+
+ “node_modules/ecdsa-sig-formatter”: {
+
+ "version": "1.0.11",
+
+@@ -8720,7 +8842,6 @@ “integrity”:
+“sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@eslint-community/eslint-utils": "^4.2.0",
+
+ "@eslint-community/regexpp": "^4.12.1",
+
+@@ -9082,6 +9203,43 @@ “safe-buffer”: “^5.1.1”
+
+ }
+
+ },
+
+- “node_modules/execa”: {
+
+- "version": "5.1.1",
+
+- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+
+- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "cross-spawn": "^7.0.3",
+
+- "get-stream": "^6.0.0",
+
+- "human-signals": "^2.1.0",
+
+- "is-stream": "^2.0.0",
+
+- "merge-stream": "^2.0.0",
+
+- "npm-run-path": "^4.0.1",
+
+- "onetime": "^5.1.2",
+
+- "signal-exit": "^3.0.3",
+
+- "strip-final-newline": "^2.0.0"
+
+- },
+
+- "engines": {
+
+- "node": ">=10"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+
+- }
+
+- },
+
+- “node_modules/execa/node_modules/get-stream”: {
+
+- "version": "6.0.1",
+
+- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+
+- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=10"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/sindresorhus"
+
+- }
+
+- },
+
+ “node_modules/exif-parser”: {
+
+ “version”: “0.1.12”,
+
+ “resolved”:
+ “https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz”,
+
+@@ -9729,6 +9887,36 @@ “node”: “>=0.10.0”
+
+ }
+
+ },
+
+- “node_modules/foreground-child”: {
+
+- "version": "3.3.0",
+
+- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+
+- "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+
+- "dev": true,
+
+- "license": "ISC",
+
+- "dependencies": {
+
+- "cross-spawn": "^7.0.0",
+
+- "signal-exit": "^4.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=14"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/isaacs"
+
+- }
+
+- },
+
+- “node_modules/foreground-child/node_modules/signal-exit”: {
+
+- "version": "4.1.0",
+
+- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+
+- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+
+- "dev": true,
+
+- "license": "ISC",
+
+- "engines": {
+
+- "node": ">=14"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/isaacs"
+
+- }
+
+- },
+
+ “node_modules/form-data”: {
+
+ “version”: “4.0.5”,
+
+ “resolved”:
+ “https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz”,
+
+@@ -10202,7 +10390,6 @@ “integrity”:
+“sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "dateformat": "~4.6.2",
+
+ "eventemitter2": "~0.4.13",
+
+@@ -10899,6 +11086,23 @@ “node”: “>=18”
+
+ }
+
+ },
+
+- “node_modules/html-entities”: {
+
+- "version": "2.5.2",
+
+- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
+
+- "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
+
+- "dev": true,
+
+- "funding": [
+
+- {
+
+- "type": "github",
+
+- "url": "https://github.com/sponsors/mdevils"
+
+- },
+
+- {
+
+- "type": "patreon",
+
+- "url": "https://patreon.com/mdevils"
+
+- }
+
+- ],
+
+- "license": "MIT"
+
+- },
+
+ “node_modules/html-escaper”: {
+
+ “version”: “2.0.2”,
+
+ “resolved”:
+ “https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz”,
+
+@@ -11078,9 +11282,9 @@ }
+
+ },
+
+ "node_modules/http-proxy-middleware": {
+
+- "version": "2.0.9",
+
+- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
+
+- "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
+
+- "version": "2.0.7",
+
+- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+
+- "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+@@ -11121,6 +11325,16 @@ },
+
+ "engines": {
+
+ "node": ">= 14"
+
+- }
+
+- },
+
+- “node_modules/human-signals”: {
+
+- "version": "2.1.0",
+
+- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+
+- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+
+- "dev": true,
+
+- "license": "Apache-2.0",
+
+- "engines": {
+
+- "node": ">=10.17.0"
+
+ }
+
+ },
+
+ “node_modules/hyperdyperid”: {
+
+@@ -11810,6 +12024,19 @@ “url”: “https://github.com/sponsors/ljharb”
+
+ }
+
+ },
+
+- “node_modules/is-stream”: {
+
+- "version": "2.0.1",
+
+- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+
+- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=8"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/sindresorhus"
+
+- }
+
+- },
+
+ “node_modules/is-string”: {
+
+ “version”: “1.1.1”,
+
+ “resolved”:
+ “https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz”,
+
+@@ -12000,6 +12227,22 @@ “dev”: true,
+
+ "license": "MIT"
+
+ },
+
+- “node_modules/jackspeak”: {
+
+- "version": "3.4.3",
+
+- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+
+- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+
+- "dev": true,
+
+- "license": "BlueOak-1.0.0",
+
+- "dependencies": {
+
+- "@isaacs/cliui": "^8.0.2"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/isaacs"
+
+- },
+
+- "optionalDependencies": {
+
+- "@pkgjs/parseargs": "^0.11.0"
+
+- }
+
+- },
+
+ “node_modules/jake”: {
+
+ “version”: “10.9.2”,
+
+ “resolved”: “https://registry.npmjs.org/jake/-/jake-10.9.2.tgz”,
+
+@@ -12114,7 +12357,6 @@ “integrity”:
+“sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "bin": {
+
+ "jiti": "bin/jiti.js"
+
+ }
+
+@@ -12135,8 +12377,7 @@ “version”: “3.7.1”,
+
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+
+ "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+
+- "license": "MIT",
+
+- "peer": true
+
+- "license": "MIT"
+
+ },
+
+ “node_modules/js-sha3”: {
+
+ "version": "0.9.3",
+
+@@ -12227,7 +12468,6 @@ “resolved”:
+“https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz”,
+
+ "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "engines": {
+
+ "node": ">= 10.16.0"
+
+ }
+
+@@ -12311,31 +12551,34 @@ }
+
+ },
+
+ "node_modules/jsonwebtoken": {
+
+- "version": "9.0.0",
+
+- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+
+- "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
+
+- "version": "8.5.1",
+
+- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+
+- "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "jws": "^3.2.2",
+
+- "lodash": "^4.17.21",
+
+- "lodash.includes": "^4.3.0",
+
+- "lodash.isboolean": "^3.0.3",
+
+- "lodash.isinteger": "^4.0.4",
+
+- "lodash.isnumber": "^3.0.3",
+
+- "lodash.isplainobject": "^4.0.6",
+
+- "lodash.isstring": "^4.0.1",
+
+- "lodash.once": "^4.0.0",
+
+ "ms": "^2.1.1",
+
+- "semver": "^7.3.8"
+
+- },
+
+- "engines": {
+
+- "node": ">=12",
+
+- "npm": ">=6"
+
+- "semver": "^5.6.0"
+
+- },
+
+- "engines": {
+
+- "node": ">=4",
+
+- "npm": ">=1.4.28"
+
+ }
+
+ },
+
+ “node_modules/jsonwebtoken/node_modules/semver”: {
+
+- "version": "7.7.3",
+
+- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+
+- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+
+- "version": "5.7.2",
+
+- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+
+- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+
+ "license": "ISC",
+
+ "bin": {
+
+- "semver": "bin/semver.js"
+
+- },
+
+- "engines": {
+
+- "node": ">=10"
+
+- "semver": "bin/semver"
+
+ }
+
+ },
+
+ “node_modules/jsqr”: {
+
+@@ -12367,30 +12610,30 @@ }
+
+ },
+
+ "node_modules/jwa": {
+
+- "version": "1.4.2",
+
+- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
+
+- "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "buffer-equal-constant-time": "^1.0.1",
+
+- "version": "1.4.1",
+
+- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+
+- "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "buffer-equal-constant-time": "1.0.1",
+
+ "ecdsa-sig-formatter": "1.0.11",
+
+ "safe-buffer": "^5.0.1"
+
+ }
+
+ },
+
+ “node_modules/jws”: {
+
+- "version": "3.2.3",
+
+- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz",
+
+- "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==",
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "jwa": "^1.4.2",
+
+- "version": "3.2.2",
+
+- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+
+- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "jwa": "^1.4.1",
+
+ "safe-buffer": "^5.0.1"
+
+ }
+
+ },
+
+ “node_modules/kbpgp”: {
+
+- "version": "2.1.15",
+
+- "resolved": "https://registry.npmjs.org/kbpgp/-/kbpgp-2.1.15.tgz",
+
+- "integrity": "sha512-iFdQT+m2Mi2DB14kEFydF2joNe9x3E2VZCGZUt7UXsiZnQx5TtSl4KofP7EPtjHvf7weCxNKlEPSYiiCNMZ2jA==",
+
+- "version": "2.1.17",
+
+- "resolved": "https://registry.npmjs.org/kbpgp/-/kbpgp-2.1.17.tgz",
+
+- "integrity": "sha512-pnjH7amyg6dZLXyF42BKbCTST0l0r1ErunqtFRrJCkHkGJb83cZZmx1pnqNFr+d/ls+5gvcHrZLPfUG5q7oRYw==",
+
+ "license": "BSD-3-Clause",
+
+ "dependencies": {
+
+ "bn": "^1.0.5",
+
+@@ -12673,6 +12916,18 @@ “dev”: true,
+
+ "license": "MIT"
+
+ },
+
+- “node_modules/lodash.includes”: {
+
+- "version": "4.3.0",
+
+- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+
+- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
+
+- "license": "MIT"
+
+- },
+
+- “node_modules/lodash.isboolean”: {
+
+- "version": "3.0.3",
+
+- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+
+- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+
+- "license": "MIT"
+
+- },
+
+ “node_modules/lodash.isfinite”: {
+
+ “version”: “3.3.2”,
+
+ “resolved”:
+ “https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz”,
+
+@@ -12680,11 +12935,28 @@ “dev”: true,
+
+ "license": "MIT"
+
+ },
+
+- “node_modules/lodash.isinteger”: {
+
+- "version": "4.0.4",
+
+- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+
+- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
+
+- "license": "MIT"
+
+- },
+
+- “node_modules/lodash.isnumber”: {
+
+- "version": "3.0.3",
+
+- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+
+- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
+
+- "license": "MIT"
+
+- },
+
+ “node_modules/lodash.isplainobject”: {
+
+ “version”: “4.0.6”,
+
+ “resolved”:
+ “https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz”,
+
+ “integrity”:
+ “sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==”,
+
+- "dev": true,
+
+- "license": "MIT"
+
+- },
+
+- “node_modules/lodash.isstring”: {
+
+- "version": "4.0.1",
+
+- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+
+- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+
+ "license": "MIT"
+
+ },
+
+ “node_modules/lodash.merge”: {
+
+@@ -12692,6 +12964,12 @@ “resolved”:
+“https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz”,
+
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+
+ "dev": true,
+
+- "license": "MIT"
+
+- },
+
+- “node_modules/lodash.once”: {
+
+- "version": "4.1.1",
+
+- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+
+- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+
+ "license": "MIT"
+
+ },
+
+ “node_modules/lodash.union”: {
+
+@@ -13064,10 +13342,9 @@ }
+
+ },
+
+ "node_modules/min-document": {
+
+- "version": "2.19.2",
+
+- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz",
+
+- "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==",
+
+- "license": "MIT",
+
+- "version": "2.19.0",
+
+- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+
+- "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+
+ "dependencies": {
+
+ "dom-walk": "^0.1.0"
+
+ }
+
+@@ -13125,6 +13402,16 @@ “license”: “MIT”,
+
+ "funding": {
+
+ "url": "https://github.com/sponsors/ljharb"
+
+- }
+
+- },
+
+- “node_modules/minipass”: {
+
+- "version": "7.1.2",
+
+- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+
+- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+
+- "dev": true,
+
+- "license": "ISC",
+
+- "engines": {
+
+- "node": ">=16 || 14 >=14.17"
+
+ }
+
+ },
+
+ “node_modules/mocha”: {
+
+@@ -13325,9 +13612,9 @@ }
+
+ },
+
+ "node_modules/morgan": {
+
+- "version": "1.10.1",
+
+- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz",
+
+- "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==",
+
+- "version": "1.10.0",
+
+- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
+
+- "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+@@ -13335,7 +13622,7 @@ “debug”: “2.6.9”,
+
+ "depd": "~2.0.0",
+
+ "on-finished": "~2.3.0",
+
+- "on-headers": "~1.1.0"
+
+- "on-headers": "~1.0.2"
+
+ },
+
+ "engines": {
+
+ "node": ">= 0.8.0"
+
+@@ -13832,6 +14119,19 @@ “integrity”:
+“sha512-TKC/8zH5pXIAMVQio2TvVDTtPRX+DJPHDqjRbxogtFiByHyzKmy96RA0JtCQJ+WouyyL4A10xomQzgbUT+1jCg==”,
+
+ "license": "MIT"
+
+ },
+
+- “node_modules/npm-run-path”: {
+
+- "version": "4.0.1",
+
+- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+
+- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "path-key": "^3.0.0"
+
+- },
+
+- "engines": {
+
+- "node": ">=8"
+
+- }
+
+- },
+
+ “node_modules/nth-check”: {
+
+ “version”: “2.1.1”,
+
+ “resolved”:
+ “https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz”,
+
+@@ -14005,9 +14305,9 @@ }
+
+ },
+
+ "node_modules/on-headers": {
+
+- "version": "1.1.0",
+
+- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+
+- "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+
+- "version": "1.0.2",
+
+- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+
+- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "engines": {
+
+@@ -14316,6 +14616,13 @@ “node”: “>= 14”
+
+ }
+
+ },
+
+- “node_modules/package-json-from-dist”: {
+
+- "version": "1.0.1",
+
+- "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+
+- "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+
+- "dev": true,
+
+- "license": "BlueOak-1.0.0"
+
+- },
+
+ “node_modules/pad-stream”: {
+
+ “version”: “2.0.0”,
+
+ “resolved”:
+ “https://registry.npmjs.org/pad-stream/-/pad-stream-2.0.0.tgz”,
+
+@@ -14568,6 +14875,30 @@ “node”: “>=0.10.0”
+
+ }
+
+ },
+
+- “node_modules/path-scurry”: {
+
+- "version": "1.11.1",
+
+- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+
+- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+
+- "dev": true,
+
+- "license": "BlueOak-1.0.0",
+
+- "dependencies": {
+
+- "lru-cache": "^10.2.0",
+
+- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+- },
+
+- "engines": {
+
+- "node": ">=16 || 14 >=14.18"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/isaacs"
+
+- }
+
+- },
+
+- “node_modules/path-scurry/node_modules/lru-cache”: {
+
+- "version": "10.4.3",
+
+- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+
+- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+
+- "dev": true,
+
+- "license": "ISC"
+
+- },
+
+ “node_modules/path-to-regexp”: {
+
+ “version”: “0.1.12”,
+
+ “resolved”:
+ “https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz”,
+
+@@ -14836,7 +15167,6 @@ “integrity”:
+“sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==”,
+
+ "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "funding": {
+
+ "type": "opencollective",
+
+ "url": "https://opencollective.com/popperjs"
+
+@@ -14896,7 +15226,6 @@ }
+
+ ],
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "nanoid": "^3.3.8",
+
+ "picocolors": "^1.1.1",
+
+@@ -16034,7 +16363,6 @@ “integrity”:
+“sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "fast-deep-equal": "^3.1.3",
+
+ "fast-uri": "^3.0.1",
+
+@@ -16891,6 +17219,45 @@ “node”: “>=8”
+
+ }
+
+ },
+
+- “node_modules/string-width-cjs”: {
+
+- "name": "string-width",
+
+- "version": "4.2.3",
+
+- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
+- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "emoji-regex": "^8.0.0",
+
+- "is-fullwidth-code-point": "^3.0.0",
+
+- "strip-ansi": "^6.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=8"
+
+- }
+
+- },
+
+- “node_modules/string-width-cjs/node_modules/ansi-regex”: {
+
+- "version": "5.0.1",
+
+- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
+- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=8"
+
+- }
+
+- },
+
+- “node_modules/string-width-cjs/node_modules/strip-ansi”: {
+
+- "version": "6.0.1",
+
+- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
+- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "ansi-regex": "^5.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=8"
+
+- }
+
+- },
+
+ “node_modules/string-width/node_modules/ansi-regex”: {
+
+ “version”: “5.0.1”,
+
+ “resolved”:
+ “https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz”,
+
+@@ -16927,6 +17294,30 @@ “node”: “>=0.10.0”
+
+ }
+
+ },
+
+- “node_modules/strip-ansi-cjs”: {
+
+- "name": "strip-ansi",
+
+- "version": "6.0.1",
+
+- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
+- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "ansi-regex": "^5.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=8"
+
+- }
+
+- },
+
+- “node_modules/strip-ansi-cjs/node_modules/ansi-regex”: {
+
+- "version": "5.0.1",
+
+- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
+- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=8"
+
+- }
+
+- },
+
+ “node_modules/strip-comments”: {
+
+ “version”: “2.0.1”,
+
+ “resolved”:
+ “https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz”,
+
+@@ -16935,6 +17326,16 @@ “license”: “MIT”,
+
+ "engines": {
+
+ "node": ">=10"
+
+- }
+
+- },
+
+- “node_modules/strip-final-newline”: {
+
+- "version": "2.0.0",
+
+- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+
+- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=6"
+
+ }
+
+ },
+
+ “node_modules/strip-json-comments”: {
+
+@@ -17300,7 +17701,6 @@ “integrity”:
+“sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "engines": {
+
+ "node": ">=12"
+
+ },
+
+@@ -17309,9 +17709,9 @@ }
+
+ },
+
+ "node_modules/tmp": {
+
+- "version": "0.2.5",
+
+- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
+
+- "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
+
+- "version": "0.2.3",
+
+- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+
+- "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "engines": {
+
+@@ -17462,8 +17862,7 @@ “resolved”:
+“https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz”,
+
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+
+ "dev": true,
+
+- "license": "0BSD",
+
+- "peer": true
+
+- "license": "0BSD"
+
+ },
+
+ “node_modules/tweetnacl”: {
+
+ "version": "0.13.3",
+
+@@ -17980,7 +18379,6 @@ “integrity”:
+“sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==”,
+
+ "dev": true,
+
+ "license": "MIT",
+
+- "peer": true,
+
+ "dependencies": {
+
+ "@types/eslint-scope": "^3.7.7",
+
+ "@types/estree": "^1.0.6",
+
+@@ -18128,16 +18526,15 @@ }
+
+ },
+
+ "node_modules/webpack-dev-server": {
+
+- "version": "5.2.1",
+
+- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz",
+
+- "integrity": "sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==",
+
+- "version": "5.0.4",
+
+- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz",
+
+- "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "@types/bonjour": "^3.5.13",
+
+ "@types/connect-history-api-fallback": "^1.5.4",
+
+ "@types/express": "^4.17.21",
+
+- "@types/express-serve-static-core": "^4.17.21",
+
+ "@types/serve-index": "^1.9.4",
+
+ "@types/serve-static": "^1.15.5",
+
+ "@types/sockjs": "^0.3.36",
+
+@@ -18148,20 +18545,23 @@ “colorette”: “^2.0.10”,
+
+ "compression": "^1.7.4",
+
+ "connect-history-api-fallback": "^2.0.0",
+
+- "express": "^4.21.2",
+
+- "default-gateway": "^6.0.3",
+
+- "express": "^4.17.3",
+
+ "graceful-fs": "^4.2.6",
+
+- "http-proxy-middleware": "^2.0.7",
+
+- "html-entities": "^2.4.0",
+
+- "http-proxy-middleware": "^2.0.3",
+
+ "ipaddr.js": "^2.1.0",
+
+ "launch-editor": "^2.6.1",
+
+ "open": "^10.0.3",
+
+ "p-retry": "^6.2.0",
+
+- "rimraf": "^5.0.5",
+
+ "schema-utils": "^4.2.0",
+
+ "selfsigned": "^2.4.1",
+
+ "serve-index": "^1.9.1",
+
+ "sockjs": "^0.3.24",
+
+ "spdy": "^4.0.2",
+
+- "webpack-dev-middleware": "^7.4.2",
+
+- "ws": "^8.18.0"
+
+- "webpack-dev-middleware": "^7.1.0",
+
+- "ws": "^8.16.0"
+
+ },
+
+ "bin": {
+
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+
+@@ -18185,17 +18585,14 @@ }
+
+ }
+
+ },
+
+- “node_modules/webpack-dev-server/node_modules/@types/express-serve-static-core”:
+ {
+
+- "version": "4.19.7",
+
+- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz",
+
+- "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "@types/node": "*",
+
+- "@types/qs": "*",
+
+- "@types/range-parser": "*",
+
+- "@types/send": "*"
+
+- “node_modules/webpack-dev-server/node_modules/brace-expansion”: {
+
+- "version": "2.0.1",
+
+- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+
+- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "balanced-match": "^1.0.0"
+
+ }
+
+ },
+
+ “node_modules/webpack-dev-server/node_modules/chokidar”: {
+
+@@ -18236,6 +18633,27 @@ “url”:
+“https://github.com/sponsors/sindresorhus”
+
+ }
+
+ },
+
+- “node_modules/webpack-dev-server/node_modules/glob”: {
+
+- "version": "10.4.5",
+
+- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+
+- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+
+- "dev": true,
+
+- "license": "ISC",
+
+- "dependencies": {
+
+- "foreground-child": "^3.1.0",
+
+- "jackspeak": "^3.1.2",
+
+- "minimatch": "^9.0.4",
+
+- "minipass": "^7.1.2",
+
+- "package-json-from-dist": "^1.0.0",
+
+- "path-scurry": "^1.11.1"
+
+- },
+
+- "bin": {
+
+- "glob": "dist/esm/bin.mjs"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/isaacs"
+
+- }
+
+- },
+
+ “node_modules/webpack-dev-server/node_modules/glob-parent”: {
+
+ “version”: “5.1.2”,
+
+ “resolved”:
+ “https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz”,
+
+@@ -18265,6 +18683,22 @@ “url”:
+“https://github.com/sponsors/sindresorhus”
+
+ }
+
+ },
+
+- “node_modules/webpack-dev-server/node_modules/minimatch”: {
+
+- "version": "9.0.5",
+
+- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+
+- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+
+- "dev": true,
+
+- "license": "ISC",
+
+- "dependencies": {
+
+- "brace-expansion": "^2.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=16 || 14 >=14.17"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/isaacs"
+
+- }
+
+- },
+
+ “node_modules/webpack-dev-server/node_modules/open”: {
+
+ “version”: “10.1.0”,
+
+ “resolved”: “https://registry.npmjs.org/open/-/open-10.1.0.tgz”,
+
+@@ -18282,6 +18716,22 @@ },
+
+ "funding": {
+
+ "url": "https://github.com/sponsors/sindresorhus"
+
+- }
+
+- },
+
+- “node_modules/webpack-dev-server/node_modules/rimraf”: {
+
+- "version": "5.0.10",
+
+- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
+
+- "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
+
+- "dev": true,
+
+- "license": "ISC",
+
+- "dependencies": {
+
+- "glob": "^10.3.7"
+
+- },
+
+- "bin": {
+
+- "rimraf": "dist/esm/bin.mjs"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/sponsors/isaacs"
+
+ }
+
+ },
+
+ “node_modules/webpack-node-externals”: {
+
+@@ -18640,6 +19090,64 @@ },
+
+ "funding": {
+
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
+- }
+
+- },
+
+- “node_modules/wrap-ansi-cjs”: {
+
+- "name": "wrap-ansi",
+
+- "version": "7.0.0",
+
+- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+
+- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "ansi-styles": "^4.0.0",
+
+- "string-width": "^4.1.0",
+
+- "strip-ansi": "^6.0.0"
+
+- },
+
+- "engines": {
+
+- "node": ">=10"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
+- }
+
+- },
+
+- “node_modules/wrap-ansi-cjs/node_modules/ansi-regex”: {
+
+- "version": "5.0.1",
+
+- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
+- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "engines": {
+
+- "node": ">=8"
+
+- }
+
+- },
+
+- “node_modules/wrap-ansi-cjs/node_modules/ansi-styles”: {
+
+- "version": "4.3.0",
+
+- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+
+- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "color-convert": "^2.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=8"
+
+- },
+
+- "funding": {
+
+- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
+- }
+
+- },
+
+- “node_modules/wrap-ansi-cjs/node_modules/strip-ansi”: {
+
+- "version": "6.0.1",
+
+- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
+- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
+- "dev": true,
+
+- "license": "MIT",
+
+- "dependencies": {
+
+- "ansi-regex": "^5.0.1"
+
+- },
+
+- "engines": {
+
+- "node": ">=8"
+
+ }
+
+ },
+
+ “node_modules/wrap-ansi/node_modules/ansi-regex”: {
+
+CHANGED: package.json — mkilijanek/package.json +++ gchq/package.json @@
+-1,6 +1,6 @@ {
+
+“name”: “cyberchef”,
+
+- “version”: “10.19.4”,
+
+- “version”: “10.22.1”,
+
+ “description”: “The Cyber Swiss Army Knife for encryption, encoding,
+ compression and data analysis.”,
+
+ “author”: “n1474335 n1474335@gmail.com”,
+
+ “homepage”: “https://gchq.github.io/CyberChef”,
+
+@@ -91,7 +91,7 @@ “terser”: “^5.31.1”,
+
+ "webpack": "^5.91.0",
+
+ "webpack-bundle-analyzer": "^4.10.2",
+
+- “webpack-dev-server”: “5.2.1”,
+
+- “webpack-dev-server”: “5.0.4”,
+
+ “webpack-node-externals”: “^3.0.0”,
+
+ “worker-loader”: “^3.0.8”
+
+},
+
+@@ -117,7 +117,7 @@ “chi-squared”: “^1.1.0”,
+
+ "codepage": "^1.15.0",
+
+ "crypto-api": "^0.8.5",
+
+- “crypto-browserify”: “^3.12.0”,
+
+- “crypto-browserify”: “^3.12.1”,
+
+ “crypto-js”: “^4.2.0”,
+
+ “ctph.js”: “0.0.5”,
+
+ “d3”: “7.9.0”,
+
+@@ -144,10 +144,10 @@ “json5”: “^2.2.3”,
+
+ "jsonata": "^2.0.3",
+
+ "jsonpath-plus": "^10.3.0",
+
+- “jsonwebtoken”: “9.0.0”,
+
+- “jsonwebtoken”: “8.5.1”,
+
+ “jsqr”: “^1.4.0”,
+
+ “jsrsasign”: “^11.1.0”,
+
+- “kbpgp”: “2.1.15”,
+
+- “kbpgp”: “^2.1.17”,
+
+ “libbzip2-wasm”: “0.0.4”,
+
+ “libyara-wasm”: “^1.2.1”,
+
+ “lodash”: “^4.17.21”,
+
+@@ -202,14 +202,9 @@ “lint:grammar”: “cspell ./src”,
+
+ "postinstall": "npx grunt exec:fixCryptoApiImports && npx grunt exec:fixSnackbarMarkup && npx grunt exec:fixJimpModule",
+
+ "newop": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newOperation.mjs",
+
+- “minor”: “node –experimental-modules –experimental-json-modules
+ src/core/config/scripts/newMinorVersion.mjs”,
+
+- “minor”: “node –experimental-modules –experimental-json-modules
+ src/core/config/scripts/newMinorVersion.mjs && npm version minor
+ –git-tag-version=false && echo "Updated to version v$(npm pkg get
+ version | xargs), please create a pull request and once merged use
+ ‘npm run tag’"”,
+
+- “tag”: “git tag -s "v$(npm pkg get version | xargs)\" -m \"$(npm pkg
+ get version | xargs)" && echo "Created v$(npm pkg get version |
+ xargs), now check and push the tag"”,
+
+ “getheapsize”: “node -e
+ ‘console.log(node heap limit = ${require(\"v8\").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb)’”,
+
+- “setheapsize”: “export NODE_OPTIONS=–max_old_space_size=2048”,
+
+- “security:audit”: “npm audit”,
+
+- “security:audit:json”: “npm audit –json”,
+
+- “security:fix”: “./scripts/security-fix.sh”,
+
+- “security:triage”: “node scripts/vulnerability-triage.js”,
+
+- “security:triage:json”: “node scripts/vulnerability-triage.js
+ –json”,
+
+- “security:check”: “npm run security:triage && npm run lint”
+
+- “setheapsize”: “export NODE_OPTIONS=–max_old_space_size=2048”
+
+}
+
+}
+
+REMOVED in gchq (exists in mkilijanek): scripts/security-fix.sh REMOVED
+in gchq (exists in mkilijanek): scripts/vulnerability-triage.js
+
+CHANGED: src/core/Utils.mjs — mkilijanek/src/core/Utils.mjs +++
+gchq/src/core/Utils.mjs @@ -177,7 +177,7 @@ */
+
+ static printable(str, preserveWs=false, onlyAscii=false) {
+
+ if (onlyAscii) {
+
+- return str.replace(/[^\x20-\x7f]/g, ".");
+
+- return str.replace(/[^\x20-\x7e]/g, ".");
+
+ }
+
+
+
+ // eslint-disable-next-line no-misleading-character-class
+
+CHANGED: src/core/config/Categories.json —
+mkilijanek/src/core/config/Categories.json +++
+gchq/src/core/config/Categories.json @@ -26,6 +26,8 @@ “From Base45”,
+
+ "To Base58",
+
+ "From Base58",
+
+- "To Bech32",
+
+- "From Bech32",
+
+ "To Base62",
+
+ "From Base62",
+
+ "To Base64",
+
+CHANGED: src/core/config/scripts/newMinorVersion.mjs —
+mkilijanek/src/core/config/scripts/newMinorVersion.mjs +++
+gchq/src/core/config/scripts/newMinorVersion.mjs @@ -7,138 +7,197 @@ */
+
+/* eslint no-console: [“off”] */
+
+-
+
+-import prompt from “prompt”;
+
+-import colors from “colors”;
+
++/* eslint jsdoc/require-jsdoc: [“off”] */
+
+- import path from “path”;
+
+-import fs from “fs”;
+
++import fs from “fs”;
+
+import process from “process”;
+
+-
+
+-const dir = path.join(process.cwd() + “/src/core/config/”);
+
+-if (!fs.existsSync(dir)) {
+
+- console.log(“:” + process.cwd());
+
+- console.log(“Error: newMinorVersion.mjs should be run from the
+ project root”);
+
+- console.log(“Example> node –experimental-modules
+ src/core/config/scripts/newMinorVersion.mjs”);
+
+- process.exit(1);
+
++import { execSync } from “child_process”;
+
+-
+
++const ignoredAuthors = [“github-advanced-security[bot]”,
+“dependabot[bot]”];
+
+-
+
++async function main() {
+
+- const dir = path.join(process.cwd() + “/src/core/config/”);
+
+- if (!fs.existsSync(dir)) {
+
+- console.log("\nCWD: " + process.cwd());
+
+- console.log(
+
+- "Error: newMinorVersion.mjs should be run from the project root",
+
+- );
+
+- console.log(
+
+- "Example> node --experimental-modules src/core/config/scripts/newMinorVersion.mjs",
+
+- );
+
+- process.exit(1);
+
+- }
+
+-
+
+- let changelogData = fs.readFileSync(
+
+- path.join(process.cwd(), "CHANGELOG.md"),
+
+- "utf8",
+
+- );
+
+- const lastVersion = changelogData.match(
+
+- /## Details\s+### \[(\d+)\.(\d+)\.(\d+)\]/,
+
+- );
+
+- const newVersion = [
+
+- parseInt(lastVersion[1], 10),
+
+- parseInt(lastVersion[2], 10) + 1,
+
+- 0,
+
+- ];
+
+-
+
+- let knownContributors = changelogData.match(/^[@([^\]]+)]/gm);
+
+- knownContributors = knownContributors.map((c) => c.slice(2, -1));
+
+-
+
+- const date = new Date().toISOString().split(“T”)[0];
+
+-
+
+- const lastVersionSha = execSync(
+
+- `git rev-list -n 1 v${lastVersion[1]}.${lastVersion[2]}.${lastVersion[3]}`,
+
+- {
+
+- encoding: "utf8",
+
+- },
+
+- ).trim();
+
+- if (lastVersionSha.length !== 40) {
+
+- throw new Error(
+
+- `Unexpected output from git rev-list: ${lastVersionSha}`,
+
+- );
+
+- }
+
+-
+
+- const features = [];
+
+-
+
+- const commits = await (
+
+- await fetch(`https://api.github.com/repos/gchq/cyberchef/commits`)
+
+- ).json();
+
+- let foundLast = false;
+
+- for (const commit of commits) {
+
+- if (commit.sha === lastVersionSha) {
+
+- foundLast = true;
+
+- break;
+
+- } else {
+
+- const feature = {
+
+- message: "",
+
+- authors: [],
+
+- id: "",
+
+- };
+
+-
+
+- const msgparts = commit.commit.message.split("\n\n");
+
+- feature.message = msgparts[0];
+
+- const prIdMatch = feature.message.match(/\(#(\d+)\)$/);
+
+- if (prIdMatch !== null) {
+
+- feature.message = feature.message
+
+- .replace(prIdMatch[0], "")
+
+- .trim();
+
+- feature.id = prIdMatch[1];
+
+- }
+
+-
+
+- if (!ignoredAuthors.includes(commit.author.login)) {
+
+- feature.authors.push(commit.author.login);
+
+- }
+
+-
+
+- if (msgparts.length > 1) {
+
+- msgparts[1]
+
+- .split("\n")
+
+- .filter((line) => line.startsWith("Co-authored-by: "))
+
+- .forEach((line) => {
+
+- let coAuthor = line.slice("Co-authored-by: ".length);
+
+- if (coAuthor.indexOf(">") !== -1) {
+
+- const email = coAuthor.slice(
+
+- coAuthor.indexOf("<") + 1,
+
+- coAuthor.indexOf(">"),
+
+- );
+
+- if (email.endsWith("@users.noreply.github.com")) {
+
+- coAuthor = email.slice(
+
+- email.indexOf("+") + 1,
+
+- -"@users.noreply.github.com".length,
+
+- );
+
+- } else {
+
+- throw new Error(
+
+- "Could not get ID of co-author: " +
+
+- coAuthor,
+
+- );
+
+- }
+
+- } else {
+
+- throw new Error(
+
+- "Could not get email of co-author: " + coAuthor,
+
+- );
+
+- }
+
+- if (!ignoredAuthors.includes(coAuthor)) {
+
+- feature.authors.push(coAuthor);
+
+- }
+
+- });
+
+- }
+
+-
+
+- features.push(feature);
+
+- }
+
+- }
+
+- if (!foundLast) {
+
+- throw new Error(
+
+- `Could not find last version commit: ${lastVersionSha} - need to add paging functionality`,
+
+- );
+
+- }
+
+-
+
+- let message =
+ ### [${newVersion[0]}.${newVersion[1]}.${newVersion[2]}] - ${date}\n;
+
+-
+
+- const authors = [];
+
+- const prIDs = [];
+
+- const commitIDs = [];
+
+-
+
+- features.forEach((feature) => {
+
+- const id =
+
+- feature.id.length > 10 ? feature.id.slice(0, 7) : "#" + feature.id;
+
+- message += `- ${feature.message} ${feature.authors.map((a) => `[@${a}]`).join(" ")} | [${id}]\n`;
+
+-
+
+- feature.authors.forEach((author) => {
+
+- if (!knownContributors.includes(author)) {
+
+- knownContributors.push(author);
+
+- authors.push(`[@${author}]: https://github.com/${author}`);
+
+- }
+
+- });
+
+-
+
+- if (feature.id.length > 10) {
+
+- commitIDs.push(
+
+- `[${id}]: https://github.com/gchq/CyberChef/commit/${feature.id}`,
+
+- );
+
+- } else {
+
+- prIDs.push(
+
+- `[#${feature.id}]: https://github.com/gchq/CyberChef/pull/${feature.id}`,
+
+- );
+
+- }
+
+- });
+
+-
+
+- // Message
+
+- changelogData = changelogData.replace(
+
+- /## Details\n\n/,
+
+- "## Details\n\n" + message + "\n",
+
+- );
+
+-
+
+- // Tag
+
+- const newTag =
+ [${newVersion[0]}.${newVersion[1]}.${newVersion[2]}]: https://github.com/gchq/CyberChef/releases/tag/v${newVersion[0]}.${newVersion[1]}.${newVersion[2]}\n;
+
+- changelogData = changelogData.replace(
+
+- /\n\n(\[\d+\.\d+\.\d+\]: https)/,
+
+- "\n\n" + newTag + "$1",
+
+- );
+
+-
+
+- // Author
+
+- authors.forEach((author) => {
+
+- changelogData = changelogData.replace(
+
+- /(\n\[@[^\]]+\]: https:\/\/github\.com\/[^\n]+\n)\n/,
+
+- "$1" + author + "\n\n",
+
+- );
+
+- });
+
+-
+
+- // Commit IDs
+
+- commitIDs.forEach((commitID) => {
+
+- changelogData = changelogData.replace(
+
+- /(\n\[[^\].]+\]: https:\/\/github.com\/gchq\/CyberChef\/commit\/[^\n]+\n)\n/,
+
+- "$1" + commitID + "\n\n",
+
+- );
+
+- });
+
+-
+
+- // PR IDs
+
+- prIDs.forEach((prID) => {
+
+- changelogData = changelogData.replace(
+
+- /(\n\[#[^\]]+\]: https:\/\/github.com\/gchq\/CyberChef\/(?:pull|issues)\/[^\n]+\n)\n*$/,
+
+- "$1" + prID + "\n\n",
+
+- );
+
+- });
+
+-
+
+- fs.writeFileSync(path.join(process.cwd(), “CHANGELOG.md”),
+ changelogData);
+
+}
+
+-
+
+-let changelogData = fs.readFileSync(path.join(process.cwd(),
+“CHANGELOG.md”), “utf8”);
+
+-const lastVersion = changelogData.match(/## Details+### [().().()]/);
+
+-const newVersion = [];
+
+-
+
+-let knownContributors = changelogData.match(/^[@([^\]]+)]/gm);
+
+-knownContributors = knownContributors.map(c => c.slice(2, -1));
+
+-
+
+-const date = (new Date()).toISOString().split(“T”)[0];
+
+-
+
+-const schema = {
+
+- properties: {
+
+- message: {
+
+- description: "A short but descriptive summary of a feature in this version",
+
+- example: "Added 'Op name' operation",
+
+- prompt: "Feature description",
+
+- type: "string",
+
+- required: true,
+
+- },
+
+- author: {
+
+- description: "The author of the feature (only one supported, edit manually to add more)",
+
+- example: "n1474335",
+
+- prompt: "Author",
+
+- type: "string",
+
+- default: "n1474335"
+
+- },
+
+- id: {
+
+- description: "The PR number or full commit hash for this feature.",
+
+- example: "1200",
+
+- prompt: "Pull request or commit ID",
+
+- type: "string"
+
+- },
+
+- another: {
+
+- description: "y/n",
+
+- example: "y",
+
+- prompt: "Add another feature?",
+
+- type: "string",
+
+- pattern: /^[yn]$/,
+
+- }
+
+- }
+
+-};
+
+-
+
+-// Build schema
+
+-for (const prop in schema.properties) {
+
+- const p = schema.properties[prop];
+
+- p.description = “” + colors.white(p.description) + colors.cyan(“:” +
+ p.example) + “” + colors.green(p.prompt);
+
+-}
+
+-
+
+-prompt.message = ““;
+
+-prompt.delimiter = “:”.green;
+
+-
+
+-const features = [];
+
+-const authors = [];
+
+-const prIDs = [];
+
+-const commitIDs = [];
+
+-
+
+-prompt.start();
+
+-
+
+-const getFeature = function() {
+
+- prompt.get(schema, (err, result) => {
+
+- if (err) {
+
+- console.log("\nExiting script.");
+
+- process.exit(0);
+
+- }
+
+-
+
+- features.push(result);
+
+-
+
+- if (result.another === "y") {
+
+- getFeature();
+
+- } else {
+
+- let message = `### [${newVersion[0]}.${newVersion[1]}.${newVersion[2]}] - ${date}\n`;
+
+-
+
+- features.forEach(feature => {
+
+- const id = feature.id.length > 10 ? feature.id.slice(0, 7) : "#" + feature.id;
+
+- message += `- ${feature.message} [@${feature.author}] | [${id}]\n`;
+
+-
+
+- if (!knownContributors.includes(feature.author)) {
+
+- authors.push(`[@${feature.author}]: https://github.com/${feature.author}`);
+
+- }
+
+-
+
+- if (feature.id.length > 10) {
+
+- commitIDs.push(`[${id}]: https://github.com/gchq/CyberChef/commit/${feature.id}`);
+
+- } else {
+
+- prIDs.push(`[#${feature.id}]: https://github.com/gchq/CyberChef/pull/${feature.id}`);
+
+- }
+
+- });
+
+-
+
+- // Message
+
+- changelogData = changelogData.replace(/## Details\n\n/, "## Details\n\n" + message + "\n");
+
+-
+
+- // Tag
+
+- const newTag = `[${newVersion[0]}.${newVersion[1]}.${newVersion[2]}]: https://github.com/gchq/CyberChef/releases/tag/v${newVersion[0]}.${newVersion[1]}.${newVersion[2]}\n`;
+
+- changelogData = changelogData.replace(/\n\n(\[\d+\.\d+\.\d+\]: https)/, "\n\n" + newTag + "$1");
+
+-
+
+- // Author
+
+- authors.forEach(author => {
+
+- changelogData = changelogData.replace(/(\n\[@[^\]]+\]: https:\/\/github\.com\/[^\n]+\n)\n/, "$1" + author + "\n\n");
+
+- });
+
+-
+
+- // Commit IDs
+
+- commitIDs.forEach(commitID => {
+
+- changelogData = changelogData.replace(/(\n\[[^\].]+\]: https:\/\/github.com\/gchq\/CyberChef\/commit\/[^\n]+\n)\n/, "$1" + commitID + "\n\n");
+
+- });
+
+-
+
+- // PR IDs
+
+- prIDs.forEach(prID => {
+
+- changelogData = changelogData.replace(/(\n\[#[^\]]+\]: https:\/\/github.com\/gchq\/CyberChef\/pull\/[^\n]+\n)\n*$/, "$1" + prID + "\n\n");
+
+- });
+
+-
+
+- fs.writeFileSync(path.join(process.cwd(), "CHANGELOG.md"), changelogData);
+
+-
+
+- console.log("Written CHANGELOG.md\nCommit changes and then run `npm version minor`.");
+
+- }
+
+- });
+
+-};
+
+-
+
+-getFeature();
+
++main().catch(console.error);
+
+ADDED in gchq (missing in mkilijanek): src/core/lib/Bech32.mjs
+
+CHANGED: src/core/lib/Hex.mjs — mkilijanek/src/core/lib/Hex.mjs +++
+gchq/src/core/lib/Hex.mjs @@ -33,7 +33,7 @@ if (data instanceof
+ArrayBuffer) data = new Uint8Array(data);
+
+ let output = "";
+
+- const prepend = (delim === “0x” || delim === “\x”);
+
+- const prepend = (delim === “0x” || delim === “\x” || delim === “%”);
+
+ for (let i = 0; i < data.length; i++) {
+
+ const hex = data[i].toString(16).padStart(padding, "0");
+
+CHANGED: src/core/lib/JA4.mjs — mkilijanek/src/core/lib/JA4.mjs +++
+gchq/src/core/lib/JA4.mjs @@ -91,9 +91,7 @@ let alpn = “00”;
+
+ for (const ext of tlsr.handshake.value.extensions.value) {
+
+ if (ext.type.value === "application_layer_protocol_negotiation") {
+
+- alpn = parseFirstALPNValue(ext.value.data);
+
+- alpn = alpn.charAt(0) + alpn.charAt(alpn.length - 1);
+
+- if (alpn.charCodeAt(0) > 127) alpn = "99";
+
+- alpn = alpnFingerprint(parseFirstALPNValue(ext.value.data));
+
+ break;
+
+ }
+
+ }
+
+@@ -212,9 +210,7 @@ let alpn = “00”;
+
+ for (const ext of tlsr.handshake.value.extensions.value) {
+
+ if (ext.type.value === "application_layer_protocol_negotiation") {
+
+- alpn = parseFirstALPNValue(ext.value.data);
+
+- alpn = alpn.charAt(0) + alpn.charAt(alpn.length - 1);
+
+- if (alpn.charCodeAt(0) > 127) alpn = "99";
+
+- alpn = alpnFingerprint(parseFirstALPNValue(ext.value.data));
+
+ break;
+
+ }
+
+ }
+
+@@ -262,3 +258,33 @@ default: return “00”; // Unknown
+
+ }
+
+}
+
+-
+
++/**
+
+- - Checks if a byte is ASCII alphanumeric (0-9, A-Z, a-z).
+
+- - @param {number} byte
+
+- - @returns {boolean}
+
+- */
+
++function isAlphanumeric(byte) {
+
+- return (byte >= 0x30 && byte <= 0x39) ||
+
+- (byte >= 0x41 && byte <= 0x5A) ||
+
+- (byte >= 0x61 && byte <= 0x7A);
+
++}
+
+-
+
++/**
+
+- - Computes the 2-character ALPN fingerprint from raw ALPN bytes.
+
+- - If both first and last bytes are ASCII alphanumeric, returns
+ their characters.
+
+- - Otherwise, returns first hex digit of first byte + last hex
+ digit of last byte.
+
+- - @param {Uint8Array|null} rawBytes
+
+- - @returns {string}
+
+- */
+
++function alpnFingerprint(rawBytes) {
+
+- if (!rawBytes || rawBytes.length === 0) return “00”;
+
+- const firstByte = rawBytes[0];
+
+- const lastByte = rawBytes[rawBytes.length - 1];
+
+- if (isAlphanumeric(firstByte) && isAlphanumeric(lastByte)) {
+
+- return String.fromCharCode(firstByte) + String.fromCharCode(lastByte);
+
+- }
+
+- const firstHex = firstByte.toString(16).padStart(2, “0”);
+
+- const lastHex = lastByte.toString(16).padStart(2, “0”);
+
+- return firstHex[0] + lastHex[1];
+
++}
+
+CHANGED: src/core/lib/LS47.mjs — mkilijanek/src/core/lib/LS47.mjs +++
+gchq/src/core/lib/LS47.mjs @@ -223,19 +223,8 @@ initTiles();
+
+ checkKey(key);
+
+ let padding = "";
+
+-
+
+- // Use cryptographically secure random if available, otherwise
+ fallback to Math.random
+
+- const getSecureRandom = () => {
+
+- if (typeof crypto !== "undefined" && crypto.getRandomValues) {
+
+- const array = new Uint32Array(1);
+
+- crypto.getRandomValues(array);
+
+- return array[0] / (0xFFFFFFFF + 1);
+
+- }
+
+- return Math.random();
+
+- };
+
+- for (let i = 0; i < paddingSize; i++) {
+
+- padding += letters.charAt(Math.floor(getSecureRandom() * letters.length));
+
+- padding += letters.charAt(Math.floor(Math.random() * letters.length));
+
+ }
+
+ return encrypt(key, padding+plaintext+“—”+signature);
+
+}
+
+CHANGED: src/core/lib/TLS.mjs — mkilijanek/src/core/lib/TLS.mjs +++
+gchq/src/core/lib/TLS.mjs @@ -247,7 +247,7 @@ description: “Selected
+Compression Method”,
+
+ length: 1,
+
+ data: b.getBytes(1),
+
+- value: COMPRESSION_METHODS_LOOKUP[s.readInt(1)] || "Unknown"
+
+- value: s.readInt(1) // TODO: Compression method name here
+
+ };
+
+ // Extensions Length
+
+@@ -303,7 +303,7 @@ description: “Compression Method”,
+
+ length: 1,
+
+ data: b.getBytes(1),
+
+- value: COMPRESSION_METHODS_LOOKUP[s.readInt(1)] || "Unknown"
+
+- value: s.readInt(1) // TODO: Compression method name here
+
+ });
+
+ }
+
+ return cm;
+
+@@ -837,15 +837,6 @@ ];
+
+/**
+
+- - Compression methods lookup table
+
+- */
+
+-const COMPRESSION_METHODS_LOOKUP = {
+
+- 0: “null”,
+
+- 1: “DEFLATE”,
+
+- 64: “LZS”
+
+-};
+
+-
+
+-/**
+
+- Parses the supported_versions extension and returns the highest
+ supported version.
+
+- @param {Uint8Array} bytes
+
+- @returns {number}
+
+@@ -872,15 +863,15 @@ }
+
+/**
+
+- - Parses the application_layer_protocol_negotiation extension and
+ returns the first value.
+
+- - Parses the application_layer_protocol_negotiation extension and
+ returns the first value as raw bytes.
+
+ - @param {Uint8Array} bytes
+
+- - @returns {number}
+
+- - @returns {Uint8Array|null}
+
+ */
+
+export function parseFirstALPNValue(bytes) {
+
+ const s = new Stream(bytes);
+
+ const alpnExtLen = s.readInt(2);
+
+- if (alpnExtLen < 3) return “00”;
+
+- if (alpnExtLen < 2) return null;
+
+ const strLen = s.readInt(1);
+
+- if (strLen < 2) return “00”;
+
+- return s.readString(strLen);
+
+- if (strLen < 1) return null;
+
+- return s.getBytes(strLen);
+
+}
+
+ADDED in gchq (missing in mkilijanek):
+src/core/operations/FromBech32.mjs
+
+CHANGED: src/core/operations/FromHexdump.mjs —
+mkilijanek/src/core/operations/FromHexdump.mjs +++
+gchq/src/core/operations/FromHexdump.mjs @@ -43,7 +43,7 @@ */
+
+ run(input, args) {
+
+ const output = [],
+
+- regex = /^\s*(?:[\dA-F]{4,16}h?:?)?[ \t]+((?:[\dA-F]{2} ){1,8}(?:[ \t]|[\dA-F]{2}-)(?:[\dA-F]{2} ){1,8}|(?:[\dA-F]{4} )*[\dA-F]{4}|(?:[\dA-F]{2} )*[\dA-F]{2})/igm;
+
+- regex = /^\s*(?:[\dA-F]{4,16}h?:?)?[ \t]+((?:[\dA-F]{2} ){1,8}(?:[ \t]|[\dA-F]{2}-)(?:[\dA-F]{2} ){1,8}|(?:[\dA-F]{4} )+(?:[\dA-F]{2})?|(?:[\dA-F]{2} )*[\dA-F]{2})/igm;
+
+ let block, line;
+
+
+
+ while ((block = regex.exec(input))) {
+
+CHANGED: src/core/operations/FromQuotedPrintable.mjs —
+mkilijanek/src/core/operations/FromQuotedPrintable.mjs +++
+gchq/src/core/operations/FromQuotedPrintable.mjs @@ -23,7 +23,7 @@
+
+ this.name = "From Quoted Printable";
+
+ this.module = "Default";
+
+- this.description = "Converts QP-encoded text back to standard text.
e.g. The quoted-printable encoded string hello=20world becomes hello world";
+
+- this.description = "Converts QP-encoded text back to standard text. This format is a content transfer encoding common in email messages.
e.g. The quoted-printable encoded string hello=20world becomes hello world";
+
+ this.infoURL = "https://wikipedia.org/wiki/Quoted-printable";
+
+ this.inputType = "string";
+
+ this.outputType = "byteArray";
+
+CHANGED: src/core/operations/ToBase85.mjs —
+mkilijanek/src/core/operations/ToBase85.mjs +++
+gchq/src/core/operations/ToBase85.mjs @@ -33,7 +33,7 @@ value:
+ALPHABET_OPTIONS
+
+ },
+
+ {
+
+- name: "Include delimeter",
+
+- name: "Include delimiter",
+
+ type: "boolean",
+
+ value: false
+
+ }
+
+ADDED in gchq (missing in mkilijanek): src/core/operations/ToBech32.mjs
+
+CHANGED: src/core/operations/ToQuotedPrintable.mjs —
+mkilijanek/src/core/operations/ToQuotedPrintable.mjs +++
+gchq/src/core/operations/ToQuotedPrintable.mjs @@ -23,7 +23,7 @@
+
+ this.name = "To Quoted Printable";
+
+ this.module = "Default";
+
+- this.description = "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.
QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length.";
+
+- this.description = "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in email.
QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length.";
+
+ this.infoURL = "https://wikipedia.org/wiki/Quoted-printable";
+
+ this.inputType = "ArrayBuffer";
+
+ this.outputType = "string";
+
+CHANGED: src/core/vendor/gost/gostRandom.mjs —
+mkilijanek/src/core/vendor/gost/gostRandom.mjs +++
+gchq/src/core/vendor/gost/gostRandom.mjs @@ -114,10 +114,7 @@ // Native
+window cryptographic interface
+
+ rootCrypto.getRandomValues(u8);
+
+ } else {
+
+- // Standard Javascript method - WARNING: Not cryptographically secure!
+
+- if (typeof console !== "undefined" && console.warn) {
+
+- console.warn("SECURITY WARNING: crypto.getRandomValues not available, falling back to Math.random() which is NOT cryptographically secure!");
+
+- }
+
+- // Standard Javascript method
+
+ for (var i = 0, n = u8.length; i < n; i++)
+
+ u8[i] = Math.floor(256 * Math.random()) & 255;
+
+ }
+
+CHANGED: src/node/apiUtils.mjs — mkilijanek/src/node/apiUtils.mjs +++
+gchq/src/node/apiUtils.mjs @@ -66,7 +66,7 @@ * @param str
+
+*/
+
+export function sanitise(str) {
+
+- return str.replace(/ /g, ““).toLowerCase();
+
+- return str.replace(/[/.-]/g, ““).toLowerCase();
+
+}
+
+CHANGED: src/web/App.mjs — mkilijanek/src/web/App.mjs +++
+gchq/src/web/App.mjs @@ -650,7 +650,7 @@
+
+ // const compareURL = `https://github.com/gchq/CyberChef/compare/v${prev.join(".")}...v${PKG_VERSION}`;
+
+- let compileInfo = `Last build: ${timeSinceCompile.substr(0, 1).toUpperCase() + timeSinceCompile.substr(1)} ago`;
+
+- let compileInfo = `Last build: ${timeSinceCompile.substring(0, 1).toUpperCase() + timeSinceCompile.substring(1)} ago`;
+
+
+
+ if (window.compileMessage !== "") {
+
+ compileInfo += " - " + window.compileMessage;
+
+CHANGED: src/web/static/sitemap.mjs —
+mkilijanek/src/web/static/sitemap.mjs +++
+gchq/src/web/static/sitemap.mjs @@ -1,6 +1,5 @@ import sm from
+“sitemap”;
+
+-import OperationConfig from “../../core/config/OperationConfig.json”
+assert {type: “json”};
+
+-
+
++import OperationConfig from “../../core/config/OperationConfig.json”
+assert { type: “json” };
+
+/**
+
+- Generates an XML sitemap for all CyberChef operations and a number
+ of recipes.
+
+@@ -10,25 +9,25 @@ * @license Apache-2.0
+
+*/
+
+-const smStream = new sm.SitemapStream({
+
+- hostname: “https://gchq.github.io/CyberChef”,
+
+-});
+
++const baseUrl = “https://gchq.github.io/CyberChef/”;
+
+-
+
++const smStream = new sm.SitemapStream({});
+
+smStream.write({
+
+- url: “/”,
+
+- url: baseUrl,
+
+ changefreq: “weekly”,
+
+- priority: 1.0
+
+- priority: 1.0,
+
+});
+
+for (const op in OperationConfig) {
+
+ smStream.write({
+
+- url: `/?op=${encodeURIComponent(op)}`,
+
+- url: `${baseUrl}?op=${encodeURIComponent(op)}`,
+
+ changeFreq: "yearly",
+
+- priority: 0.5
+
+- priority: 0.5,
+
+ });
+
+}
+
+smStream.end();
+
+sm.streamToPromise(smStream).then(
+
+- buffer => console.log(buffer.toString()) // eslint-disable-line
+ no-console
+
+- (buffer) => console.log(buffer.toString()), // eslint-disable-line
+ no-console
+
+);
+
+CHANGED: src/web/waiters/InputWaiter.mjs —
+mkilijanek/src/web/waiters/InputWaiter.mjs +++
+gchq/src/web/waiters/InputWaiter.mjs @@ -151,8 +151,20 @@ // Event
+handlers
+
+ EditorView.domEventHandlers({
+
+ paste(event, view) {
+
+- const clipboardData = event.clipboardData;
+
+- const items = clipboardData.items;
+
+- const files = [];
+
+- for (let i = 0; i < items.length; i++) {
+
+- const item = items[i];
+
+- if (item.kind === "file") {
+
+- const file = item.getAsFile();
+
+- files.push(file);
+
+-
+
+- event.preventDefault(); // Prevent the default paste behavior
+
+- }
+
+- }
+
+ setTimeout(() => {
+
+- self.afterPaste(event);
+
+- self.afterPaste(files);
+
+ });
+
+ }
+
+ })
+
+@@ -914,9 +926,12 @@ * Handler that fires just after input paste events.
+
+ * Checks whether the EOL separator or character encoding should be updated.
+
+ *
+
+- * @param {event} e
+
+- */
+
+- afterPaste(e) {
+
+- * @param {File[]} files - An array of any files that were included in the paste event
+
+- */
+
+- afterPaste(files) {
+
+- if (files.length > 0) {
+
+- this.loadUIFiles(files);
+
+- }
+
+ // If EOL has been fixed, skip this.
+
+ if (this.eolState > 1) return;
+
+CHANGED: src/web/workers/DishWorker.mjs —
+mkilijanek/src/web/workers/DishWorker.mjs +++
+gchq/src/web/workers/DishWorker.mjs @@ -7,6 +7,8 @@ */
+
+import Dish from “../../core/Dish.mjs”;
+
++import DishError from “../../core/errors/DishError.mjs”;
+
++import { CHR_ENC_SIMPLE_REVERSE_LOOKUP } from
+“../../core/lib/ChrEnc.mjs”;
+
+import Utils from “../../core/Utils.mjs”;
+
+import cptable from “codepage”;
+
+import loglevelMessagePrefix from “loglevel-message-prefix”;
+
+@@ -98,7 +100,7 @@ try {
+
+ str = cptable.utils.decode(data.encoding, new Uint8Array(data.buffer));
+
+ } catch (err) {
+
+- str = err;
+
+- str = new DishError(`Error decoding buffer with encoding ${CHR_ENC_SIMPLE_REVERSE_LOOKUP[data.encoding]}: ${err.message}`).toString();
+
+ }
+
+ }
+
+CHANGED: tests/node/tests/Utils.mjs —
+mkilijanek/tests/node/tests/Utils.mjs +++
+gchq/tests/node/tests/Utils.mjs @@ -20,4 +20,10 @@
+assert.equal(Utils.parseEscapedChars(“\\\‘“),”\’”);
+
+ }),
+
+- it(“Utils: should replace delete character”, () => {
+
+- assert.equal(
+
+- Utils.printable("\x7e\x7f\x80\xa7", false, true),
+
+- "\x7e...",
+
+- );
+
+- }),
+
+]);
+
+CHANGED: tests/node/tests/nodeApi.mjs —
+mkilijanek/tests/node/tests/nodeApi.mjs +++
+gchq/tests/node/tests/nodeApi.mjs @@ -343,6 +343,42 @@ “args”: [false] }
+
+ ]);
+
+ assert.strictEqual(result.toString(), "begin_something_aaaaaaaaaaaaaa_end_something");
+
+- }),
+
+-
+
+- it(“chef.bake: should accept operation names from Chef Website which
+ contain forward slash”, () => {
+
+- const result = chef.bake("I'll have the test salmon", [
+
+- { "op": "Find / Replace",
+
+- "args": [{ "option": "Regex", "string": "test" }, "good", true, false, true, false]}
+
+- ]);
+
+- assert.strictEqual(result.toString(), "I'll have the good salmon");
+
+- }),
+
+-
+
+- it(“chef.bake: should accept operation names from Chef Website which
+ contain a hyphen”, () => {
+
+- const result = chef.bake("I'll have the test salmon", [
+
+- { "op": "Adler-32 Checksum",
+
+- "args": [] }
+
+- ]);
+
+- assert.strictEqual(result.toString(), "6e4208f8");
+
+- }),
+
+-
+
+- it(“chef.bake: should accept operation names from Chef Website which
+ contain a period”, () => {
+
+- const result = chef.bake("30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f", [
+
+- { "op": "Parse ASN.1 hex string",
+
+- "args": [0, 32] }
+
+- ]);
+
+- assert.strictEqual(result.toString(), `SEQUENCE
+
+- INTEGER 05
+
+- IA5String ‘Anybody there?’
+
++`);
+
+- }),
+
+-
+
+- it(“Excluded operations: throw a sensible error when you try and
+ call one”, () => {
+
+- try {
+
+- chef.fork();
+
+- } catch (e) {
+
+- assert.strictEqual(e.type, "ExcludedOperationError");
+
+- assert.strictEqual(e.message, "Sorry, the Fork operation is not available in the Node.js version of CyberChef.");
+
+- }
+
+ }),
+
+ it(“chef.bake: cannot accept flowControl operations in recipe”, ()
+ => {
+
+CHANGED: tests/operations/index.mjs —
+mkilijanek/tests/operations/index.mjs +++
+gchq/tests/operations/index.mjs @@ -26,6 +26,7 @@ import
+“./tests/Base85.mjs”;
+
+import “./tests/Base92.mjs”;
+
+import “./tests/BCD.mjs”;
+
++import “./tests/Bech32.mjs”;
+
+import “./tests/BitwiseOp.mjs”;
+
+import “./tests/BLAKE2b.mjs”;
+
+import “./tests/BLAKE2s.mjs”;
+
+ADDED in gchq (missing in mkilijanek): tests/operations/tests/Bech32.mjs
+
+CHANGED: tests/operations/tests/Code.mjs —
+mkilijanek/tests/operations/tests/Code.mjs +++
+gchq/tests/operations/tests/Code.mjs @@ -322,8 +322,21 @@ ]
+
+ }
+
+ ],
+
+- expectedMatch: /^Invalid JPath expression: jsonPath: self is not defined:/
+
+- },
+
+- expectedMatch: /^Invalid JPath expression: Unexpected "{" at character 1/
+
+- },
+
+- {
+
+- name: "JPath Expression: Script-based RCE",
+
+- input: "[{}]",
+
+- recipeConfig: [
+
+- {
+
+- "op": "JPath expression",
+
+- "args": [
+
+- "$..[?(p=\"console.log(this.process.mainModule.require('child_process').execSync('id').toString())\";a=''[['constructor']][['constructor']](p);a())]",
+
+- "\n"
+
+- ]
+
+- }
+
+- ],
+
+- expectedMatch: /^Invalid JPath expression: jsonPath: Cannot read properties of {2}\(reading 'constructor'\): / },
+
+ {
+
+ name: "CSS selector",
+
+ input: '
hello
\nworld
\nagain
\n